Re: Proposal: getexecpath(3)
"Jean-Yves Migeon (NetBSD)" <[email protected]> Mon, 6 Jan 2025 18:50:25 +0100
| Newsgroups | gmane.os.netbsd.devel.userlevel |
|---|---|
| Organization | NetBSD |
| Message-ID | <[email protected]> |
Le 06/01/2025 à 03:24, David Holland a écrit :
> On Sun, Jan 05, 2025 at 04:24:23AM +0100, Jean-Yves Migeon (NetBSD) wrote:
> > argv[0] (by C99) is just program's name, and has no warranty of
> > representing (even a substring of) the exec path; and has its use in that
> > regard, e.g. crunchgen(1). Reliably deducing the exec path from argv[0] is
> > tricky. getexecpath(3) would have no ambiguity on its semantic.
>
> We're not talking about C99, or the provisions in C99 for MS-DOS and
> Windows; we're talking about Unix and specifically NetBSD. I think you
> missed the part where I wrote:
>
> > > This is a matter of the conventions of shells
>
> For the sake of argument, I wrote the code, stuck it in /usr/local/bin,
> and ran it in various ways, first from sh:
This is not a shell matter.
POSIX (.1 if you prefer) says that argv[0] contains a filename string,
with a rationale that is ambivalent on filename/path/exec name, and says
nowhere that it shall be a pathname (or a substring of) to the execution
file [1] . You cannot ensure more than that. It even gives the example
of "-".
There is a huge outside world that cares little about NetBSD's
expectations or "conventions" (sadly). The purpose is to avoid
cooperation of the caller -- which is what a shell is actually doing.
Give the same experiment a try with C and an "uncooperative" caller, and
explain how you are supposed to "fix" the C code to cope and find the
exec path? Which obviously is needed, considering the numbers of
projects that end up parsing /proc/pid/exe or KERN_PROC_PATHNAME.
$ cat hey.c
#include <stdio.h>
int main(int argc, char **argv)
{
printf("%s\n", argv[0]);
return 0;
}
$ cc -o hey hey.c
$ python3.11
[...]
> import os
> os.execve("/wherever/you/want/hey", ["hoh"], {})
hoh
> [snip]
>
> Likewise you could certainly start qemu or some other program that
> wants to use this technique to get its install prefix, and
> intentionally lie to it so it doesn't run or crashes trying to find
> its initialization files. But what's the point? And again, you can do
> this with all the proposed techniques.
>
> The question is whether it works as expected under normal conditions,
> and it does.
Make a difference between expectations and specifications. Your
assumptions are not necessarily the ones made by others. That proposal
is unambiguous from a semantic standpoint. All other approaches that
involve PATH/proc/sysctl arts are fragile and error-prone.
[1] https://pubs.opengroup.org/onlinepubs/9799919799/functions/exec.html
--
jym@