Bruno Haible wrote:
>> Ok to apply the patch below?
>> Without it, anyone can make nearly any coreutils program segfault
>> with this simple recipe:
>>
>> printf '%s\n' '#include <unistd.h>' 'int main(int c, char**v)' \
>> '{ execve (v[1], 0, 0); }' > k.c && gcc k.c && ./a.out /bin/cat
>>
>> While that usage of execve is in violation of POSIX
>
> One of the purposes of specifications is to avoid redundant checking
> of arguments. Imagine, if strlen, strcpy, etc. would have to handle NULL
> pointers, how many extra conditional statements a CPU would have to
> execute.
Hi Bruno,
If you're convinced it should be like the str* functions,
then I suggest you declare those functions with the "nonnull" attribute.
> It makes sense to be "lenient in what you accept", for example when the
> spec is unclear, or the violation can easily occur without clear programming
> error. But this is not the case here. POSIX's execve spec:
> "The argument arg0 should point to a filename that is associated with
> the process being started by one of the exec functions."
>
> In summary, one can argue for bug-tolerant behaviour, within limits.
> This case here is way off-limits.
"way off-limits"? Yes, I was reluctant to propose this change --
for the same reason you're reluctant to accept it.
Sure, it's annoying, but the compromise would be for a good cause.
The added code is tiny and non-invasive, and would save over 100 known
calling programs from having to add similar code.
I hope you reconsider.
The idea of carrying the identical progname.c.diff patch in 6 different
packages is not appealing. *Everyone* uses set_program_name -- or should.
Why do I care?
Just 3 days ago I received a private report of sleep segfaulting.
Unfortunately, it was not reproducible. I would like to be able
to eliminate set_program_name as a possible point of NULL-dereference.