From ca9cddf2466cc5220717b14a951e9133235ea11d Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Fri, 14 Feb 2025 11:20:50 -0800 Subject: [PATCH] Fix bug that put stderr into O_APPEND mode. --- ChangeLog | 11 +++++++++++ main.c | 11 ----------- test/ChangeLog | 6 ++++++ test/Makefile.am | 15 ++++++++++----- 4 files changed, 27 insertions(+), 16 deletions(-) diff --git a/ChangeLog b/ChangeLog index 42ce81a5..4e53a1ac 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,14 @@ +2025-02-14 Paul Eggert + + * main.c (main): Omit BSD hack that misbehaved by putting stderr + in O_APPEND mode, which can cause later stderr output to be put in + the wrong place, even after Gawk has exited and even if Gawk + never outputs anything. For example, the shell command + "echo abcdefgh >foo; (gawk 'BEGIN{}'; echo ouch >&2) 2<>foo" + incorrectly appended "ouch" to the end of foo rather than + correctly overwriting the start of "foo" with "ouch". + The BSD issue can be addressed in the test case instead. + 2025-02-05 Arnold D. Robbins * configure.ac: Add checks for spawn.h and _NSGetExecutablePath diff --git a/main.c b/main.c index 35546fb3..74bd3167 100644 --- a/main.c +++ b/main.c @@ -244,17 +244,6 @@ main(int argc, char **argv) if ((cp = getenv("GAWK_LOCALE_DIR")) != NULL) locale_dir = cp; -#if defined(F_GETFL) && defined(O_APPEND) - // 1/2018: This is needed on modern BSD systems so that the - // inplace tests pass. I think it's a bug in those kernels - // but let's just work around it anyway. - int flags = fcntl(fileno(stderr), F_GETFL, NULL); - if (flags >= 0 && (flags & O_APPEND) == 0) { - flags |= O_APPEND; - (void) fcntl(fileno(stderr), F_SETFL, flags); - } -#endif - #if defined(LOCALEDEBUG) initial_locale = locale; #endif diff --git a/test/ChangeLog b/test/ChangeLog index b76dee49..fbe5b30f 100644 --- a/test/ChangeLog +++ b/test/ChangeLog @@ -1,3 +1,9 @@ +2025-02-14 Paul Eggert + + * Makefile.am (inplace1, inplace2, inplace2bcomp, inplace3) + (inplace3bcomp): Work around BSD glitch in the test case, + not in Gawk itself. + 2025-02-05 Arnold D. Robbins * Makefile.am (EXTRADIST): New test, indirectbuiltin5. diff --git a/test/Makefile.am b/test/Makefile.am index c32e5223..3ef975b3 100644 --- a/test/Makefile.am +++ b/test/Makefile.am @@ -2435,7 +2435,8 @@ inplace1:: @echo $@ @-cp "$(srcdir)"/inplace.1.in _$@.1 @-cp "$(srcdir)"/inplace.2.in _$@.2 - @-AWKPATH="$(srcdir)"/../awklib/eg/lib $(AWK) -i inplace 'BEGIN {print "before"} {gsub(/foo/, "bar"); print} END {print "after"}' _$@.1 - _$@.2 < "$(srcdir)"/inplace.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@ + @->_$@ + @-AWKPATH="$(srcdir)"/../awklib/eg/lib $(AWK) -i inplace 'BEGIN {print "before"} {gsub(/foo/, "bar"); print} END {print "after"}' _$@.1 - _$@.2 < "$(srcdir)"/inplace.in >>_$@ 2>&1 || echo EXIT CODE: $$? >>_$@ @-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@ @-$(CMP) "$(srcdir)"/$@.1.ok _$@.1 && rm -f _$@.1 @-$(CMP) "$(srcdir)"/$@.2.ok _$@.2 && rm -f _$@.2 @@ -2444,7 +2445,8 @@ inplace2:: @echo $@ @-cp "$(srcdir)"/inplace.1.in _$@.1 @-cp "$(srcdir)"/inplace.2.in _$@.2 - @-AWKPATH="$(srcdir)"/../awklib/eg/lib $(AWK) -i inplace -v inplace::suffix=.bak 'BEGIN {print "before"} {gsub(/foo/, "bar"); print} END {print "after"}' _$@.1 - _$@.2 < "$(srcdir)"/inplace.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@ + @>_$@ + @-AWKPATH="$(srcdir)"/../awklib/eg/lib $(AWK) -i inplace -v inplace::suffix=.bak 'BEGIN {print "before"} {gsub(/foo/, "bar"); print} END {print "after"}' _$@.1 - _$@.2 < "$(srcdir)"/inplace.in >>_$@ 2>&1 || echo EXIT CODE: $$? >>_$@ @-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@ @-$(CMP) "$(srcdir)"/$@.1.ok _$@.1 && rm -f _$@.1 @-$(CMP) "$(srcdir)"/$@.1.bak.ok _$@.1.bak && rm -f _$@.1.bak @@ -2455,7 +2457,8 @@ inplace2bcomp:: @echo $@ @-cp "$(srcdir)"/inplace.1.in _$@.1 @-cp "$(srcdir)"/inplace.2.in _$@.2 - @-AWKPATH="$(srcdir)"/../awklib/eg/lib $(AWK) -i inplace -v INPLACE_SUFFIX=.orig 'BEGIN {print "before"} {gsub(/foo/, "bar"); print} END {print "after"}' _$@.1 - _$@.2 < "$(srcdir)"/inplace.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@ + @->_$@ + @-AWKPATH="$(srcdir)"/../awklib/eg/lib $(AWK) -i inplace -v INPLACE_SUFFIX=.orig 'BEGIN {print "before"} {gsub(/foo/, "bar"); print} END {print "after"}' _$@.1 - _$@.2 < "$(srcdir)"/inplace.in >>_$@ 2>&1 || echo EXIT CODE: $$? >>_$@ @-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@ @-$(CMP) "$(srcdir)"/$@.1.ok _$@.1 && rm -f _$@.1 @-$(CMP) "$(srcdir)"/$@.1.orig.ok _$@.1.orig && rm -f _$@.1.orig @@ -2466,7 +2469,8 @@ inplace3:: @echo $@ @-cp "$(srcdir)"/inplace.1.in _$@.1 @-cp "$(srcdir)"/inplace.2.in _$@.2 - @-AWKPATH="$(srcdir)"/../awklib/eg/lib $(AWK) -i inplace -v inplace::suffix=.bak 'BEGIN {print "before"} {gsub(/foo/, "bar"); print} END {print "after"}' _$@.1 - _$@.2 < "$(srcdir)"/inplace.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@ + @->_$@ + @-AWKPATH="$(srcdir)"/../awklib/eg/lib $(AWK) -i inplace -v inplace::suffix=.bak 'BEGIN {print "before"} {gsub(/foo/, "bar"); print} END {print "after"}' _$@.1 - _$@.2 < "$(srcdir)"/inplace.in >>_$@ 2>&1 || echo EXIT CODE: $$? >>_$@ @-AWKPATH="$(srcdir)"/../awklib/eg/lib $(AWK) -i inplace -v inplace::suffix=.bak 'BEGIN {print "Before"} {gsub(/bar/, "foo"); print} END {print "After"}' _$@.1 - _$@.2 < "$(srcdir)"/inplace.in >>_$@ 2>&1 || echo EXIT CODE: $$? >>_$@ @-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@ @-$(CMP) "$(srcdir)"/$@.1.ok _$@.1 && rm -f _$@.1 @@ -2478,7 +2482,8 @@ inplace3bcomp:: @echo $@ @-cp "$(srcdir)"/inplace.1.in _$@.1 @-cp "$(srcdir)"/inplace.2.in _$@.2 - @-AWKPATH="$(srcdir)"/../awklib/eg/lib $(AWK) -i inplace -v INPLACE_SUFFIX=.orig 'BEGIN {print "before"} {gsub(/foo/, "bar"); print} END {print "after"}' _$@.1 - _$@.2 < "$(srcdir)"/inplace.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@ + @->_$@ + @-AWKPATH="$(srcdir)"/../awklib/eg/lib $(AWK) -i inplace -v INPLACE_SUFFIX=.orig 'BEGIN {print "before"} {gsub(/foo/, "bar"); print} END {print "after"}' _$@.1 - _$@.2 < "$(srcdir)"/inplace.in >>_$@ 2>&1 || echo EXIT CODE: $$? >>_$@ @-AWKPATH="$(srcdir)"/../awklib/eg/lib $(AWK) -i inplace -v INPLACE_SUFFIX=.orig 'BEGIN {print "Before"} {gsub(/bar/, "foo"); print} END {print "After"}' _$@.1 - _$@.2 < "$(srcdir)"/inplace.in >>_$@ 2>&1 || echo EXIT CODE: $$? >>_$@ @-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@ @-$(CMP) "$(srcdir)"/$@.1.ok _$@.1 && rm -f _$@.1 -- 2.45.2