Package: eperl
Version: 2.2.14-16
Severity: normal
Tags: patch

Eperl assumes that file descriptors 11, 12, and 13 are available for it
to save the old stdin, stdout, and stderr channels when redirecting IO.
This assumption is not always true.

Patch attached.

-- System Information:
Debian Release: squeeze/sid
  APT prefers unstable
  APT policy: (500, 'unstable'), (500, 'testing'), (1, 'experimental')
Architecture: i386 (i686)

Kernel: Linux 2.6.32-trunk-686 (SMP w/2 CPU cores)
Locale: LANG=en_US.UTF-8, LC_CTYPE=en_US.UTF-8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/dash

Versions of packages eperl depends on:
ii  libc6                         2.11.2-2   Embedded GNU C Library: Shared lib
ii  libperl5.10                   5.10.1-14  shared Perl library
ii  perl                          5.10.1-14  Larry Wall's Practical Extraction 
ii  perl-base [perlapi-5.10.1]    5.10.1-14  minimal Perl system

eperl recommends no packages.

Versions of packages eperl suggests:
pn  libapache-mod-perl            <none>     (no description available)

-- no debconf information

Index: eperl/eperl_sys.c
===================================================================
--- eperl.orig/eperl_sys.c	2010-08-17 14:28:38.000000000 +0300
+++ eperl/eperl_sys.c	2010-08-17 14:28:49.000000000 +0300
@@ -100,21 +100,22 @@
 #define HANDLE_STDIN  0
 #define HANDLE_STDOUT 1
 #define HANDLE_STDERR 2
-#define HANDLE_STORE_STDIN  10
-#define HANDLE_STORE_STDOUT 11
-#define HANDLE_STORE_STDERR 12
 
 static int IO_redirected_stdin  = FALSE;
 static int IO_redirected_stdout = FALSE;
 static int IO_redirected_stderr = FALSE;
 
+static int IO_handle_store_stdin;
+static int IO_handle_store_stdout;
+static int IO_handle_store_stderr;
+
 void IO_redirect_stdin(FILE *fp)
 {
     if (IO_redirected_stdin)
         IO_restore_stdin();
 
     /* first copy the current stdin to the store handle */
-    (void)dup2(HANDLE_STDIN, HANDLE_STORE_STDIN);
+    IO_handle_store_stdin = dup(HANDLE_STDIN);
 
     /* then copy the new handle to stdin */
     (void)dup2(fileno(fp), HANDLE_STDIN);
@@ -129,7 +130,7 @@
         IO_restore_stdout();
 
     /* first copy the current stdout to the store handle */
-    (void)dup2(HANDLE_STDOUT, HANDLE_STORE_STDOUT);
+    IO_handle_store_stdout = dup(HANDLE_STDOUT);
 
     /* then copy the new handle to stdout */
     (void)dup2(fileno(fp), HANDLE_STDOUT);
@@ -144,7 +145,7 @@
         IO_restore_stderr();
 
     /* first copy the current stderr to the store handle */
-    (void)dup2(HANDLE_STDERR, HANDLE_STORE_STDERR);
+    IO_handle_store_stderr = dup(HANDLE_STDERR);
 
     /* then copy the new handle to stderr */
     (void)dup2(fileno(fp), HANDLE_STDERR);
@@ -171,7 +172,7 @@
 void IO_restore_stdin(void)
 {
     if (IO_redirected_stdin) {
-        dup2(HANDLE_STORE_STDIN, HANDLE_STDIN); 
+        dup2(IO_handle_store_stdin, HANDLE_STDIN); 
         IO_redirected_stdin = FALSE;
     }
 }
@@ -179,7 +180,7 @@
 void IO_restore_stdout(void)
 {
     if (IO_redirected_stdout) {
-        dup2(HANDLE_STORE_STDOUT, HANDLE_STDOUT); 
+        dup2(IO_handle_store_stdout, HANDLE_STDOUT); 
         IO_redirected_stdout = FALSE;
     }
 }
@@ -187,7 +188,7 @@
 void IO_restore_stderr(void)
 {
     if (IO_redirected_stderr) {
-        dup2(HANDLE_STORE_STDERR, HANDLE_STDERR); 
+      dup2(IO_handle_store_stderr, HANDLE_STDERR); 
         IO_redirected_stderr = FALSE;
     }
 }

Reply via email to