summaryrefslogtreecommitdiff
path: root/src/libelogind/sd-daemon/sd-daemon.c
diff options
context:
space:
mode:
authorVito Caputo <vito.caputo@coreos.com>2015-11-02 23:05:44 -0800
committerSven Eden <yamakuzure@gmx.net>2017-04-26 12:58:55 +0200
commit5e42721bc2e1734adbd966b0e0d89ce80834ca97 (patch)
tree8fde999d34e0bb95a4153a06d4b5ed28788d9b3a /src/libelogind/sd-daemon/sd-daemon.c
parent3ab4f498a6a8df3d30621f4939cab2b69412c035 (diff)
sd-daemon: fix potential LISTEN_FDS overflow in sd_listen_fds()
Diffstat (limited to 'src/libelogind/sd-daemon/sd-daemon.c')
-rw-r--r--src/libelogind/sd-daemon/sd-daemon.c15
1 files changed, 10 insertions, 5 deletions
diff --git a/src/libelogind/sd-daemon/sd-daemon.c b/src/libelogind/sd-daemon/sd-daemon.c
index 172409b73..3ea9764c4 100644
--- a/src/libelogind/sd-daemon/sd-daemon.c
+++ b/src/libelogind/sd-daemon/sd-daemon.c
@@ -54,8 +54,7 @@ static void unsetenv_all(bool unset_environment) {
_public_ int sd_listen_fds(int unset_environment) {
const char *e;
- unsigned n;
- int r, fd;
+ int n, r, fd;
pid_t pid;
e = getenv("LISTEN_PID");
@@ -80,17 +79,23 @@ _public_ int sd_listen_fds(int unset_environment) {
goto finish;
}
- r = safe_atou(e, &n);
+ r = safe_atoi(e, &n);
if (r < 0)
goto finish;
- for (fd = SD_LISTEN_FDS_START; fd < SD_LISTEN_FDS_START + (int) n; fd ++) {
+ assert_cc(SD_LISTEN_FDS_START < INT_MAX);
+ if (n <= 0 || n > INT_MAX - SD_LISTEN_FDS_START) {
+ r = -EINVAL;
+ goto finish;
+ }
+
+ for (fd = SD_LISTEN_FDS_START; fd < SD_LISTEN_FDS_START + n; fd ++) {
r = fd_cloexec(fd, true);
if (r < 0)
goto finish;
}
- r = (int) n;
+ r = n;
finish:
unsetenv_all(unset_environment);