Don't chroot() by default.
authorEmil Mikulic <emikulic@gmail.com>
Sat, 25 Jan 2014 10:51:42 +0000 (21:51 +1100)
committerEmil Mikulic <emikulic@gmail.com>
Sat, 25 Jan 2014 14:07:28 +0000 (01:07 +1100)
Don't detect default chroot dir in the configure script.

The motivation behind this is to no longer fail to configure when /var/empty
doesn't exist, which is the case on most distros.

ChangeLog
NEWS
configure.ac
conv.c
darkstat.c
pidfile.c

index 561c567..921badb 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+v3.0.718 (January 2014)
+       - (SECURITY!) The user must specify a --chroot dir for
+         chroot() to happen.  We don't set a default in the configure
+         script anymore.
+
 v3.0.717 (14 August 2013)
        - (OS X only) Work around lack of clock_gettime().
        - Fix crash due to str_appendf() not understanding %ld.
 v3.0.717 (14 August 2013)
        - (OS X only) Work around lack of clock_gettime().
        - Fix crash due to str_appendf() not understanding %ld.
@@ -29,15 +34,17 @@ v3.0.714 (June 2011)
        - Allow sort on last-seen, thanks to Dirk Koopman.
        - Support multiple bind addresses.
        - Add --disable-debug configure flag, thanks to Malte S. Stretz.
        - Allow sort on last-seen, thanks to Dirk Koopman.
        - Support multiple bind addresses.
        - Add --disable-debug configure flag, thanks to Malte S. Stretz.
-       - Make it possible to save the DB without resetting it (SIGUSR2).
-       - Web: Use relative URLs, so darkstat works properly behind mod_proxy,
-         thanks to Malte S. Stretz.
+       - Make it possible to export the database without resetting it:
+         by sending SIGUSR2.
+       - Web: Use relative URLs, so darkstat works properly
+         behind mod_proxy, thanks to Malte S. Stretz.
 
 v3.0.713 (March 2010)
        - Don't require --verbose for pcap_stats.
        - Survive interface going down on Linux.
        - Support DLT_RAW, implemented by Anton S. Ustyuzhanin.
 
 v3.0.713 (March 2010)
        - Don't require --verbose for pcap_stats.
        - Survive interface going down on Linux.
        - Support DLT_RAW, implemented by Anton S. Ustyuzhanin.
-       - Skip accounting for hosts or ports if their max is set to zero.
+       - Skip accounting for hosts or ports if their max
+         is set to zero.
        - Implement --hexdump for troubleshooting.
        - Web: Implement --no-lastseen
        - Implement --snaplen manual override.
        - Implement --hexdump for troubleshooting.
        - Web: Implement --no-lastseen
        - Implement --snaplen manual override.
@@ -177,6 +184,6 @@ v3.0.471 (Jun 2006)
 
 v2.6 (Nov 2003)
 
 
 v2.6 (Nov 2003)
 
-       End of the line for darkstat 2
+       End of the line for darkstat 2.
 
 vim:set noet ts=8 sw=8 tw=72:
 
 vim:set noet ts=8 sw=8 tw=72:
diff --git a/NEWS b/NEWS
index c40c9de..5c4af07 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -1,5 +1,8 @@
 Changes to defaults, most recent first:
 
 Changes to defaults, most recent first:
 
+- After v3.0.717, the user must specify a --chroot dir for chroot() to happen.
+  We don't set a default in the configure script anymore.
+
 - After v3.0.708, --debug was split into --verbose and --no-daemon.
 
 - Since v3.0.694, darkstat is able to save its internal database into a file and
 - After v3.0.708, --debug was split into --verbose and --no-daemon.
 
 - Since v3.0.694, darkstat is able to save its internal database into a file and
@@ -17,3 +20,5 @@ Changes to defaults, most recent first:
   terminal, and run in the background.
 
   After 540, the default has been inverted.  darkstat will daemonize by default.
   terminal, and run in the background.
 
   After 540, the default has been inverted.  darkstat will daemonize by default.
