Package: libgksu
Severity: wishlist
Tags: patch
User: [EMAIL PROTECTED]
Usertags: origin-ubuntu hardy ubuntu-patch

Hi,

attached is a patch that makes the buffer in gksu-run-helper grow
dynamically. This is a problem for very long commands, see LP #173757
for a example command that fails
(https://bugs.edge.launchpad.net/ubuntu/+source/libgksu/+bug/173757).

Cheers,
 Michael

=== modified file 'libgksu/gksu-run-helper.c'
--- libgksu/gksu-run-helper.c	2008-06-10 14:14:50 +0000
+++ libgksu/gksu-run-helper.c	2008-06-11 12:25:55 +0000
@@ -63,6 +63,21 @@
 	     dirname, strerror (errno));
 }
 
+void read_gstring_from_stdin(GString *s)
+{
+  gchar buffer[255];
+  char *readp;
+  do
+  {
+     readp = fgets(buffer, sizeof(buffer), stdin);
+     if(readp == NULL)
+	return;
+     strip (buffer);
+     g_string_append(s, buffer);
+  } while (sizeof(buffer)-1 == strlen(readp));
+  return;
+}
+
 int
 main (int argc, char **argv)
 {
@@ -79,8 +94,6 @@
   gchar *xauth_token = NULL;
   gchar *sn_id = NULL;
 
-  gchar buffer[255];
-
   gint return_code;
 
   if (argc < 2)
@@ -101,24 +114,22 @@
   xauth_file = g_strdup_printf ("%s/.Xauthority",
 				xauth_dir);
 
-  fgets (buffer, 255, stdin);
-  strip (buffer);
+  GString *s = g_string_sized_new(255);
+  read_gstring_from_stdin(s);
 
   /* strlen ("gksu-run: ") == 10, see su.c */
-  xauth_display = g_strdup_printf ("%s", buffer + 10);
-
-  bzero (buffer, 255);
-  fgets (buffer, 255, stdin);
-  strip (buffer);
-
-  sn_id = g_strdup_printf ("%s", buffer + 10);
+  xauth_display = g_strdup_printf ("%s", s->str + 10);
+
+  s = g_string_truncate(s,0);
+  read_gstring_from_stdin(s);
+
+  sn_id = g_strdup_printf ("%s", s->str + 10);
   setenv("DESKTOP_STARTUP_ID", sn_id, TRUE);
 
-  bzero (buffer, 255);
-  fgets (buffer, 255, stdin);
-  strip (buffer);
+  s = g_string_truncate(s,0);
+  read_gstring_from_stdin(s);
 
-  xauth_token = g_strdup_printf ("%s", buffer + 10);
+  xauth_token = g_strdup_printf ("%s", s->str + 10);
 
   /* a bit more security is always fine */
   {
@@ -161,6 +172,7 @@
     return_code = system (argv[1]);
     
     clean_dir (xauth_dir);
+    g_string_free(s, TRUE);
     return return_code;
   }
 }

Reply via email to