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 +#include + /* ---------------------------------------------------------------------------------------------------------------------- */ 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());