+
+vim:set noet ts=8 sw=8 tw=80:
index cd530a4..a82b6cf 100644 (file)
@@ -6,31 +6,6 @@ AC_CONFIG_HEADER([config.h])
 
 RULE="------------------------------------------------------------"
 
 
 RULE="------------------------------------------------------------"
 
-# Let user specify CHROOT_DIR, or else autodetect it, or else die.
-AC_ARG_WITH(chroot-dir, AS_HELP_STRING([--with-chroot-dir],
- [specify the chroot directory (default: /var/empty)]),
- [if test "x$withval" = "xyes"; then
-   AC_MSG_ERROR([please specify --with-chroot-dir=/path/to/darkstat/chroot])
-  fi
-  _chd="$withval"],
- [# Find an "empty" directory to serve as the chroot.
-  _chd="/var/empty"
-  AC_MSG_CHECKING([for $_chd])
-  if test -d $_chd ; then
-   AC_MSG_RESULT(found it)
-  else
-   AC_MSG_RESULT(not there)
-   _chd="/var/lib/empty"
-   AC_MSG_CHECKING([for $_chd])
-   if test -d $_chd ; then
-    AC_MSG_RESULT(found it)
-   else
-    AC_MSG_RESULT(not there either)
-    AC_MSG_ERROR([please specify --with-chroot-dir=/path/to/darkstat/chroot])
-   fi
-  fi])
-AC_DEFINE_UNQUOTED(CHROOT_DIR, "$_chd", [Default chroot directory.])
-
 # Allow configure-time override of PRIVDROP_USER.
 AC_ARG_WITH(privdrop-user, AS_HELP_STRING([--with-privdrop-user],
  [specify which user to drop privileges to (default: nobody)]),
 # Allow configure-time override of PRIVDROP_USER.
 AC_ARG_WITH(privdrop-user, AS_HELP_STRING([--with-privdrop-user],
  [specify which user to drop privileges to (default: nobody)]),
diff --git a/conv.c b/conv.c
index 4ff95ae..a4aa499 100644 (file)
--- a/conv.c
+++ b/conv.c
@@ -288,9 +288,7 @@ daemonize_finish(void)
  * For security, chroot (optionally) and drop privileges.
  * Pass a NULL chroot_dir to disable chroot() behaviour.
  */
  * For security, chroot (optionally) and drop privileges.
  * Pass a NULL chroot_dir to disable chroot() behaviour.
  */
-void
-privdrop(const char *chroot_dir, const char *privdrop_user)
-{
+void privdrop(const char *chroot_dir, const char *privdrop_user) {
    struct passwd *pw;
 
    errno = 0;
    struct passwd *pw;
 
    errno = 0;
@@ -302,7 +300,9 @@ privdrop(const char *chroot_dir, const char *privdrop_user)
       else
          err(1, "getpwnam(\"%s\") failed", privdrop_user);
    }
       else
          err(1, "getpwnam(\"%s\") failed", privdrop_user);
    }
-   if (chroot_dir != NULL) {
+   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);
       tzset(); /* read /etc/localtime before we chroot */
       if (chdir(chroot_dir) == -1)
          err(1, "chdir(\"%s\") failed", chroot_dir);
@@ -344,3 +344,5 @@ fd_set_block(const int fd)
       err(1, "fcntl(fd %d) to unset O_NONBLOCK", fd);
    assert( (fcntl(fd, F_GETFL, 0) & O_NONBLOCK ) == 0 );
 }
       err(1, "fcntl(fd %d) to unset O_NONBLOCK", fd);
    assert( (fcntl(fd, F_GETFL, 0) & O_NONBLOCK ) == 0 );
 }
+
+/* vim:set ts=3 sw=3 tw=78 expandtab: */
index 2cb5fbd..2d7cb88 100644 (file)
@@ -134,44 +134,16 @@ const char *opt_privdrop_user = NULL;
 static void cb_user(const char *arg) { opt_privdrop_user = arg; }
 
 const char *opt_daylog_fn = NULL;
 static void cb_user(const char *arg) { opt_privdrop_user = arg; }
 
 const char *opt_daylog_fn = NULL;
