diff options
author | David Phillips <dbphillipsnz@gmail.com> | 2016-07-18 10:02:45 +1200 |
---|---|---|
committer | David Phillips <dbphillipsnz@gmail.com> | 2016-07-18 10:03:13 +1200 |
commit | 371f5beec60f9ea8b13d2ae55094c8bc8841aa3d (patch) | |
tree | 9bfae009ddd269d31e00dc191f0f5e946e5c7028 | |
parent | f563a746fe7fd0ed01378cb6defed0ce43580e5b (diff) | |
download | brightnessd-371f5beec60f9ea8b13d2ae55094c8bc8841aa3d.tar.xz |
Drop privileges down to nobody, general fix-ups.
-rw-r--r-- | brightnessd.c | 53 |
1 files changed, 44 insertions, 9 deletions
diff --git a/brightnessd.c b/brightnessd.c index 24af9ad..ebd71a2 100644 --- a/brightnessd.c +++ b/brightnessd.c @@ -6,12 +6,14 @@ #include <sys/stat.h> #include <fcntl.h> #include <poll.h> +#include <pwd.h> #define FIFO_PATH "/tmp/brightnessd-fifo" #define BRIGHT_FILE "/sys/class/backlight/radeon_bl0/brightness" #define DELAY 5 #define STEP 1 #define BIG_STEP 10 +#define USER "nobody" int get_now(FILE *f) { @@ -39,6 +41,11 @@ int main(int argc, char **argv) int target = 0; int now = 0; FILE *f = NULL; + int fifo = 0; + struct pollfd fds; + struct passwd *p; + int delay = 0; + int nread = 0; char buffer[4]; /* size 4 because max bright is 255, plus null terminator */ /* Open brightness file */ @@ -51,28 +58,56 @@ int main(int argc, char **argv) now = get_now(f); target = now; - /* create and open a FIFO */ + /* create and open fifo, using chmod since mkfifo is affected by umask */ remove(FIFO_PATH); mkfifo(FIFO_PATH, 0666); chmod(FIFO_PATH, 0666); /* FIXME : check return val */ - int fifo = open(FIFO_PATH, O_RDWR); + fifo = open(FIFO_PATH, O_RDWR); - struct pollfd fds[1]; - fds[0].fd = fifo; - fds[0].events = POLLIN; + fds.fd = fifo; + fds.events = POLLIN; - int delay = -1; + p = getpwnam(USER); + if (p == NULL) + { + fprintf(stderr, "Failed to get uid and gid of user \""USER"\", bailing\n"); + return 1; + } + + if (setgid(p->pw_gid)) + { + fprintf(stderr, "Failed to set gid to %d\n", p->pw_gid); + perror("setuid"); + return 1; + } + + if (setuid(p->pw_uid)) + { + fprintf(stderr, "Failed to set uid to %d\n", p->pw_uid); + perror("setuid"); + return 1; + } + + if (!setuid(0) || !setgid(0)) + { + fprintf(stderr, "Got uid 0 or gid 0 back after dropping, bailing\n"); + return 1; + } + + delay = -1; while(1) { - poll(fds, 1, delay); - if (fds[0].revents & POLLIN) + poll(&fds, 1, delay); + if (fds.revents & POLLIN) { delay = DELAY; - read(fifo, buffer, sizeof(buffer)); + nread = read(fifo, buffer, sizeof(buffer)); + if (nread == 0) + perror("read"); switch(buffer[0]) { case '+': |