← Back to context

Comment by toxik

7 days ago

> One example of this occurred circa 2013-08-30 on the canonical repository for the Fossil DVCS. In that event, file descriptor 2 (standard error) was being erroneously closed (by stunnel, we suspect) prior to sqlite3_open_v2() so that the file descriptor used for the repository database file was 2. Later, an application bug caused an assert() statement to emit an error message by invoking write(2,...). But since file descriptor 2 was now connected to a database file, the error message overwrote part of the database.

Kind of crazy that this is an issue in modern operating systems. There are just so many ways to avoid this obvious footgun of an API design. stdin/out/err should be reserved file descriptors. In fact, why reuse file descriptors at all? Just count up.

POSIX compatibility

> https://pubs.opengroup.org/onlinepubs/000095399/functions/op...

> The open() function shall return a file descriptor for the named file that is the lowest file descriptor not currently open for that process.

  • Firstly, standards compliance is bad when the standard is bad.

    Secondly nothing precludes defining '3' as the lowest file descriptor for open(), since stdin/stdout/stderr cannot be opened (they are opened before the process starts).

    nb4 open("/dev/stdin"), that's not what I mean