-static void cb_daylog(const char *arg)
-{
-   if (opt_chroot_dir == NULL)
-      errx(1, "the daylog file is relative to the chroot.\n"
-      "You must specify a --chroot dir before you can use --daylog.");
-   else
-      opt_daylog_fn = arg;
-}
+static void cb_daylog(const char *arg) { opt_daylog_fn = arg; }
 
 const char *import_fn = NULL;
 
 const char *import_fn = NULL;
-static void cb_import(const char *arg)
-{
-   if (opt_chroot_dir == NULL)
-      errx(1, "the import file is relative to the chroot.\n"
-      "You must specify a --chroot dir before you can use --import.");
-   else
-      import_fn = arg;
-}
+static void cb_import(const char *arg) { import_fn = arg; }
 
 const char *export_fn = NULL;
 
 const char *export_fn = NULL;
-static void cb_export(const char *arg)
-{
-   if ((opt_chroot_dir == NULL) && (opt_capfile == NULL))
-      errx(1, "the export file is relative to the chroot.\n"
-      "You must specify a --chroot dir before you can use --export.");
-   else
-      export_fn = arg;
-}
+static void cb_export(const char *arg) { export_fn = arg; }
 
 static const char *pid_fn = NULL;
 
 static const char *pid_fn = NULL;
-static void cb_pidfile(const char *arg)
-{
-   if (opt_chroot_dir == NULL)
-      errx(1, "the pidfile is relative to the chroot.\n"
-      "You must specify a --chroot dir before you can use --pidfile.");
-   else
-      pid_fn = arg;
-}
+static void cb_pidfile(const char *arg) { pid_fn = arg; }
 
 unsigned int opt_hosts_max = 1000;
 static void cb_hosts_max(const char *arg)
 
 unsigned int opt_hosts_max = 1000;
 static void cb_hosts_max(const char *arg)
@@ -334,9 +306,7 @@ static void parse_cmdline(const int argc, char * const *argv) {
    if (opt_want_syslog)
       openlog("darkstat", LOG_NDELAY | LOG_PID, LOG_DAEMON);
 
    if (opt_want_syslog)
       openlog("darkstat", LOG_NDELAY | LOG_PID, LOG_DAEMON);
 
-   /* some default values */
-   if (opt_chroot_dir == NULL)
-      opt_chroot_dir = CHROOT_DIR;
+   /* default value */
    if (opt_privdrop_user == NULL)
       opt_privdrop_user = PRIVDROP_USER;
 
    if (opt_privdrop_user == NULL)
       opt_privdrop_user = PRIVDROP_USER;
 
index 044c574..50e5d55 100644 (file)
--- a/pidfile.c
+++ b/pidfile.c
 static int pidfd = -1;
 static const char *pidname = NULL;
 
 static int pidfd = -1;
 static const char *pidname = NULL;
 
-void
-pidfile_create(const char *chroot_dir, const char *filename,
-   const char *privdrop_user)
-{
+void pidfile_create(const char *chroot_dir,
+                    const char *filename,
+                    const char *privdrop_user) {
    struct passwd *pw;
 
    if (pidfd != -1)
    struct passwd *pw;
 
    if (pidfd != -1)
@@ -48,8 +47,11 @@ pidfile_create(const char *chroot_dir, const char *filename,
          err(1, "getpwnam(\"%s\") failed", privdrop_user);
    }
 
          err(1, "getpwnam(\"%s\") failed", privdrop_user);
    }
 
-   if (chdir(chroot_dir) == -1)
-      err(1, "chdir(\"%s\") failed", chroot_dir);
+   if (chroot_dir != NULL) {
+      if (chdir(chroot_dir) == -1) {
+         err(1, "chdir(\"%s\") failed", chroot_dir);
+      }
+   }
    pidname = filename;
    pidfd = open(filename, O_WRONLY | O_CREAT | O_TRUNC | O_EXCL, 0600);
    if (pidfd == -1)
    pidname = filename;
    pidfd = open(filename, O_WRONLY | O_CREAT | O_TRUNC | O_EXCL, 0600);
    if (pidfd == -1)