I noticed that 'yes' did not use pipe2_safer to check that the file
descriptors aren't any of the standard file descriptors. This fixes
that and some similar cases in other programs.

Is it worth a NEWS mention? I assume that it is difficult to reach a
point where pipe or pipe2 would open a standard file descriptor in
these areas, give that this hasn't been reported as a bug.

-- 8< --

* bootstrap.conf (gnulib_modules): Add pipe2-safer.
* cfg.mk (sc_require_unistd_safer): New rule for 'make syntax-check'.
* gl/lib/fd-reopen.c: Include unistd--.h instead of unistd.h.
* src/sort.c: Include unistd--.h.
* src/split.c: Likewise.
* src/yes.c: Likewise.
---
 bootstrap.conf     |  1 +
 cfg.mk             | 13 +++++++++++++
 gl/lib/fd-reopen.c |  2 +-
 src/sort.c         |  1 +
 src/split.c        |  1 +
 src/yes.c          |  1 +
 6 files changed, 18 insertions(+), 1 deletion(-)

diff --git a/bootstrap.conf b/bootstrap.conf
index 5f15a82f9..6119c0f88 100644
--- a/bootstrap.conf
+++ b/bootstrap.conf
@@ -213,6 +213,7 @@ gnulib_modules="
   physmem
   pipe-posix
   pipe2
+  pipe2-safer
   posix-shell
   posix_spawn
   posix_spawn_file_actions_addclose
diff --git a/cfg.mk b/cfg.mk
index 27b63f93b..aa2c86e23 100644
--- a/cfg.mk
+++ b/cfg.mk
@@ -603,6 +603,19 @@ sc_require_stdlib_safer:
        else :;                                                         \
        fi
 
+# Ensure that "unistd--.h" is used where appropriate.
+sc_require_unistd_safer:
+       @if $(VC_LIST_EXCEPT) | grep -l '\.[ch]$$' > /dev/null; then    \
+         files=$$(grep -El '$(begword)(pipe2?|dup[23]?) ?\('           \
+                  $$($(VC_LIST_EXCEPT)                                 \
+             | grep '\.[ch]$$'));                                      \
+         test -n "$$files" && grep -LE 'include "unistd--.h"' $$files  \
+             | grep . &&                                               \
+         { echo '$(ME): the above files should use "unistd--.h"'       \
+               1>&2; exit 1; } || :;                                   \
+       else :;                                                         \
+       fi
+
 sc_prohibit_perl_hash_quotes:
        @prohibit="\{'[A-Z_]+' *[=}]"                                   \
        halt="in Perl code, write \$$hash{KEY}, not \$$hash{'K''EY'}"   \
diff --git a/gl/lib/fd-reopen.c b/gl/lib/fd-reopen.c
index 10fb40bbd..607235feb 100644
--- a/gl/lib/fd-reopen.c
+++ b/gl/lib/fd-reopen.c
@@ -23,7 +23,7 @@
 
 #include <errno.h>
 #include <fcntl.h>
-#include <unistd.h>
+#include "unistd--.h"
 
 /* Open a file to a particular file descriptor.  This is like standard
    'open', except it always returns DESIRED_FD if successful.  */
diff --git a/src/sort.c b/src/sort.c
index c35890ec2..e20ed2c8f 100644
--- a/src/sort.c
+++ b/src/sort.c
@@ -51,6 +51,7 @@
 #include "stdlib--.h"
 #include "strnumcmp.h"
 #include "term-sig.h"
+#include "unistd--.h"
 #include "xmemcoll.h"
 #include "xnanosleep.h"
 #include "xstrtol.h"
diff --git a/src/split.c b/src/split.c
index e5fd0ae2e..4786df827 100644
--- a/src/split.c
+++ b/src/split.c
@@ -40,6 +40,7 @@
 #include "sig2str.h"
 #include "sys-limits.h"
 #include "temp-stream.h"
+#include "unistd--.h"
 #include "xbinary-io.h"
 #include "xdectoint.h"
 #include "xstrtol.h"
diff --git a/src/yes.c b/src/yes.c
index 91e540eba..1a1d74ce5 100644
--- a/src/yes.c
+++ b/src/yes.c
@@ -27,6 +27,7 @@
 #include "full-write.h"
 #include "isapipe.h"
 #include "long-options.h"
+#include "unistd--.h"
 
 /* The official name of this program (e.g., no 'g' prefix).  */
 #define PROGRAM_NAME "yes"
-- 
2.53.0


Reply via email to