Blob Blame History Raw
diff -up xsane-0.995/src/xsane.c.close-fds xsane-0.995/src/xsane.c
--- xsane-0.995/src/xsane.c.close-fds	2007-09-28 17:24:56.000000000 +0200
+++ xsane-0.995/src/xsane.c	2008-07-18 16:10:30.000000000 +0200
@@ -48,6 +48,8 @@
 
 #include <sys/wait.h>
 
+#include <stdarg.h>
+
 /* ---------------------------------------------------------------------------------------------------------------------- */
 
 struct option long_options[] =
@@ -3673,6 +3675,41 @@ static void xsane_show_gpl(GtkWidget *wi
 
 /* ---------------------------------------------------------------------------------------------------------------------- */
 
+static void xsane_close_fds_for_exec(signed int first_fd_to_leave_open, ...)
+{
+ int open_max;
+ signed int i;
+
+ va_list ap;
+ unsigned char *close_fds;
+
+  open_max = (int) sysconf (_SC_OPEN_MAX);
+
+  close_fds = malloc (open_max);
+
+  memset (close_fds, 1, open_max);
+
+  va_start (ap, first_fd_to_leave_open);
+
+  for (i = first_fd_to_leave_open; i >= 0; i = va_arg (ap, signed int)) {
+    if (i < open_max)
+      close_fds[i] = 0;
+  }
+
+  va_end (ap);
+
+  DBG(DBG_info, "closing unneeded file descriptors\n");
+
+  for (i = 0; i < open_max; i++) {
+    if (close_fds[i])
+      close (i);
+  }
+
+  free (close_fds);
+}
+
+/* ---------------------------------------------------------------------------------------------------------------------- */
+
 static void xsane_show_doc_via_nsr(GtkWidget *widget, gpointer data) /* show via netscape remote */
 {
  char *name = (char *) data;
@@ -3725,6 +3762,8 @@ static void xsane_show_doc_via_nsr(GtkWi
         ipc_file = fdopen(xsane.ipc_pipefd[1], "w");
       }
 
+      xsane_close_fds_for_exec (1, 2, xsane.ipc_pipefd[1], -1);
+
       DBG(DBG_info, "trying to change user id for new subprocess:\n");
       DBG(DBG_info, "old effective uid = %d\n", (int) geteuid());
       setuid(getuid());
@@ -3767,6 +3806,8 @@ static void xsane_show_doc_via_nsr(GtkWi
         ipc_file = fdopen(xsane.ipc_pipefd[1], "w");
       }
 
+      xsane_close_fds_for_exec (1, 2, xsane.ipc_pipefd[1], -1);
+
       DBG(DBG_info, "trying to change user id for new subprocess:\n");
       DBG(DBG_info, "old effective uid = %d\n", (int) geteuid());
       setuid(getuid());
@@ -3888,6 +3929,8 @@ static void xsane_show_doc(GtkWidget *wi
         ipc_file = fdopen(xsane.ipc_pipefd[1], "w");
       }
 
+      xsane_close_fds_for_exec (1, 2, xsane.ipc_pipefd[1], -1);
+
       DBG(DBG_info, "trying to change user id for new subprocess:\n");
       DBG(DBG_info, "old effective uid = %d\n", (int) geteuid());
       setuid(getuid());