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; } }