Download raw body.
nohup: fix error messages when stderr unavailable
Hello bugs@,
i've found bugs in the binary nohup.
when stderr is closed or in a tty when nohup fails the error message is lost.
two bugs fixed:
1. fprintf writes to stdin instead of stdout when dup2 fails
2. errx writes to stderr (which is closed) when nohup fails
Both now write to stdout when stderr is unavailble
tested with stderr closed (in a terminal emulator,) and a TTY, also in a read only directory.
diff:
--- nohup.c.orig Fri Feb 6 18:15:16 2026
+++ nohup.c Fri Feb 6 18:38:03 2026
@@ -87,7 +87,7 @@
if ((isatty(STDERR_FILENO) || errno == EBADF) &&
dup2(STDOUT_FILENO, STDERR_FILENO) == -1) {
/* may have just closed stderr */
- (void)fprintf(stdin, "nohup: %s\n", strerror(errno));
+ (void)fprintf(stdout, "nohup: %s\n", strerror(errno));
exit(EXIT_MISC);
}
@@ -120,6 +120,12 @@
if ((fd = open(p = path, O_RDWR|O_CREAT|O_APPEND, S_IRUSR|S_IWUSR)) >= 0)
goto dupit;
}
+
+ if (isatty(STDERR_FILENO) || errno == EBADF) {
+ (void)fprintf(stdout, "nohup: can't open a nohup.out file\n");
+ exit(EXIT_MISC);
+ }
+
errx(EXIT_MISC, "can't open a nohup.out file");
dupit:
i also attached it.
--- nohup.c.orig Fri Feb 6 18:15:16 2026
+++ nohup.c Fri Feb 6 18:38:03 2026
@@ -87,7 +87,7 @@
if ((isatty(STDERR_FILENO) || errno == EBADF) &&
dup2(STDOUT_FILENO, STDERR_FILENO) == -1) {
/* may have just closed stderr */
- (void)fprintf(stdin, "nohup: %s\n", strerror(errno));
+ (void)fprintf(stdout, "nohup: %s\n", strerror(errno));
exit(EXIT_MISC);
}
@@ -120,6 +120,12 @@
if ((fd = open(p = path, O_RDWR|O_CREAT|O_APPEND, S_IRUSR|S_IWUSR)) >= 0)
goto dupit;
}
+
+ if (isatty(STDERR_FILENO) || errno == EBADF) {
+ (void)fprintf(stdout, "nohup: can't open a nohup.out file\n");
+ exit(EXIT_MISC);
+ }
+
errx(EXIT_MISC, "can't open a nohup.out file");
dupit:
nohup: fix error messages when stderr unavailable