Commit Graph
85 Commits
Author SHA1 Message Date
Rich Felker 21ada94c4b add getauxval function
in a sense this implementation is incomplete since it doesn't provide
the HWCAP_* macros for use with AT_HWCAP, which is perhaps the most
important intended usage case for getauxval. they will be added at a
later time.
2014-04-07 02:46:15 -04:00
Rich Felker 5f95f965e9 use syscall_arg_t for arguments in public syscall() function
on x32, this change allows programs which use syscall() with pointers
or 64-bit values as arguments to work correctly, i.e. without
truncation or incorrect sign extension. on all other supported archs,
syscall_arg_t is defined as long, so this change is a no-op.
2014-03-18 17:08:15 -04:00
Rich Felker 6619317164 fix negated error codes from ptsname_r
the incorrect error codes also made their way into errno when
__ptsname_r was called by plain ptsname, which reports errors via
errno rather than a return value.
2014-03-17 00:25:23 -04:00
Rich Felker 73871ee3f2 fix nftw FTW_MOUNT flag
the incorrect check for crossing device boundaries was preventing nftw
from traversing anything except the initially provided pathname.
2014-02-01 14:33:33 -05:00
Rich Felker 2b7cf6dbb9 optimize get_current_dir_name to reduce stack bloat
our getcwd already (as an extension) supports allocation of a buffer
when the buffer argument is a null pointer, so there's no need to
duplicate the allocation logic in this wrapper function. duplicating
it is actually harmful in that it doubles the stack usage from
PATH_MAX to 2*PATH_MAX.
2013-12-13 02:25:09 -05:00
Szabolcs Nagy 571744447c include cleanups: remove unused headers and add feature test macros 2013-12-12 05:09:18 +00:00
Rich Felker aeea71dc04 fix and refactor child reaping logic in wordexp
loop condition was incorrect and confusing and caused an infinite loop
when (broken) applications reaped the pid from a signal handler or
another thread before wordexp's call to waitpid could do so.
2013-11-22 16:29:31 -05:00
Rich Felker caaf7d443d fix fd leak and case where fd 1 is already closed in wordexp 2013-11-22 15:55:58 -05:00
Rich Felker 8253f59eae fix resource exhaustion and zero-word cases in wordexp
when WRDE_NOSPACE is returned, the we_wordv and we_wordc members must
be valid, because the interface contract allows them to return partial
results.

in the case of zero results (due either to resource exhaustion or a
zero-word input) the we_wordv array still should contain a terminating
null pointer and the initial we_offs null pointers. this is impossible
on resource exhaustion, so a correct application must presumably check
for a null pointer in we_wordv; POSIX however seems to ignore the
issue. the previous code may have crashed under this situation.
2013-11-22 15:48:24 -05:00
Rich Felker d8f1908b82 improve robustness of wordexp and fix handling of 0-word case
avoid using exit status to determine if a shell error occurred, since
broken programs may install SIGCHLD handlers which reap all zombies,
including ones that don't belong to them. using clone and __WCLONE
does not seem to work for avoiding this problem since exec resets the
exit signal to SIGCHLD.

instead, the new code uses a dummy word at the beginning of the
shell's output, which is ignored, to determine whether the command was
executed successfully. this also fixes a corner case where a word
string containing zero words was interpreted as a single zero-length
word rather than no words at all. POSIX does not seem to require this
case to be supported anyway, though.

