diff options
author | Alexander Monakov <amonakov@ispras.ru> | 2017-07-28 17:46:49 +0300 |
---|---|---|
committer | Rich Felker <dalias@aerifal.cx> | 2017-08-29 19:50:48 -0400 |
commit | c7f56b4d2f58714b7286ef12fa5410213847f2fe (patch) | |
tree | aa6eda020bb2f17fc700ff30071d00efb3d88621 /src/env | |
parent | cc086693808c007679f02d5e0ee592446bf1b386 (diff) | |
download | musl-c7f56b4d2f58714b7286ef12fa5410213847f2fe.tar.gz musl-c7f56b4d2f58714b7286ef12fa5410213847f2fe.tar.bz2 musl-c7f56b4d2f58714b7286ef12fa5410213847f2fe.tar.xz musl-c7f56b4d2f58714b7286ef12fa5410213847f2fe.zip |
__init_libc: add fallbacks for __progname setup
It is possible for argv[0] to be a null pointer, but the __progname
variable is used to implement functions in src/legacy/err.c that do not
expect it to be null. It is also available to the user via the
program_invocation_name alias as a GNU extension, and the implementation
in Glibc initializes it to a pointer to empty string rather than NULL.
Since argv[0] is usually non-null and it's preferable to keep those
variables in BSS, implement the fallbacks in __init_libc, which also
allows to have an intermediate fallback to AT_EXECFN.
Diffstat (limited to 'src/env')
-rw-r--r-- | src/env/__libc_start_main.c | 8 |
1 files changed, 4 insertions, 4 deletions
diff --git a/src/env/__libc_start_main.c b/src/env/__libc_start_main.c index 5c79be28..18afdc1d 100644 --- a/src/env/__libc_start_main.c +++ b/src/env/__libc_start_main.c @@ -30,10 +30,10 @@ void __init_libc(char **envp, char *pn) __sysinfo = aux[AT_SYSINFO]; libc.page_size = aux[AT_PAGESZ]; - if (pn) { - __progname = __progname_full = pn; - for (i=0; pn[i]; i++) if (pn[i]=='/') __progname = pn+i+1; - } + if (!pn) pn = (void*)aux[AT_EXECFN]; + if (!pn) pn = ""; + __progname = __progname_full = pn; + for (i=0; pn[i]; i++) if (pn[i]=='/') __progname = pn+i+1; __init_tls(aux); __init_ssp((void *)aux[AT_RANDOM]); |