]> git.ipfire.org Git - thirdparty/e2fsprogs.git/commitdiff
libuuid: Don't run uuidd if it would fail due to permission problems
authorTheodore Ts'o <tytso@mit.edu>
Wed, 1 Jul 2009 02:36:28 +0000 (22:36 -0400)
committerTheodore Ts'o <tytso@mit.edu>
Wed, 1 Jul 2009 02:36:28 +0000 (22:36 -0400)
Some distributions don't like installing uuidd setuid or setgid.  So
if the setuid or setigid bit is not set with uuidd, and the current
process does not have write access to the UUIDD work directory, don't
try running uuidd, since it won't work properly.

Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
lib/uuid/gen_uuid.c
lib/uuid/uuidd.h

index 5893aff3c800963c2e885f5c6451836070f8bc43..420ca2b25f1283e27887b5537fdf3369a2819a49 100644 (file)
@@ -481,6 +481,7 @@ static int get_uuid_via_daemon(int op, uuid_t out, int *num)
        ssize_t ret;
        int32_t reply_len = 0, expected = 16;
        struct sockaddr_un srv_addr;
+       struct stat st;
        pid_t pid;
        static const char *uuidd_path = UUIDD_PATH;
        static int access_ret = -2;
@@ -496,6 +497,10 @@ static int get_uuid_via_daemon(int op, uuid_t out, int *num)
                    sizeof(struct sockaddr_un)) < 0) {
                if (access_ret == -2)
                        access_ret = access(uuidd_path, X_OK);
+               if (access_ret == 0)
+                       access_ret = stat(uuidd_path, &st);
+               if (access_ret == 0 && (st.st_mode & (S_ISUID | S_ISGID)) == 0)
+                       access_ret = access(UUIDD_DIR, W_OK);
                if (access_ret == 0 && start_attempts++ < 5) {
                        if ((pid = fork()) == 0) {
                                close_all_fds();
index 528acdc9d0c9aba7c7a97e86081385d74ccfc480..c71f4b788352373edc41a58f8f8f7bde7853da14 100644 (file)
@@ -35,8 +35,9 @@
 #ifndef _UUID_UUIDD_H
 #define _UUID_UUIDD_H
 
-#define UUIDD_SOCKET_PATH      "/var/lib/libuuid/request"
-#define UUIDD_PIDFILE_PATH     "/var/lib/libuuid/uuidd.pid"
+#define UUIDD_DIR              "/var/lib/libuuid"
+#define UUIDD_SOCKET_PATH      UUIDD_DIR "/request"
+#define UUIDD_PIDFILE_PATH     UUIDD_DIR "/uuidd.pid"
 #define UUIDD_PATH             "/usr/sbin/uuidd"
 
 #define UUIDD_OP_GETPID                        0