in addition, the new code uses the correct retry idiom for waitpid to
ensure that spurious STOP/CONT signals in the child and/or EINTR in
the parent do not prevent successful wait for the child, and blocks
signals in the child.
2013-11-22 15:29:14 -05:00
Rich Felker 35e8621a28 remove incorrect cancellation points from realpath 2013-08-31 16:01:01 -04:00
Rich Felker dfddd43256 debloat realpath's allocation strategy
rather than allocating a PATH_MAX-sized buffer when the caller does
not provide an output buffer, work first with a PATH_MAX-sized temp
buffer with automatic storage, and either copy it to the caller's
buffer or strdup it on success. this not only avoids massive memory
waste, but also avoids pulling in free (and thus the full malloc
implementation) unnecessarily in static programs.
2013-08-31 15:50:23 -04:00
Rich Felker 27b4923ba0 make realpath use O_PATH when opening the file
this avoids failure if the file is not readable and avoids odd
behavior for device nodes, etc. on old kernels that lack O_PATH, the
old behavior (O_RDONLY) will naturally happen as the fallback.
2013-08-31 15:44:58 -04:00
Rich Felker c8c0844f7f debloat code that depends on /proc/self/fd/%d with shared function
I intend to add more Linux workarounds that depend on using these
pathnames, and some of them will be in "syscall" functions that, from
an anti-bloat standpoint, should not depend on the whole snprintf
framework.
2013-08-02 12:59:45 -04:00
Isaac Dunham 14f0272ea1 Add ABI compatability aliases.
GNU used several extensions that were incompatible with C99 and POSIX,
so they used alternate names for the standard functions.

The result is that we need these to run standards-conformant programs
that were linked with glibc.
2013-04-05 23:20:28 -07:00
Rich Felker 201e6603c3 fix typo in setpriority syscall wrapper 2013-04-01 11:20:12 -04:00
Rich Felker 427c0ca79e fix multiple bugs in syslog interfaces
1. as reported by William Haddon, the value returned by snprintf was
wrongly used as a length passed to sendto, despite it possibly
exceeding the buffer length. this could lead to invalid reads and
leaking additional data to syslog.

2. openlog was storing a pointer to the ident string passed by the
caller, rather than copying it. this bug is shared with (and even
documented in) other implementations like glibc, but such behavior
does not seem to meet the requirements of the standard.

3. extremely long ident provided to openlog, or corrupt ident due to
the above issue, could possibly have resulted in buffer overflows.
despite having the potential for smashing the stack, i believe the
impact is low since ident points to a short string literal in typical
application usage (and per the above bug, other usages will break
horribly on other implementations).

4. when used with LOG_NDELAY, openlog was not connecting the
newly-opened socket; sendto was being used instead. this defeated the
main purpose of LOG_NDELAY: preparing for chroot.

5. the default facility was not being used at all, so all messages
without an explicit facility passed to syslog were getting logged at
the kernel facility.

6. setlogmask was not thread-safe; no synchronization was performed
updating the mask. the fix uses atomics rather than locking to avoid
introducing a lock in the fast path for messages whose priority is not
in the mask.

7. in some code paths, the syslog lock was being unlocked twice; this
could result in releasing a lock that was actually held by a different
thread.

some additional enhancements to syslog such as a default identifier
based on argv[0] or similar may still be desired; at this time, only
the above-listed bugs have been fixed.
2013-03-23 18:59:30 -04:00
Rich Felker 55aef73f47 move new linux syscall wrapper functions to proper source dir 2012-12-07 16:17:16 -05:00
Rich Felker 03b0f13e90 fix trailing whitespace issues that crept in here and there 2012-12-07 16:16:44 -05:00
rofl0r b6f75ab07f add arch_prctl syscall (amd64/x32 only) 2012-12-06 21:12:24 +01:00
rofl0r 6fb88a955a add personality syscall 2012-12-06 21:01:06 +01:00
Rich Felker 030e526392 add getopt reset support
based on proposed patches by Daniel Cegiełka, with minor changes:
- use a weak symbol for optreset so it doesn't clash with namespace
- also reset optpos (position in multi-option arg like -lR)
- also make getopt_long support reset
2012-09-30 20:00:38 -04:00
Rich Felker f2d08cf755 fix some more O_CLOEXEC/SOCK_CLOEXEC issues 2012-09-29 17:59:50 -04:00
Rich Felker 79a5e73e51 emulate SOCK_CLOEXEC and SOCK_NONBLOCK for old (pre-2.6.27) kernels
also update syslog to use SOCK_CLOEXEC rather than separate fcntl
step, to make it safe in multithreaded programs that run external
programs.

