[Pkg-utopia-maintainers] Bug#521756: policykit: FTBFS on systems without inotify

Samuel Thibault samuel.thibault at ens-lyon.org
Tue Apr 14 21:41:06 UTC 2009


There was a missing bit, here is an updated patch.

Samuel
-------------- next part --------------
--- src/polkit/polkit-context.c.orig	2009-03-29 13:36:48.000000000 +0100
+++ src/polkit/polkit-context.c	2009-03-29 13:39:23.230000000 +0100
@@ -308,7 +308,7 @@
 			goto error;
 		}
 	}
-#else
+#elif defined(HAVE_INOTIFY)
         if (pk_context->io_add_watch_func != NULL) {
                 pk_context->inotify_fd = inotify_init ();
                 if (pk_context->inotify_fd < 0) {
@@ -571,7 +571,7 @@
 			polkit_debug ("failed to read kqueue event: %s", strerror (errno));
 		}
 	}
-#else
+#elif defined(HAVE_INOTIFY)
         if (fd == pk_context->inotify_fd) {
 /* size of the event structure, not counting name */
 #define EVENT_SIZE  (sizeof (struct inotify_event))
--- src/polkit/polkit-authorization-constraint.c.orig	2009-03-29 13:45:10.330000000 +0100
+++ src/polkit/polkit-authorization-constraint.c	2009-03-29 14:32:42.490000000 +0100
@@ -256,7 +256,6 @@
         int n;
         pid_t pid;
         char *selinux_context;
-        char buf[PATH_MAX];
         polkit_bool_t ret;
         PolKitSession *session;
 
@@ -278,19 +277,33 @@
 
         case POLKIT_AUTHORIZATION_CONSTRAINT_TYPE_REQUIRE_EXE:
                 if (polkit_caller_get_pid (caller, &pid)) {
+                        int allocated = 128;
+                        char *buf;
+
+retry:
+                        if (!(buf = kit_malloc(allocated)))
+                                break;
 
                         /* we may be running unprivileged.. so optionally use the helper. Requires the calling
                          * process (this one) to have the org.freedesktop.policykit.read authorization.
                          *
                          * An example of this is HAL (running as user 'haldaemon').
                          */
-                        n = polkit_sysdeps_get_exe_for_pid_with_helper (pid, buf, sizeof (buf));
+                        n = polkit_sysdeps_get_exe_for_pid_with_helper (pid, buf, allocated);
+
+                        if (n >= allocated) {
+                                kit_free(buf);
+                                allocated *= 2;
+                                goto retry;
+                        }
 
-                        if (n != -1 && n < (int) sizeof (buf)) {
+                        if (n != -1) {
                                 if (strcmp (authc->data.exe.path, buf) == 0) {
                                         ret = TRUE;
                                 }
                         }
+
+                        kit_free(buf);
                 }
 
                 break;
@@ -584,7 +597,6 @@
         polkit_bool_t is_local;
         polkit_bool_t is_active;
         PolKitSession *session;
-        char path[PATH_MAX];
         int n;
 
         kit_return_val_if_fail (caller != NULL, 0);
@@ -613,6 +625,13 @@
 
         /* constrain to callers program */
         if (polkit_caller_get_pid (caller, &pid)) {
+                int allocated = 128;
+                char *path;
+
+retry:
+                if (!(path = kit_malloc(allocated)))
+                        goto oom;
+
                 /* So the program to receive a constraint may besetuid root... so we may need some
                  * help to get the exepath.. Therefore use _with_helper().
                  *
@@ -621,8 +640,15 @@
                  *
                  * An example of this is pulseaudio...
                  */
-                n = polkit_sysdeps_get_exe_for_pid_with_helper (pid, path, sizeof (path));
-                if (n != -1 && n < (int) sizeof (path)) {
+                n = polkit_sysdeps_get_exe_for_pid_with_helper (pid, path, allocated);
+
+                if (n >= allocated) {
+                        kit_free(path);
+                        allocated *= 2;
+                        goto retry;
+                }
+
+                if (n != -1) {
                         PolKitAuthorizationConstraint *c;
 
                         c = polkit_authorization_constraint_get_require_exe (path);
@@ -634,6 +660,8 @@
 
                         ret++;
                 }
+
+                kit_free(path);
         }
 
         /* constrain to callers SELinux context */
--- src/polkit-dbus/polkit-read-auth-helper.c.orig	2009-03-30 00:17:28.300000000 +0100
+++ src/polkit-dbus/polkit-read-auth-helper.c	2009-03-30 00:30:09.770000000 +0100
@@ -190,8 +190,8 @@
                 uid_t uid;
                 size_t name_len;
                 char *filename;
-                char username[PATH_MAX];
-                char path[PATH_MAX];
+                char *username;
+                char path[strlen(root) + 1 + strlen(d->d_name) + 1];
                 static const char suffix[] = ".auths";
                 struct passwd *pw;
                 struct stat statbuf;
@@ -199,10 +199,7 @@
                 if (d->d_name == NULL)
                         continue;
 
-                if (snprintf (path, sizeof (path), "%s/%s", root, d->d_name) >= (int) sizeof (path)) {
-                        fprintf (stderr, "polkit-read-auth-helper: string was truncated (1)\n");
-                        goto out;
-                }
+                sprintf (path, "%s/%s", root, d->d_name);
 
                 if (stat (path, &statbuf) != 0) {
                         fprintf (stderr, "polkit-read-auth-helper: cannot stat %s: %m\n", path);
@@ -240,8 +237,9 @@
                         fprintf (stderr, "polkit-read-auth-helper: file name '%s' is malformed (2)\n", filename);
                         continue;
                 }
-                if (n - m > sizeof (username) - 1) {
-                        fprintf (stderr, "polkit-read-auth-helper: file name '%s' is malformed (3)\n", filename);
+                username = kit_malloc (n - m + 1);
+                if (!username) {
+                        fprintf (stderr, "polkit-read-auth-helper: out of memory\n");
                         continue;
                 }
                 strncpy (username, filename + m, n - m);
@@ -250,8 +248,10 @@
                 pw = kit_getpwnam (username);
                 if (pw == NULL) {
                         fprintf (stderr, "polkit-read-auth-helper: cannot look up uid for username %s\n", username);
+                        free(username);
                         continue;
                 }
+                free(username);
                 uid = pw->pw_uid;
                 
                 if (!dump_auths_from_file (path, uid))
--- tools/polkit-auth.c.orig	2009-03-30 00:31:21.000000000 +0100
+++ tools/polkit-auth.c	2009-03-30 00:37:19.700000000 +0100
@@ -527,7 +527,6 @@
                 polkit_uint64_t pid_start_time;
                 PolKitAction *pk_action;
                 PolKitResult pk_result;
-                char exe[PATH_MAX];
 
                 printf ("%s\n", action_id);
 
@@ -539,17 +538,33 @@
 
                 switch (polkit_authorization_get_scope (auth)) {
                 case POLKIT_AUTHORIZATION_SCOPE_PROCESS_ONE_SHOT:
-                case POLKIT_AUTHORIZATION_SCOPE_PROCESS:
+                case POLKIT_AUTHORIZATION_SCOPE_PROCESS: {
+                        char *exe;
+                        int allocated = 128, len;
                         polkit_authorization_scope_process_get_pid (auth, &pid, &pid_start_time);
-                        if (polkit_sysdeps_get_exe_for_pid (pid, exe, sizeof (exe)) == -1)
-                                strncpy (exe, "unknown", sizeof (exe));
+retry:
+                        exe = malloc (allocated);
+                        len = polkit_sysdeps_get_exe_for_pid (pid, exe, allocated);
+
+                        if (len >= allocated) {
+                                free (exe);
+                                allocated *= 2;
+                                exe = malloc(allocated);
+                                goto retry;
+                        }
+
+                        if (len == -1)
+                                strncpy (exe, "unknown", allocated);
 
                         if (polkit_authorization_get_scope (auth) == POLKIT_AUTHORIZATION_SCOPE_PROCESS_ONE_SHOT) {
                                 printf ("  Scope:       Confined to single shot from pid %d (%s)\n", pid, exe);
                         } else {
                                 printf ("  Scope:       Confined to pid %d (%s)\n", pid, exe);
                         }
+
+                        free(exe);
                         break;
+                }
                 case POLKIT_AUTHORIZATION_SCOPE_SESSION:
                         printf ("  Scope:       Confined to session %s\n", polkit_authorization_scope_session_get_ck_objref (auth));
                         break;
--- src/polkit-dbus/polkit-resolve-exe-helper.c.orig	2009-04-14 21:02:41.000000000 +0000
+++ src/polkit-dbus/polkit-resolve-exe-helper.c	2009-04-14 21:18:43.000000000 +0000
@@ -58,7 +58,6 @@
 
 #ifdef HAVE_SOLARIS
 #define LOG_AUTHPRIV	(10<<3)
-#define PATH_MAX	1024
 #endif
 
 int
@@ -73,7 +72,8 @@
         gid_t egid;
         struct group *group;
         int n;
-        char buf[PATH_MAX];
+        char *buf;
+        ssize_t allocated;
         polkit_bool_t is_setgid_polkit;
 
         ret = 1;
@@ -151,14 +151,25 @@
                 }
         }
 
-        n = polkit_sysdeps_get_exe_for_pid (requesting_info_for_pid, buf, sizeof (buf));
-        if (n == -1 || n >= (int) sizeof (buf)) {
-                fprintf (stderr, "polkit-resolve-exe-helper: Cannot resolve link for pid %d\n", 
-                         requesting_info_for_pid);
-                goto out;
+        allocated = 128;
+        while (1) {
+                buf = malloc(allocated);
+
+                n = polkit_sysdeps_get_exe_for_pid (requesting_info_for_pid, buf, allocated);
+                if (n == -1) {
+                        fprintf (stderr, "polkit-resolve-exe-helper: Cannot resolve link for pid %d\n", 
+                                 requesting_info_for_pid);
+                        free(buf);
+                        goto out;
+                }
+                if (n < allocated)
+                        break;
+                free(buf);
+                allocated *= 2;
         }
 
         printf ("%s", buf);
+        free(buf);
 
         ret = 0;
 


More information about the Pkg-utopia-maintainers mailing list