Hi,
I mentioned this a few times in passing on other lists, but forgot to
bring it up here.
POSIX.1-2024 added the following change to many programs, using 'touch'
as an example [1]:
Austin Group Defect 251 is applied, encouraging implementations to
disallow the creation of filenames containing any bytes that have
the encoded value of a <newline> character.
With the FUTURE DIRECTIONS having the following text:
If this utility is directed to create a new directory entry that
contains any bytes that have the encoded value of a <newline>
character, implementations are encouraged to treat this as an error.
A future version of this standard may require implementations to
treat this as an error.
The goal seems to have been to avoid bugs like this example [2]:
$ for file in `find . -type f`; do if ! test -f "$file"; \
then echo "$file"; fi; done
./file
2
Here is a safe way to write that:
$ find . -type f -print0 | while IFS= read -r -d '' file; \
do if ! test -f "$file"; then echo "$file"; fi; done
My personal opinion is that that we shouldn't restrict a user from
creating a file with a name that their operating system and file system
support.
If a future POSIX release requires us to throw an error if a file name
has newline, I would propose only enforcing it if POSIXLY_CORRECT is
set. Probably with a function in Gnulib so that diffutils, patch, etc.
can use it.
Thoughts?
Collin
[1] https://pubs.opengroup.org/onlinepubs/9799919799/utilities/touch.html
[2] https://www.austingroupbugs.net/view.php?id=251