summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Monakov <amonakov@ispras.ru>2017-07-28 17:46:49 +0300
committerRich Felker <dalias@aerifal.cx>2017-08-29 19:50:48 -0400
commitc7f56b4d2f58714b7286ef12fa5410213847f2fe (patch)
treeaa6eda020bb2f17fc700ff30071d00efb3d88621
parentcc086693808c007679f02d5e0ee592446bf1b386 (diff)
downloadmusl-c7f56b4d2f58714b7286ef12fa5410213847f2fe.tar.gz
__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.
-rw-r--r--src/env/__libc_start_main.c8
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]);