emulation is not atomic; it could be made atomic by holding a lock on
forking during the operation, but this seems like overkill. my goal is
not to achieve perfect behavior on old kernels (which have plenty of
other imperfect behavior already) but to avoid catastrophic breakage
in (1) syslog, which would give no output on old kernels with the
change to use SOCK_CLOEXEC, and (2) programs built on a new kernel
where configure scripts detected a working SOCK_CLOEXEC, which later
get run on older kernels (they may otherwise fail to work completely).
2012-09-29 17:36:27 -04:00
Rich Felker 507faa63cb fix dirname to handle input of form "foo/" correctly
also optimized a bit.
2012-09-26 00:56:07 -04:00
Rich Felker c87584a3e9 add setdomainname syscall, fix getdomainname (previously a stub) 2012-09-09 16:50:20 -04:00
Rich Felker b9bb8f67bb cleanup src/linux and src/misc trees, etc.
previously, it was pretty much random which one of these trees a given
function appeared in. they have now been organized into:

src/linux: non-POSIX linux syscalls (possibly shard with other nixen)
src/legacy: various obsolete/legacy functions, mostly wrappers
src/misc: still mostly uncategorized; some misc POSIX, some nonstd
src/crypt: crypt hash functions

further cleanup will be done later.
2012-09-07 00:48:25 -04:00
Rich Felker 780aede419 fix constraint violation in ftw
void* does not implicitly convert to function pointer types.
2012-09-06 23:57:15 -04:00
Rich Felker 400c5e5c83 use restrict everywhere it's required by c99 and/or posix 2008
to deal with the fact that the public headers may be used with pre-c99
compilers, __restrict is used in place of restrict, and defined
appropriately for any supported compiler. we also avoid the form
[restrict] since older versions of gcc rejected it due to a bug in the
original c99 standard, and instead use the form *restrict.
2012-09-06 22:44:55 -04:00
Rich Felker 0447b8dc5c fix missing statics in crypt_sha256 code 2012-08-30 08:27:08 -04:00
Rich Felker 13157b025e anti-DoS rounds count limits for blowfish and des crypt
all of the limits could use review, but err on the side of avoiding
excessive rounds for now.
2012-08-29 12:56:12 -04:00
Rich Felker 507b6091fa limit sha512 rounds to similar runtime to sha256 limit
these limits could definitely use review, but for now, i feel
consistency and erring on the side of preventing servers from getting
bogged down by excessively-slow user-provided settings (think
.htpasswd) are the best policy. blowfish should be updated to match.
2012-08-29 12:44:27 -04:00
Rich Felker 88bf5a8a8d add sha256/sha512 crypt
based on versions sent to the list by nsz, with some simplification
and debloating. i'd still like to get them a bit smaller, or ideally
merge them into a single file with most of the code being shared, but
that can be done later.
2012-08-29 12:41:29 -04:00
Rich Felker 67ba40d1e0 optimize legacy ffs function 2012-08-23 14:38:34 -04:00
Rich Felker a02bf5fc50 add blowfish hash support to crypt
there are still some discussions going on about tweaking the code, but
at least thing brings us to the point of having something working in
the repository. hopefully the remaining major hashes (md5,sha) will
follow soon.
2012-08-10 00:20:00 -04:00
Rich Felker b3c4cc121f make crypt return an unmatchable hash rather than NULL on failure
unfortunately, a large portion of programs which call crypt are not
prepared for its failure and do not check that the return value is
non-null before using it. thus, always "succeeding" but giving an
unmatchable hash is reportedly a better behavior than failing on
error.

it was suggested that we could do this the same way as other
implementations and put the null-to-unmatchable translation in the
wrapper rather than the individual crypt modules like crypt_des, but
when i tried to do it, i found it was making the logic in __crypt_r
for keeping track of which hash type we're working with and whether it
succeeded or failed much more complex, and potentially error-prone.
the way i'm doing it now seems to have essentially zero cost, anyway.
2012-08-09 20:47:17 -04:00
Rich Felker 129ca6c05d fix missing static in getusershell (namespace pollution) 2012-08-02 14:32:17 -04:00
Rich Felker cdf51506ce replace old and ugly crypt implementation
the new version is largely the work of Solar Designer, with minor
changes for integration with musl. compared to the old code, text size
is reduced by about 7k, stack space usage by about 70k, and
performance is greatly improved by avoiding expensive calculation of
constant tables on each run.

