control: reassign -1 procps 2:4.0.3-1
control: retitle -1 pgrep: signal handler matching breaks argument parsing
thanks
Hi Adrian,
Thanks for the report!
On 11:07 Wed 22 Feb , Adrian Bunk wrote:
>
> # Check with a single, known unused user-id
> #
> # We use "-1" here, which is not a valid user-id, so it's
> # guaranteed that it's unused.
> uid = uidpool.RequestUnusedUid(set([-1]))
> self.assertEqualValues(uid.GetUid(), -1)
>
>
> "pgrep -u -1" is now rejected by procps.
This is a (presumably) unintentional side effect of procps commit
866abacf ("pgrep: Support matching on the presence of a userspace signal
handler")[1], which added the same "-<signal>" argument of pkill to pgrep.
With this change, pgrep parses the numerical options in the same way as pkill:
it uses getopt_long() for most options, but it performs a manual argv
scan[2] specifically to find signal-like options (e.g. -1, -88, -kill,
etc.).
The result is that anything that looks like a signal option, but is
passed as an argument to any of the other options, is removed early on
from the argument list, causing a subsequent call to getopt_long() to
fail if the original option takes a mandatory argument:
$ pgrep -u -93
pgrep: option requires an argument -- 'u'
...
$ pgrep -d -2
pgrep: option requires an argument -- 'd'
...
$ pgrep -u -hup
pgrep: option requires an argument -- 'u'
...
We could probably question the usefulness of negative UID/PID/SIDs
here, on the other hand this had been working for at least 15 years
before breaking in a minor release. I'm reassigning this bug to procps
for further discussion.
Cheers,
Apollon
[1]
https://gitlab.com/procps-ng/procps/-/commit/866abacf8805a74fb7c59cae1f64963e0a540b14
[2]
https://gitlab.com/procps-ng/procps/-/blob/806eb270f217ff7e1e745c7bda2b002b5be74be4/src/pgrep.c#L798