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 */