chdir("/") immediately after chroot()
authorEmil Mikulic <emikulic@gmail.com>
Mon, 28 Mar 2016 03:45:19 +0000 (14:45 +1100)
committerEmil Mikulic <emikulic@gmail.com>
Mon, 28 Mar 2016 03:45:19 +0000 (14:45 +1100)
Suggested by clang static analyzer.

conv.c

diff --git a/conv.c b/conv.c
index e1ff414..ee4184c 100644 (file)
--- a/conv.c
+++ b/conv.c
@@ -304,11 +304,13 @@ void privdrop(const char *chroot_dir, const char *privdrop_user) {
    if (chroot_dir == NULL) {
       verbosef("no --chroot dir specified, darkstat will not chroot()");
    } else {
-      tzset(); /* read /etc/localtime before we chroot */
-      if (chdir(chroot_dir) == -1)
-         err(1, "chdir(\"%s\") failed", chroot_dir);
+      /* Read /etc/localtime before we chroot. This works on FreeBSD but not
+       * on Linux / with glibc (as of 2.22) */
+      tzset();
       if (chroot(chroot_dir) == -1)
          err(1, "chroot(\"%s\") failed", chroot_dir);
+      if (chdir("/") == -1)
+         err(1, "chdir(\"/\") failed");
       verbosef("chrooted into: %s", chroot_dir);
    }
    {