From 2104b80446dfd4bbc26d0d75691de4b4603a30f5 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Fri, 9 Jan 2004 20:48:55 +0000 Subject: implemented user id switching some locking fixups git-svn-id: file:///home/lennart/svn/public/ivam2/trunk@24 dbf6933d-3bce-0310-9bcc-ed052ba35b35 --- src/lock.c | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) (limited to 'src/lock.c') diff --git a/src/lock.c b/src/lock.c index 42ad213..efce0bb 100644 --- a/src/lock.c +++ b/src/lock.c @@ -8,6 +8,7 @@ #include #include #include +#include #include @@ -35,6 +36,7 @@ int device_lock(const char *dev) { int fd; const char *path, *temp; char buf[100]; + char uidbuf[32]; if (stat(LOCK_PATH, &st) != 0 || !S_ISDIR(st.st_mode)) { daemon_log(LOG_ERR, "Failed to lock device, directory "LOCK_PATH" not existent."); @@ -45,6 +47,9 @@ int device_lock(const char *dev) { temp = tempfile(path); for (;;) { + mode_t u; + struct passwd* pw; + char *username; if ((fd = open(path, O_RDONLY)) < 0) { if (errno != ENOENT) { @@ -87,18 +92,33 @@ int device_lock(const char *dev) { } } } + + u = umask(0033); + fd = open(temp, O_WRONLY | O_CREAT | O_EXCL, 0666); + umask(u); - if ((fd = open(temp, O_WRONLY | O_CREAT | O_EXCL, 0666)) < 0) { + if (fd < 0) { daemon_log(LOG_ERR, "Failed to create temporary lock file: %s", strerror(errno)); return -1; } + if ((pw = getpwuid(target_uid))) + username = pw->pw_name; + else + snprintf(username = uidbuf, sizeof(uidbuf), "%lu", (unsigned long) target_uid); + snprintf(buf, sizeof(buf), "%10lu %s %.20s\n", (unsigned long) getpid(), appname, username); if (loop_write(fd, buf, strlen(buf)) < 0) { daemon_log(LOG_ERR, "Failed to write to temporary lock file: %s", strerror(errno)); close(fd); return -1; } + + if (fchown(fd, target_uid, target_gid) < 0) { + daemon_log(LOG_ERR, "Failed to change owners of temporary lock file: %s", strerror(errno)); + close(fd); + return -1; + } close(fd); -- cgit