Package: dash
Version: 0.5.2-5
dash does not handle initially closed descriptors in any
way when redirecting, which leads to 'strange' anomalies and
can be the cause of somehwat puzzling script misbehaviour.
Two examples:
Script 1:
----------
exec >&-
exec 3>bork
printf "x\n" >&3
printf 55
----------
Executing this code with dash will lead to bork being
open on stdout after the printf redirection, so the contents
will be
x
55
and not just x.
Script 2:
---------
exec >&-
printf "x\n" >nork
printf 55
----------
Executing this code with dash will lead to nork being open
on stdout after the printf, same effect as above. Both of
this is out-of-spec wrt to SUS, cf
Utilities other than the special built-ins (see Special
Built-In Utilities) shall be invoked in a separate environment
that consists of the following. The initial value of these
objects shall be the same as that for the parent shell, except
as noted below.
* Open files inherited on invocation of the shell, open
files controlled by the exec special built-in plus any
modifications, and additions specified by any
redirections to the utility
[...]
The environment of the shell process shall not be changed by
the utility unless explicitly specified by the utility
description (for example, cd and umask).
(<URL:http://www.opengroup.org/onlinepubs/009695399/utilities/xcu_chap02.html#tag_02_12>)
A patch that corrects this (for me):
diff -ru dash-0.5.2/src/redir.c dash-orig/src/redir.c
--- dash-0.5.2/src/redir.c 2003-09-27 05:45:00.000000000 +0200
+++ dash-orig/src/redir.c 2006-03-15 17:14:17.000000000 +0100
@@ -70,6 +70,7 @@
#include "error.h"
+#define CLOSEFD -3 /* fd opened for redir needs to be closed */
#define EMPTY -2 /* marks an unused slot in redirtab */
#ifndef PIPE_BUF
# define PIPESIZE 4096 /* amount of buffering in a pipe */
@@ -148,10 +149,15 @@
continue; /* redirect from/to same file descriptor */
newfd = openredirect(n);
- if (fd == newfd)
- continue;
if (sv && *(p = &sv->renamed[fd]) == EMPTY) {
- int i = fcntl(fd, F_DUPFD, 10);
+ int i;
+
+ if (fd == newfd) {
+ *p = CLOSEFD;
+ continue;
+ }
+
+ i = fcntl(fd, F_DUPFD, 10);
if (i == -1) {
i = errno;
if (i != EBADF) {
@@ -159,7 +165,7 @@
close(newfd);
error("%d: %s", fd, m);
/* NOTREACHED */
- }
+ } else *p = CLOSEFD;
} else {
*p = i;
close(fd);
@@ -342,7 +348,8 @@
if (rp->renamed[i] != EMPTY) {
if (!drop) {
close(i);
- copyfd(rp->renamed[i], i);
+ if (rp->renamed[i] != CLOSEFD)
+ copyfd(rp->renamed[i], i);
}
close(rp->renamed[i]);
}
--
To UNSUBSCRIBE, email to [EMAIL PROTECTED]
with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]