During init we were calling 'stdio_quiet' and passing the previously
created 'devnullfd' file descriptor. But the 'stdio_quiet' was also
closed afterwards which raised an error (EBADF).
If we keep from closing FDs that were opened outside of the
'stdio_quiet' function we will let the caller manage its FD and avoid
double close calls.
This patch can be backported to all stable branches.
*/
void stdio_quiet(int fd)
{
- if (fd < 0)
+ int close_fd = 0;
+ if (fd < 0) {
fd = open("/dev/null", O_RDWR, 0);
+ close_fd = 1;
+ }
if (fd > -1) {
fclose(stdin);
dup2(fd, 0);
dup2(fd, 1);
dup2(fd, 2);
- if (fd > 2)
+ if (fd > 2 && close_fd)
close(fd);
return;
}