Sisyphus repositório
Última atualização: 30 junho 2022 | SRPMs: 17500 | Visitas: 24467407
en ru br
ALT Linux repositórios
S:3.2.2-alt9
5.0: 3.2.2-alt4
4.1: 3.2.2-alt2
4.0: 3.2.2-alt2
3.0: 3.2.2-alt1

Group :: Sistema/Servidores
RPM: apmd

 Main   Changelog   Spec   Patches   Sources   Download   Gear   Bugs e FR  Repocop 

Patch: apmd-3.2.1-alt-fixes.patch
Download


--- apmd-3.2.1/apmd.c.orig	2004-04-19 20:03:37 +0400
+++ apmd-3.2.1/apmd.c	2004-04-19 20:04:29 +0400
@@ -201,6 +201,25 @@ static void usage(FILE *fd)
 	);
 }
 
+#include <linux/limits.h>
+
+static void close_all_fds (void)
+{
+	static int max_fd;
+	int     fd;
+
+	/* Just in case. */
+	umask (077);
+
+	if (!max_fd)
+		max_fd = sysconf(_SC_OPEN_MAX);
+	if (max_fd < NR_OPEN)
+		max_fd = NR_OPEN;
+
+	/* Close all the rest. */
+	for (fd = STDERR_FILENO + 1; fd < max_fd; ++fd)
+		close(fd);
+}
 
 /*
  * call_proxy() is a generic outcalling dispatcher.  It calls a
@@ -324,10 +343,6 @@ static int call_proxy(apm_event_t event)
 		/* child */
 		close(fds[0]);
 
-		/* Don't inherit stdin; use /dev/null instead */
-		close(0);
-		open("/dev/null", O_RDONLY);
-
 		/* Send stdout and stderr to the pipe */
 		dup2(fds[1], 1);
 		dup2(fds[1], 2);
@@ -337,6 +352,8 @@ static int call_proxy(apm_event_t event)
 		fcntl(1, F_SETFD, 0);
 		fcntl(2, F_SETFD, 0);
 		
+		close_all_fds();
+
 		execvp(argv[0], (char **)argv);
 		_exit(142); /* We only do this if the execvp fails */
 	} else {
@@ -1181,16 +1198,34 @@ int main(int argc, char **argv)
 	 * Addison-Wesley Publishing Co., 1992, p. 417.
 	 */
 	if (setsid() < 0) {
-		APMD_TRACE0(LOG_ERR, "setsid() failed: %m");
+		APMD_TRACE0(LOG_ERR, "setsid failed: %m");
 		unlink(PID_FILE);
 		exit(1);
 	}
-	chdir("/");
+	if (chdir("/") < 0) {
+		APMD_TRACE0(LOG_ERR, "chdir failed: %m");
+		unlink(PID_FILE);
+		exit(1);
+	}
+
 	close(0);
-	close(1);
-	if (verbosity < LOG_DEBUG)
-		close(2);
-	umask(0);
+	if (open("/dev/null", O_RDWR) != 0) {
+		APMD_TRACE0(LOG_ERR, "/dev/null: open failed: %m");
+		unlink(PID_FILE);
+		exit(1);
+	}
+	if (dup2(0, 1) != 1) {
+		APMD_TRACE0(LOG_ERR, "stdout: dup2 failed: %m");
+		unlink(PID_FILE);
+		exit(1);
+	}
+	if ((verbosity < LOG_DEBUG) && (dup2(0, 2) != 2)) {
+		APMD_TRACE0(LOG_ERR, "stderr: dup2 failed: %m");
+		unlink(PID_FILE);
+		exit(1);
+	}
+
+	close_all_fds();
 
 	apmd_fd = open(APM_DEVICE, O_RDWR);
 	if (apmd_fd < 0) {
 
projeto & código: Vladimir Lettiev aka crux © 2004-2005, Andrew Avramenko aka liks © 2007-2008
mantenedor atual: Michael Shigorin
mantenedor da tradução: Fernando Martini aka fmartini © 2009