this version also adds support for extended des-based password hashes,
which allow for unlimited key (password) length and configurable
iteration counts.

i've also published the interface for crypt_r in a new crypt.h header.
especially since this is not a standard interface, i did not feel
compelled to match the glibc abi for the crypt_data structure. the
glibc structure is way too big to allocate on the stack; in fact it's
so big that the first usage may cause the main thread to exceed its
pre-committed stack size of 128k and thus could cause the program to
crash even on systems with overcommit disabled. the only legitimate
use of crypt_data for crypt_r is to store the hash string to return,
so i've reserved 256 bytes, which should be more than sufficient
(longest known password hashes are ~60 characters, and beyond that is
possibly even exceeding some implementations' passwd file field size
limit).
2012-06-29 00:56:37 -04:00
Rich Felker c21a19d5a5 fix ptsname_r to conform to the upcoming posix requirements
it should return the error code rather than 0/-1 and setting errno.
2012-06-20 15:11:27 -04:00
Rich Felker 106e75f712 add isastream (obsolete STREAMS junk)
apparently some packages see stropts.h and want to be able to use
this. the implementation checks that the file descriptor is valid by
using fcntl/F_GETFD so it can report an error if not (as specified).
2012-05-06 09:03:19 -04:00
Rich Felker 61be1cfec1 implement stub versions of sched_*
these actually work, but for now they prohibit actually setting
priority levels and report min/max priority as 0.
2012-05-03 23:18:26 -04:00
Rich Felker 4750cf4202 ditch the priority inheritance locks; use malloc's version of lock
i did some testing trying to switch malloc to use the new internal
lock with priority inheritance, and my malloc contention test got
20-100 times slower. if priority inheritance futexes are this slow,
it's simply too high a price to pay for avoiding priority inversion.
maybe we can consider them somewhere down the road once the kernel
folks get their act together on this (and perferably don't link it to
glibc's inefficient lock API)...

as such, i've switch __lock to use malloc's implementation of
lightweight locks, and updated all the users of the code to use an
array with a waiter count for their locks. this should give optimal
performance in the vast majority of cases, and it's simple.

malloc is still using its own internal copy of the lock code because
it seems to yield measurably better performance with -O3 when it's
inlined (20% or more difference in the contention stress test).
2012-04-24 16:32:23 -04:00
Rich Felker 90da74ef51 implement getusershell, etc. legacy functions
I actually wrote these a month ago but forgot to integrate them. ugly,
probably-harmful-to-use functions, but some legacy apps want them...
2012-04-22 14:41:54 -04:00
Rich Felker b1b3d3525b add getresuid and getresgid syscall wrappers 2012-04-22 10:37:19 -04:00
Rich Felker 0d5df2df4f wordexp must set the we_offs entries of we_wordv to null pointers 2012-04-16 13:25:05 -04:00
Rich Felker bef7a85e45 fix crash in wordfree if we_offs is not initialized by the caller
I'm not sure if it's legal for wordexp to modify this field, but this
is the only easy/straightforward fix, and applications should not
care. if it's an issue, i can work out a different (but more complex)
solution later.
2012-04-16 13:03:22 -04:00
Rich Felker ca19774c91 implement a64l and l64a (legacy xsi stuff) 2012-03-01 23:43:31 -05:00
Rich Felker 00b883a955 fix (hopefully) PTRACE_TRACEME (command 0) argument handling 2012-02-23 13:08:47 -05:00
Rich Felker f96eb335e1 fix get_current_dir_name behavior 2012-02-17 23:56:28 -05:00
Rich Felker 1611ab0d9b add get_current_dir_name function 2012-02-17 23:10:00 -05:00