Blob Blame Raw
Index: modules/mod_ctrls.c
===================================================================
RCS file: /cvsroot/proftp/proftpd/modules/mod_ctrls.c,v
retrieving revision 1.30
diff -u -r1.30 mod_ctrls.c
--- modules/mod_ctrls.c	11 Nov 2005 21:05:32 -0000	1.30
+++ modules/mod_ctrls.c	23 May 2006 17:31:51 -0000
@@ -3,7 +3,7 @@
  *          server, as well as several utility functions for other Controls
  *          modules
  *
- * Copyright (c) 2000-2005 TJ Saunders
+ * Copyright (c) 2000-2006 TJ Saunders
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -34,7 +34,7 @@
 #include "privs.h"
 #include "mod_ctrls.h"
 
-#define MOD_CTRLS_VERSION "mod_ctrls/0.9.3"
+#define MOD_CTRLS_VERSION "mod_ctrls/0.9.4"
 
 /* Master daemon in standalone mode? (from src/main.c) */
 extern unsigned char is_master;
@@ -518,7 +518,7 @@
   } else if (res == PR_LOG_WRITABLE_DIR) {
     pr_log_pri(PR_LOG_NOTICE, MOD_CTRLS_VERSION
       ": unable to open ControlsLog '%s': "
-      "containing directory is world writeable", ctrls_logname);
+      "containing directory is world writable", ctrls_logname);
 
   } else if (res == PR_LOG_SYMLINK) {
     pr_log_pri(PR_LOG_NOTICE, MOD_CTRLS_VERSION
@@ -1476,7 +1476,7 @@
 
     if (res == -2)
       CONF_ERROR(cmd, pstrcat(cmd->tmp_pool,
-        "unable to log to a world-writeable directory", NULL));
+        "unable to log to a world-writable directory", NULL));
   }
 
   return HANDLED(cmd);
@@ -1506,10 +1506,12 @@
     CONF_ERROR(cmd, "must be an absolute path");
 
   /* Close the socket. */
-  pr_log_debug(DEBUG3, MOD_CTRLS_VERSION ": closing ctrls socket '%s'",
-    ctrls_sock_file);
-  close(ctrls_sockfd);
-  ctrls_sockfd = -1;
+  if (ctrls_sockfd >= 0) {
+    pr_log_debug(DEBUG3, MOD_CTRLS_VERSION ": closing ctrls socket '%s' (%d)",
+      ctrls_sock_file, ctrls_sockfd);
+    close(ctrls_sockfd);
+    ctrls_sockfd = -1;
+  }
 
   /* Change the path. */
   if (strcmp(cmd->argv[1], ctrls_sock_file) != 0)
@@ -1608,9 +1610,28 @@
   PRIVS_ROOT
   ctrls_sockfd = ctrls_listen(ctrls_sock_file);
   PRIVS_RELINQUISH
-  if (ctrls_sockfd < 0)
+  if (ctrls_sockfd < 0) {
     pr_log_pri(PR_LOG_NOTICE, "notice: unable to listen to local socket: %s",
       strerror(errno));
+
+  } else {
+    /* Ensure that the listen socket used is not one of the major three
+     * (stdin, stdout, or stderr).
+     */
+    if (ctrls_sockfd < 3) {
+      if (dup2(ctrls_sockfd, 3) < 0) {
+        pr_log_pri(PR_LOG_NOTICE, MOD_CTRLS_VERSION
+          ": error duplicating listen socket: %s", strerror(errno));
+        (void) close(ctrls_sockfd);
+        ctrls_sockfd = -1;
+
+      } else {
+        (void) close(ctrls_sockfd);
+        ctrls_sockfd = 3;
+      }
+    }
+  }
+
 }
 
 static void ctrls_restart_ev(const void *event_data, void *user_data) {
@@ -1633,10 +1654,11 @@
   cl_list = NULL;
   cl_listlen = 0;
 
-  pr_log_debug(DEBUG3, MOD_CTRLS_VERSION ": closing ctrls socket '%s'",
-    ctrls_sock_file);
+  pr_log_debug(DEBUG3, MOD_CTRLS_VERSION ": closing ctrls socket '%s' (%d)",
+    ctrls_sock_file, ctrls_sockfd);
   close(ctrls_sockfd);
   ctrls_sockfd = -1;
+
   ctrls_closelog();
 
   /* Clear the existing pool */