bb0751ae75
Changes: "The code was adapted to work better with newer versions of GTK+. Several gdk_drawable_unref() calls were added. Several other minor modifications were made."
85 lines
2.6 KiB
Plaintext
85 lines
2.6 KiB
Plaintext
$OpenBSD: patch-src_xsane_c,v 1.2 2009/08/14 18:49:55 ajacoutot Exp $
|
|
|
|
Close unneeded file descriptors.
|
|
|
|
--- src/xsane.c.orig Wed Oct 2 13:02:50 2002
|
|
+++ src/xsane.c Fri Aug 14 20:34:25 2009
|
|
@@ -48,6 +48,8 @@
|
|
|
|
#include <sys/wait.h>
|
|
|
|
+#include <stdarg.h>
|
|
+
|
|
/* ---------------------------------------------------------------------------------------------------------------------- */
|
|
|
|
struct option long_options[] =
|
|
@@ -3684,6 +3686,41 @@ static void xsane_show_gpl(GtkWidget *widget, gpointer
|
|
|
|
/* ---------------------------------------------------------------------------------------------------------------------- */
|
|
|
|
+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;
|
|
@@ -3736,6 +3773,8 @@ static void xsane_show_doc_via_nsr(GtkWidget *widget,
|
|
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());
|
|
@@ -3778,6 +3817,8 @@ static void xsane_show_doc_via_nsr(GtkWidget *widget,
|
|
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());
|
|
@@ -3898,6 +3939,8 @@ static void xsane_show_doc(GtkWidget *widget, gpointer
|
|
close(xsane.ipc_pipefd[0]); /* close reading end of pipe */
|
|
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());
|