NetBSD-Bugs archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: bin/55979 (sh single quotes removes nul characters)
The following reply was made to PR bin/55979; it has been noted by GNATS.
From: Robert Elz <kre%munnari.OZ.AU@localhost>
To: Kamil Rytarowski <kamil%netbsd.org@localhost>
Cc: gnats-bugs%netbsd.org@localhost
Subject: Re: bin/55979 (sh single quotes removes nul characters)
Date: Fri, 12 Feb 2021 00:48:31 +0700
Date: Wed, 10 Feb 2021 18:37:43 +0100
From: Kamil Rytarowski <kamil%netbsd.org@localhost>
Message-ID: <d926a6ef-5877-f1de-bf77-d7b2b57027c2%netbsd.org@localhost>
| It shows me:
|
| $ ./sh hello.com
|
| ==14798==WARNING: MemorySanitizer: use-of-uninitialized-value
| #0 0x46fa69 in shellexec /usr/src/bin/sh/exec.c:136:18
I know what this is now, it was introduced (inadvertently) as part of
the fix for PRs 42184 and 52687 (two PRs, same issue) - the problem there
was short-circuiting command not found processing, when a command name
without a '/' in it was not found in a PATH search.
The PATH search needs to be done in the parent shell (the one which read
the command and is processing it) so the results can be cached, but all
other processing (including redirects, which are still supposed to happen -
and in particular which can redirect stderr, to which the command not found
error message should be sent) is supposed to happen in a sub-shell. The
way it was before the fix, when the parent shell fails to locate the command
in the path search, it simply aborted command processing, issued the error
message and went on with whatever should happen next (issuing next prompt,
or whatever) - the redirects never happened (so the not found error message
went to the shell's stderr, rather than to where stderr had been redirected).
The fix for that was simply to drop the short-circuit test, and treat not-found
commands the same as found commands, fork a sub-shell, process all the
redirects, and then go find the command again (which will fail again, except
in the very weird case of a race condition where the command suddenly appears
in a directory that is in PATH, but we don't care about that, it's a race,
someone wins, someone loses.)
The relevant var (field in the cmdentry struct), the index, wasn't being
set in the not-found case. It marks which entry in PATH located the
command (but of course, there is none for a not-found command). With
the old short circuit in place, that was fine, as after the initial not
found lookup, everything stopped, and nothing ever looked at that value.
Now, that has changed, and the second time we search for the command, we
do look at it (PATH isn't an array, so the uninit'd var isn't being used
as an index, just to compare against the counted elements in PATH as they
are processed one by one - it avoids meaningless attempts at execl() when
we have already determined that the command won't be found there). Since
the command doesn't exist anywhere, it really makes no difference what the
index value we're looking at says, anywhere it points us to (including
nowhere) isn't going to locate the command. Except in the (non-existing
I believe) case of hardware which actually detects the use of the uninitialised
value and does something strange (stranger than simply using some random value)
(MSAN is the one example of such "hardware") I believe this problem makes
no difference to anything that matters.
So, while it will get fixed, I don't think this will actually affect the
actual issue in this PR (as amended) and I most likely won't bother
requesting pullups to -8 or -9 (the change that caused it happened in
Aug 2018, before -9 was released, and was marked to be pulled up to -8,
which I assume happened). That is unless some other change related to
this PR is needed, and should be pulled up, in which case this trivial fix
can hitch a ride.
A commit to fix this in HEAD will come sometime in the not too distant
future.
The issue in this PR triggered the MSAN detection, as it ends up attempting
to run a bogus (and hence, not found) command name. Why that is happening
is the next thing to discover, but it cannot be because of this (MSAN) issue,
this comes later.
kre
Home |
Main Index |
Thread Index |
Old Index