Jonathan Nieder wrote: > Stefan Ott wrote: >> bash.preinst: cannot set close-on-exec flag: Inappropriate ioctl for device [...] > Thought you might be interested in this report, since it feels like a > libc or kernel bug. Hints?
Of course I should give more context than that. :) That message comes from set_cloexec(), which is defined as follows: void set_cloexec(int fd) { int flags = fcntl(fd, F_GETFL); if (flags < 0 || fcntl(fd, F_SETFL, flags | FD_CLOEXEC)) die_errno("cannot set close-on-exec flag"); } It is called on /dev/null and the two file descriptors returned from pipe() to avoid leaking file descriptors. Presumably this should be a warning instead of a fatal error or the set_cloexec() calls could be dropped altogether. But why is fcntl() failing? Thanks, Jonathan diff --git i/debian/bash.preinst-lib.c w/debian/bash.preinst-lib.c index bb13a166..701a5874 100644 --- i/debian/bash.preinst-lib.c +++ w/debian/bash.preinst-lib.c @@ -58,19 +58,10 @@ int exists(const char *file) die_errno("cannot get status of %s", file); } -void set_cloexec(int fd) -{ - int flags = fcntl(fd, F_GETFL); - if (flags < 0 || fcntl(fd, F_SETFL, flags | FD_CLOEXEC)) - die_errno("cannot set close-on-exec flag"); -} - void xpipe(int pipefd[2]) { if (pipe(pipefd)) die_errno("cannot create pipe"); - set_cloexec(pipefd[0]); - set_cloexec(pipefd[1]); } void wait_or_die(pid_t child, const char *name, int flags) diff --git i/debian/bash.preinst.c w/debian/bash.preinst.c index 14baeab0..2badd2ae 100644 --- i/debian/bash.preinst.c +++ w/debian/bash.preinst.c @@ -85,8 +85,6 @@ static int binsh_in_filelist(const char *package) * fails, no problem; leave stderr alone in that case. */ sink = open("/dev/null", O_WRONLY); - if (sink >= 0) - set_cloexec(sink); in = spawn_pipe(&child, cmd, sink); /* ... | grep "^/bin/sh\$" */ diff --git i/debian/bash.preinst.h w/debian/bash.preinst.h index 82faf497..4d4a5abb 100644 --- i/debian/bash.preinst.h +++ w/debian/bash.preinst.h @@ -26,7 +26,6 @@ extern NORETURN PRINTFLIKE void die_errno(const char *fmt, ...); extern NORETURN PRINTFLIKE void die(const char *fmt, ...); extern int exists(const char *path); -extern void set_cloexec(int fd); extern void xpipe(int pipefd[2]); extern void wait_or_die(pid_t child, const char *desc, int flags); diff --git i/debian/changelog w/debian/changelog index 310ec061..40dcb4c5 100644 --- i/debian/changelog +++ w/debian/changelog @@ -1,3 +1,11 @@ +bash (4.2-2.1) local; urgency=low + + * bash.preinst: Let a few file descriptors leak instead of setting + the close-on-exec flag. This avoids some portability gotchas. + Closes: #679198. + + -- Jonathan Nieder <jrnie...@gmail.com> Tue, 26 Jun 2012 20:55:36 -0500 + bash (4.2-2) unstable; urgency=low * Fix command-not-found location. Closes: #529313. -- To UNSUBSCRIBE, email to debian-bsd-requ...@lists.debian.org with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org Archive: http://lists.debian.org/20120627015952.GH7701@burratino