Re: GCC reporting piped input as a security feature

Jacob Bachmeyer <[email protected]> Tue, 09 Apr 2024 22:35:05 -0500
Newsgroups gmane.comp.sysutils.automake.general
Message-ID <[email protected]>
Alan D. Salewski wrote:
> On 2024-04-08 22:37:50, Jacob Bachmeyer <[email protected]> spake thus:
>> Richard Stallman wrote:
> [...]
>>> In principle it could be posible to output something different to
>>> describe this stramge situation explicitly.  For instance, output "via
>>> stdin" as a comment, or output `stdin/../filename' as the file name.
>>> (Programs that optimize the file name by deleting XXX/.../ are likely
>>> not to check whether XXX is a real directory.)
>>>
>>
>> With the small difference that I believe the special marker should be
>> '<stdin>' (with the angle brackets, as it is now), this could be another
>> good idea.  Example output:  "[working directory]/<stdin>///[specified
>> filename]" or "[specified filename]///<>/[working directory]/<stdin>".
>> GDB could be modified to recognize either form and read the specified
>> file (presumably some form of augmented C) but report that the sources
>> were transformed prior to compilation.  The use of triple-slash ensures
>> that these combined strings cannot be confused with valid POSIX
>> filenames, although I suspect that uses of these strings would have to
>> be a GNU extension to the debugging info format.
>
> I do not think that the use of triple-slash (or any-N-slash) would
> entirely prevent potential confusion with valid POSIX filenames, as
> POSIX treats multiple slashes as equivalent to a single slash
> (except in at the beginning of a path, where two slash characters
> may have a different, implementation-defined meaning).
>
> Since a pathname component name can basically contains any bytes
> except <NUL> and <slash>, any token value chosen will likely have
> some non-zero potential for confusion with a valid POSIX pathname.

Yes, this is the downside of the extreme flexibility of POSIX filename 
semantics.  Any C string is potentially a valid filename.

> From SUSv4 2018[0] (update from 2020-04-30, which is what I happen
> to have handy):
>
> <quote>
>     3.271 Pathname
>
>     A string that is used to identify a file. In the context of
>     POSIX.1-2017, a pathname may be limited to {PATH_MAX} bytes,
>     including the terminating null byte. It has optional beginning
>     <slash> characters, followed by zero or more filenames separated
>     by <slash> characters. A pathname can optionally contain one or
>     more trailing <slash> characters. Multiple successive <slash>
>     characters are considered to be the same as one <slash>, except
>     for the case of exactly two leading <slash> characters.
> </quote>

Rats, I had forgotten that detail.  Emacs treats typing a second slash 
as effectively invalidating everything to the left, I remembered that 
some systems (and many URL schemes) use double-slash to indicate a 
network host, and I expected that 3 slashes would mean starting over at 
the root if that were ever presented to the kernel's filename resolution 
service.

On the other hand, we could use multiple slashes as a delimiter if GCC 
normalizes such sequences in input filename strings to single slash, 
which POSIX allows, according to the quote above.

The simplest solution would be to simply document and preserve the 
current behavior, which appears to be ignoring directives and recording 
the working directory and "<stdin>" in the case of reading from a pipe, 
and making sure that no normal build procedure for any GNU package pipes 
source into the compiler.


-- Jacob