forked from pool/e2fsprogs
123 lines
2.8 KiB
Diff
123 lines
2.8 KiB
Diff
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);
|