Commit Graph
17 Commits
Author SHA1 Message Date
Alexander MonakovandRich Felker e53296f889 re-fix child reaping in wordexp
Do not retry waitpid if the child was terminated by a signal. Do not
examine status: since we are not passing any flags, we will not receive
stop or continue notifications.
2018-02-05 11:40:03 -05:00
Alexander MonakovandRich Felker 51bdcdc424 fix OOB reads in Xbyte_memmem
Reported by Leah Neukirchen.
2017-09-04 16:38:03 -04:00
Alexander MonakovandRich Felker cc0dbd5f09 free allocations in clearenv
This aligns clearenv with the Linux man page by setting 'environ'
rather than '*environ' to NULL, and stops it from leaking entries
allocated by the libc.
2017-09-04 15:55:21 -04:00
Alexander MonakovandRich Felker 8e932792c9 overhaul environment functions
Rewrite environment access functions to slim down code, fix bugs and
avoid invoking undefined behavior.

* avoid using int-typed iterators where size_t would be correct;
* use strncmp instead of memcmp consistently;
* tighten prologues by invoking __strchrnul;
* handle NULL environ.

putenv:
* handle "=value" input via unsetenv too (will return -1/EINVAL);
* rewrite and simplify __putenv; fix the leak caused by failure to
  deallocate entry added by preceding setenv when called from putenv.

setenv:
* move management of libc-allocated entries to this translation unit,
  and use no-op weak symbols in putenv/unsetenv;

unsetenv:
* rewrite; this fixes UB caused by testing a free'd pointer against
  NULL on entry to subsequent loops.

Not changed:
Failure to extend allocation tracking array (previously __env_map, now
env_alloced) is ignored rather than causing to report -1/ENOMEM to the
caller; the worst-case consequence is leaking this allocation when it
is removed or replaced in a subsequent environment access.

Initially UB in unsetenv was reported by Alexander Cherepanov.
Using a weak alias to avoid pulling in malloc via unsetenv was
suggested by Rich Felker.
2017-09-04 15:55:05 -04:00
Alexander MonakovandRich Felker c7f56b4d2f __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.
2017-08-29 19:50:48 -04:00
Alexander MonakovandRich Felker 2e6e08423b remove ineffective compiler assist from printf
The switch statement has no 'default:' case and the function ends
immediately following the switch, so the extra comparison did not
communicate any extra information to the compiler.
2017-07-04 18:04:52 -04:00
Alexander MonakovandRich Felker bc42dcbfd9 fix undefined behavior in ptrace 2017-07-04 17:53:58 -04:00
Alexander MonakovandRich Felker 60ab365cae fix undefined behavior in free 2017-07-04 17:11:33 -04:00
Alexander MonakovandRich Felker f688884061 reapply va_arg hacks removal to wprintf
commit 58e2396a9a missed that the same
code was duplicated in implementation of vfwprintf.
2017-07-04 17:04:43 -04:00
Alexander MonakovandRich Felker bd00cc8781 remove useless declarations in string.h
The two functions str{,n}casecmp_l are specified to be declared in
<strings.h> which is already included from <string.h> under _GNU_SOURCE.
2017-07-04 17:04:21 -04:00
Alexander MonakovandRich Felker 9543656cc3 env: avoid leaving dangling pointers in __env_map
This is the minimal fix for __putenv leaving a pointer to freed heap
storage in __env_map array, which could later on lead to errors such
as double-free.
2016-03-06 13:33:52 -05:00
Alexander MonakovandRich Felker 8f08a58c63 dynlink.c: pass gnu-hash table pointer to gnu_lookup
The callers need to check the value of the pointer anyway, so make
them pass the pointer to gnu_lookup instead of reloading it there.

Reorder gnu_lookup arguments so that always-used ones are listed
first. GCC can choose a calling convention with arguments in registers
(e.g. up to 3 arguments in eax, ecx, edx on x86), but cannot reorder
the arguments for static functions.
2015-06-28 02:30:12 +00:00
Alexander MonakovandRich Felker 5b4286e12c dynlink.c: slim down gnu_lookup
Do not reference dso->syms and dso->strings until point of use.
Check 'h1 == (h2|1)', the simplest condition, before the others.
2015-06-28 01:51:15 +00:00
Alexander MonakovandRich Felker 84389c6456 dynlink.c: use bloom filter in gnu hash lookup
Introduce gnu_lookup_filtered and use it to speed up symbol lookups in
find_sym (do_dlsym is left as is, based on an expectation that
frequently dlsym queries will use a dlopen handle rather than
RTLD_NEXT or RTLD_DEFAULT, and will not need to look at more than one
DSO).
2015-06-28 01:49:53 +00:00
Alexander MonakovandRich Felker 66d45787c8 dynlink.c: use a faster expression in gnu_hash
With -Os, GCC uses a multiply rather than a shift and addition for 'h*33'.
Use a more efficient expression explicitely.
2015-06-27 21:48:19 -04:00
Alexander MonakovandRich Felker fa80787698 add missing 'void' in prototypes of internal pthread functions 2015-04-18 16:59:00 -04:00
Alexander MonakovandRich Felker 20cbd60775 getloadavg: use sysinfo() instead of /proc/loadavg
Based on a patch by Szabolcs Nagy.
2015-02-25 15:37:55 -05:00