Hi,

so, it’s actually not a stderr that gets closed, but stdout or stdin here (or 
all of them).

The thing that has changed between the versions is the number of file
descriptors open during the `dig` operation (there’s less descriptors
open by default and then the opened socket gets fd == 1.

epoll_create1(EPOLL_CLOEXEC)            = 1
pipe2([3, 4], O_CLOEXEC)                = 0

And then libuv complains about operating on fd < 2.

Writing a lightweight wrapper around dig:

#!/bin/sh
/usr/bin/dig $@ >/dev/null </dev/null

would fix the xfce-plugin-genmon that closes the stdout (or stdin).

Also dig can be called with +noall option to silence all output, so closing 
stdin
is also wrong here.

Given this test program:

#include <stdio.h>
#include <fcntl.h>
#include <assert.h>
#include <unistd.h>

int
main(void) {
        int fd = open("/tmp/test.txt", O_WRONLY | O_CREAT, S_IRWXU | S_IRGRP | 
S_IROTH);

        assert(fd >= 0);

        write(STDOUT_FILENO, "stdout\n", 7);
        write(STDERR_FILENO, "stderr\n", 7);

        write(fd, "test\n", 5);

        close(fd);
}

You will get stuff written to wrong file if you close the STDOUT_FILENO and 
STDERR_FILENO:

$ rm *txt && ./a.out >stdout.txt 2>stderr.txt ; echo '== stdout ==' ; cat 
stdout.txt ; echo '== stderr ==' ; cat stderr.txt ; echo '== test.txt ==' && 
cat test.txt
== stdout ==
stdout
== stderr ==
stderr
== test.txt ==
test

$ rm *txt && ./a.out >&- 2>stderr.txt ; echo '== stdout ==' ; cat stdout.txt ; 
echo '== stderr ==' ; cat stderr.txt ; echo '== test.txt ==' && cat test.txt
== stdout ==
cat: stdout.txt: No such file or directory
== stderr ==
stderr
== test.txt ==
stdout
test

$ rm *txt && ./a.out >stdout.txt 2>&- ; echo '== stdout ==' ; cat stdout.txt ; 
echo '== stderr ==' ; cat stderr.txt ; echo '== test.txt ==' && cat test.txt
== stdout ==
stdout
== stderr ==
cat: stderr.txt: No such file or directory
== test.txt ==
stderr
test

Also see https://pubs.opengroup.org/onlinepubs/9699919799/functions/stdin.html

I am inclined to reassign this to xfce-plugin-genmon as it breaks POSIX.

Ondrej
--
Ondřej Surý (He/Him)
ond...@sury.org

> On 30. 11. 2021, at 0:53, Cesar Enrique Garcia <cqu...@arcor.de> wrote:
> 
> Hi,
> 
> thanks for looking into this!
> 
> It might be that the source of the problem is in xfce-plugin-genmon, but I 
> traced down when this started to fail: it was after an upgrade from 
> bind9-libs 1:9.16.15-1 to 1:9.16.22-1~deb11u1. So something in that upgrade 
> changed the behavior in dig.
> 

Reply via email to