I also installed the attached two followup patches to document this and
issue a better warning in rare cases.
The -S code could use some more fixes in this area too - it can probably
still dump core on platforms like the Hurd that don't limit exec arg
size - but one thing at a time.
>From 6c4efdc0f51c8e253f16da2ec60cdf647bec3c06 Mon Sep 17 00:00:00 2001
From: Paul Eggert <egg...@cs.ucla.edu>
Date: Fri, 26 Mar 2021 14:00:37 -0700
Subject: [PATCH] doc: document env fix
* NEWS, doc/coreutils.texi (env invocation): Document recent change.
---
NEWS | 3 +++
doc/coreutils.texi | 2 ++
2 files changed, 5 insertions(+)
diff --git a/NEWS b/NEWS
index 97cb4bd64..802f4b427 100644
--- a/NEWS
+++ b/NEWS
@@ -17,6 +17,9 @@ GNU coreutils NEWS -*- outline -*-
heavily changed during the run.
[bug introduced in coreutils-8.25]
+ env -S no longer crashes when given unusual whitespace characters
+ [bug introduced in coreutils-8.30]
+
expr no longer mishandles unmatched \(...\) in regular expressions.
[bug introduced in coreutils-6.0]
diff --git a/doc/coreutils.texi b/doc/coreutils.texi
index ac0b4467d..06ecdd74c 100644
--- a/doc/coreutils.texi
+++ b/doc/coreutils.texi
@@ -17592,6 +17592,8 @@ hello
Running @command{env -Sstring} splits the @var{string} into
arguments based on unquoted spaces or tab characters.
+(Newlines, carriage returns, vertical tabs and form feeds are treated
+like spaces and tabs.)
In the following contrived example the @command{awk} variable
@samp{OFS} will be @code{<space>xyz<space>} as these spaces are inside
--
2.30.2
>From 5f99c7533df49f25819d7bb850be5c6cb49aa13d Mon Sep 17 00:00:00 2001
From: Paul Eggert <egg...@cs.ucla.edu>
Date: Fri, 26 Mar 2021 14:51:55 -0700
Subject: [PATCH] env: improve whitespace warning
* src/env.c (main): Issue -S warning for any whitespace,
not just space.
---
src/env.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/env.c b/src/env.c
index d07918fee..341777cb8 100644
--- a/src/env.c
+++ b/src/env.c
@@ -942,7 +942,7 @@ main (int argc, char **argv)
int exit_status = errno == ENOENT ? EXIT_ENOENT : EXIT_CANNOT_INVOKE;
error (0, errno, "%s", quote (argv[optind]));
- if (exit_status == EXIT_ENOENT && strchr (argv[optind], ' '))
+ if (exit_status == EXIT_ENOENT && strpbrk (argv[optind], C_ISSPACE_CHARS))
error (0, 0, _("use -[v]S to pass options in shebang lines"));
return exit_status;
--
2.30.2