Index: e2fsprogs-1.40.7/misc/uuidd.c =================================================================== --- e2fsprogs-1.40.7.orig/misc/uuidd.c +++ e2fsprogs-1.40.7/misc/uuidd.c @@ -52,6 +52,14 @@ static void usage(const char *progname) exit(1); } + +static void die(const char *msg) +{ + perror(msg); + exit(1); +} + + static void create_daemon(void) { pid_t pid; @@ -75,7 +83,8 @@ static void create_daemon(void) chdir("/"); (void) setsid(); euid = geteuid(); - (void) setreuid(euid, euid); + if (setreuid(euid, euid) < 0) + die("setreuid"); } static int read_all(int fd, char *buf, size_t count) @@ -132,7 +141,7 @@ static int call_daemon(const char *socke } srv_addr.sun_family = AF_UNIX; - strcpy(srv_addr.sun_path, socket_path); + snprintf(srv_addr.sun_path, sizeof(srv_addr.sun_path), "%s", socket_path); if (connect(s, (const struct sockaddr *) &srv_addr, sizeof(struct sockaddr_un)) < 0) { @@ -252,7 +261,7 @@ static void server_loop(const char *sock * Create the address we will be binding to. */ my_addr.sun_family = AF_UNIX; - strcpy(my_addr.sun_path, socket_path); + snprintf(my_addr.sun_path, sizeof(my_addr.sun_path), "%s", socket_path); (void) unlink(socket_path); save_umask = umask(0); if (bind(s, (const struct sockaddr *) &my_addr, @@ -415,11 +424,11 @@ int main(int argc, char **argv) switch (c) { case 'd': debug++; - drop_privs++; + drop_privs = 1; break; case 'k': do_kill++; - drop_privs++; + drop_privs = 1; break; case 'n': num = strtol(optarg, &tmp, 0); @@ -429,18 +438,18 @@ int main(int argc, char **argv) } case 'p': pidfile_path = optarg; - drop_privs++; + drop_privs = 1; break; case 'q': quiet++; break; case 's': socket_path = optarg; - drop_privs++; + drop_privs = 1; break; case 't': do_type = UUIDD_OP_TIME_UUID; - drop_privs++; + drop_privs = 1; break; case 'T': timeout = strtol(optarg, &tmp, 0); @@ -451,7 +460,7 @@ int main(int argc, char **argv) break; case 'r': do_type = UUIDD_OP_RANDOM_UUID; - drop_privs++; + drop_privs = 1; break; default: usage(argv[0]); @@ -460,17 +469,23 @@ int main(int argc, char **argv) uid = getuid(); if (uid && drop_privs) { gid = getgid(); -#ifdef HAVE_SETRESUID - setresuid(uid, uid, uid); +#ifdef HAVE_SETRESGID + if (setresgid(gid, gid, gid) < 0) + die("setresgid"); #else - setreuid(uid, uid); + if (setregid(gid, gid) < 0) + die("setregid"); #endif -#ifdef HAVE_SETRESGID - setresgid(gid, gid, gid); + +#ifdef HAVE_SETRESUID + if (setresuid(uid, uid, uid) < 0) + die("setresuid"); #else - setregid(gid, gid); + if (setreuid(uid, uid) < 0) + die("setreuid"); #endif } + if (num && do_type) { ret = call_daemon(socket_path, do_type+2, buf, sizeof(buf), &num, &err_context);