summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorWilliam Pitcock <nenolod@dereferenced.org>2012-04-15 09:40:58 -0500
committerWilliam Pitcock <nenolod@dereferenced.org>2012-04-15 09:40:58 -0500
commit35e84109628100527c9d9cb62c456edaaa793f05 (patch)
treeb711a70c5dc1e791f8f33ebb0feb55fb3fd43233 /src
parent9852b8b68b4a1ca8096dc3402da89930b91c36e4 (diff)
Explicitly shut down stdio's stdin/stdout/stderr.
The previous logic here was to only do this if stdio was connected to a controlling terminal. However, we must do this always to avoid information leaks and other problems related to stdio. The only exception is if we are in debug mode.
Diffstat (limited to 'src')
-rw-r--r--src/inspircd.cpp45
1 files changed, 29 insertions, 16 deletions
diff --git a/src/inspircd.cpp b/src/inspircd.cpp
index 86223ae95..1a856898f 100644
--- a/src/inspircd.cpp
+++ b/src/inspircd.cpp
@@ -595,23 +595,36 @@ InspIRCd::InspIRCd(int argc, char** argv) :
}
}
- if (isatty(0) && isatty(1) && isatty(2))
+ /* Explicitly shut down stdio's stdin/stdout/stderr.
+ *
+ * The previous logic here was to only do this if stdio was connected to a controlling
+ * terminal. However, we must do this always to avoid information leaks and other
+ * problems related to stdio.
+ *
+ * The only exception is if we are in debug mode.
+ *
+ * -- nenolod
+ */
+ if ((!do_nofork) && (!do_testsuite) && (!Config->cmdline.forcedebug))
{
- /* We didn't start from a TTY, we must have started from a background process -
- * e.g. we are restarting, or being launched by cron. Dont kill parent, and dont
- * close stdin/stdout
- */
- if ((!do_nofork) && (!do_testsuite))
- {
- fclose(stdin);
- fclose(stderr);
- if (!Config->cmdline.forcedebug)
- fclose(stdout);
- }
- else
- {
- Logs->Log("STARTUP", DEFAULT,"Keeping pseudo-tty open as we are running in the foreground.");
- }
+ int fd;
+
+ fclose(stdin);
+ fclose(stderr);
+ fclose(stdout);
+
+ fd = open("/dev/null", O_RDWR);
+ if (dup2(fd, 0) < 0)
+ Logs->Log("STARTUP", DEFAULT, "Failed to dup /dev/null to stdin.");
+ if (dup2(fd, 1) < 0)
+ Logs->Log("STARTUP", DEFAULT, "Failed to dup /dev/null to stdout.");
+ if (dup2(fd, 2) < 0)
+ Logs->Log("STARTUP", DEFAULT, "Failed to dup /dev/null to stderr.");
+ close(fd);
+ }
+ else
+ {
+ Logs->Log("STARTUP", DEFAULT,"Keeping pseudo-tty open as we are running in the foreground.");
}
#else
WindowsIPC = new IPC;