Commit Graph

648 Commits

Author SHA1 Message Date
Rich Felker
96cea94ad2 fix incorrect overflow errors on strtoul, etc. 2011-09-05 22:23:06 -04:00
Rich Felker
5989dde345 strptime: fix use of uninitialized dest field in converting integer 2011-09-05 15:39:36 -04:00
Rich Felker
d2e061a2bd more fmemopen null termination fixes
null termination is only added when current size grows.
in update modes, null termination is not added if it does not fit
(i.e. it is not allowed to clobber data).

these rules make very little sense, but that's how it goes..
2011-09-04 21:53:20 -04:00
Rich Felker
e72ee5786b fix some fmemopen behaviors
read should not be allowed past "current size".
append mode should write at "current size", not buffer size.
null termination should not be written except when "current size" grows.
2011-09-04 21:40:42 -04:00
Rich Felker
a7778dae22 handle pending cancellation when enabling async cancellation
this is not strictly required by the standard, but without it, there
is a race condition where cancellation arriving just before async
cancellation is enabled might not be acted upon. it is impossible for
a conforming application to work around this race condition since
calling pthread_testcancel after setting async cancellation mode is
not allowed (pthread_testcancel is not specified to be
async-cancel-safe). thus the implementation should be responsible for
eliminating the race, from a quality-of-implementation standpoint.
2011-09-04 21:37:07 -04:00
Rich Felker
22e4542348 fmemopen: fix eof handling, hopefully right this time 2011-09-04 16:06:38 -04:00
Rich Felker
f81279ff58 fmemopen fixes
disallow seek past end of buffer (per posix)
fix position accounting to include data buffered for read
don't set eof flag when no data was requested
2011-09-04 16:04:28 -04:00
Rich Felker
7ee3dcb3c6 memstreams: fix incorrect handling of file pos > current size
the addition is safe and cannot overflow because both operands are
positive when considered as signed quantities.
2011-09-04 10:29:04 -04:00
Rich Felker
c88f36f556 optimize seek function for memory streams 2011-09-04 00:08:32 -04:00
Rich Felker
32d67e938e fix twos complement overflow bug in mem streams boundary check
the expression -off is not safe in case off is the most-negative
value. instead apply - to base which is known to be non-negative and
bounded within sanity.
2011-09-04 00:06:01 -04:00
Rich Felker
d4fa6f0e08 implement fmemopen
testing so far has been minimal. may need further work.
2011-09-03 23:26:17 -04:00
Rich Felker
1e69376435 fix some length calculations in memory streams 2011-09-03 20:19:51 -04:00
Rich Felker
1461e02757 implement open_wmemstream
not heavily tested, but it seems to be correct, including the odd
behavior that seeking is in terms of wide character count. this
precludes any simple buffering, so we just make the stream unbuffered.
2011-09-03 19:49:46 -04:00
Rich Felker
ad70ba774f fix RTLD_NEXT on x86_64
the return address was being truncated to 32 bits, preventing the
dlsym code from determining which module contains the calling code.
2011-09-03 16:10:30 -04:00
Rich Felker
b158b32a44 implement open_memstream
this is the first attempt, and may have bugs. only minimal testing has
been performed.
2011-09-03 00:45:21 -04:00
Rich Felker
adb7093caa fix missing prototypes/wrong signature for psiginfo, psignal 2011-09-02 14:25:43 -04:00
Rich Felker
1f5ff26cd7 fix broken FD_* macros on 64-bit targets
1 is too small if int is 32-bit but unsigned long is 64-bit. be
explicit and use 1UL.
2011-08-27 19:42:13 -04:00
Rich Felker
291666a14a bring back ___environ symbol (3 underscores)
its existence doesn't hurt anything, and dynamic-linked binaries using
previous versions of musl were wrongly binding to it instead of
__environ.
2011-08-23 12:55:47 -04:00
Rich Felker
1c8bead345 use new a_crash() asm to optimize double-free handler.
gcc generates extremely bad code (7 byte immediate mov) for the old
null pointer write approach. it should be generating something like
"xor %eax,%eax ; mov %al,(%eax)". in any case, using a dedicated
crashing opcode accomplishes the same thing in one byte.
2011-08-23 09:43:45 -04:00
Rich Felker
df0b5a4940 security hardening: ensure suid programs have valid stdin/out/err
this behavior (opening fds 0-2 for a suid program) is explicitly
allowed (but not required) by POSIX to protect badly-written suid
programs from clobbering files they later open.

this commit does add some cost in startup code, but the availability
of auxv and the security flag will be useful elsewhere in the future.
in particular auxv is needed for static-linked vdso support, which is
still waiting to be committed (sorry nik!)
2011-08-23 09:37:39 -04:00
Rich Felker
c0f344160d in pathconf, -1, not 0, means unsupported.. syncio presumably works, too. 2011-08-16 23:23:15 -04:00
Rich Felker
3e082df3cc fix bogus pathconf result for file size bits 2011-08-16 23:18:30 -04:00
Rich Felker
47a8816ded partially working strptime
it's missing at least:
- derived fields
- week numbers
- short year (without century) support
- locale modifiers
2011-08-16 10:38:33 -04:00
Rich Felker
cf8506ad94 ldso: move the suid/secure check code closer to env/auxv processing
this does not change behavior, but the idea is to avoid letting other
code build up between these two points, whereby the environment
variables might get used before security it checked.
2011-08-16 08:50:03 -04:00
Rich Felker
a045883365 honor AT_SECURE aux vector flag 2011-08-16 07:46:42 -04:00
Rich Felker
623753ad64 RTLD_NEXT support
the asm wrapper is needed to get the return address without
compiler-specific extensions.
2011-08-16 00:42:13 -04:00
Rich Felker
2719cc8628 LD_PRELOAD support 2011-08-16 00:24:36 -04:00
Rich Felker
ce7c6341d3 simplify and improve double-free check
a valid mmapped block will have an even (actually aligned) "extra"
field, whereas a freed chunk on the heap will always have an in-use
neighbor.

this fixes a potential bug if mmap ever allocated memory below the
main program/brk (in which case it would be wrongly-detected as a
double-free by the old code) and allows the double-free check to work
for donated memory outside of the brk area (or, in the future,
secondary heap zones if support for their creation is added).
2011-08-15 01:59:15 -04:00
Rich Felker
6cb277d75e typo in macro definitions for x86_64 2011-08-14 15:19:17 -04:00
Rich Felker
9205e48609 macro for pthread_equal
no sense bloating apps with a function call for an equality comparison...
2011-08-14 15:17:36 -04:00
Rich Felker
ef9dd03534 fix missing include in last commit 2011-08-13 08:42:15 -04:00
Rich Felker
ad5759821c fix clock() function
it previously was returning the pseudo-monotonic-realtime clock
returned by times() rather than process cputime. it also violated C
namespace by pulling in times().

we now use clock_gettime() if available because times() has
ridiculously bad resolution. still provide a fallback for ancient
kernels without clock_gettime.
2011-08-13 08:40:11 -04:00
Rich Felker
4054a135fc implement forkall
this is a "nonstandard" function that was "rejected" by POSIX, but
nonetheless had its behavior documented in the POSIX rationale for
fork. it's present on solaris and possibly some other systems, and
duplicates the whole calling process, not just a single thread. glibc
does not have this function. it should not be used in programs
intending to be portable, but may be useful for testing,
checkpointing, etc. and it's an interesting (and quite small) example
of the usefulness of the __synccall framework originally written to
work around deficiencies in linux's setuid syscall.
2011-08-12 10:37:12 -04:00
Rich Felker
407d933052 pthread and synccall cleanup, new __synccall_wait op
fix up clone signature to match the actual behavior. the new
__syncall_wait function allows a __synccall callback to wait for other
threads to continue without returning, so that it can resume action
after the caller finishes. this interface could be made significantly
more general/powerful with minimal effort, but i'll wait to do that
until it's actually useful for something.
2011-08-12 10:32:22 -04:00
Rich Felker
b1a7102d83 more efficient signal blocking for timer threads
due to the barrier, it's safe just to block signals in the new thread,
rather than blocking and unblocking in the parent thread.
2011-08-12 01:11:28 -04:00
Rich Felker
8b625e45ff normal exit from timer thread should run dtors, restore cancel state 2011-08-11 22:34:09 -04:00
Rich Felker
c516807173 block signals in timer threads
if a timer thread leaves signals unblocked, any future attempt by the
main thread to prevent the process from being terminated by blocking
signals will fail, since the signal can still be delivered to the
timer thread.
2011-08-11 15:54:06 -04:00
Rich Felker
1407785824 condition variable signal/bcast need not wake unless there are waiters 2011-08-07 18:31:06 -04:00
Rich Felker
cdfb725ca3 use weak aliase rather than weak reference for vdso clock_gettime
this works around pcc's lack of working support for weak references,
and in principle is nice because it gets us back to the stage where
the only weak symbol feature we use is weak aliases, nothing else.

having fewer dependencies on fancy linker features is a good thing.
2011-08-07 15:48:16 -04:00
Rich Felker
b3c08a16c0 simplify unified timed wait code, drop support for newer method
the new absolute-time-based wait kernelside was hard to get right and
basically just code duplication. it could only improve "performance"
when waiting, and even then, the improvement was just slight drop in
cpu usage during a wait.

actually, with vdso clock_gettime, the "old" way will be even faster
than the "new" way if the time has already expired, since it will not
invoke any syscalls. it can determine entirely in userspace that it
needs to return ETIMEDOUT.
2011-08-07 11:14:32 -04:00
Rich Felker
b2b95a58b4 add fast path for normal mutexes back to pthread_mutex_lock 2011-08-07 04:50:02 -04:00
Rich Felker
188ebf51b4 close should not be cancellable after "failing" with EINTR
normally we allow cancellation to be acted upon when a syscall fails
with EINTR, since there is no useful status to report to the caller in
this case, and the signal that caused the interruption was almost
surely the cancellation request, anyway.

however, unlike all other syscalls, close has actually performed its
resource-deallocation function whenever it returns, even when it
returned an error. if we allow cancellation at this point, the caller
has no way of informing the program that the file descriptor was
closed, and the program may later try to close the file descriptor
again, possibly closing a different, newly-opened file.

the workaround looks ugly (special-casing one syscall), but it's
actually the case that close is the one and only syscall (at least
among cancellation points) with this ugly property.
2011-08-07 00:05:01 -04:00
Rich Felker
8426a99048 ensure the compiler does not move around thread-register-based reads
if gcc decided to move this across a conditional that checks validity
of the thread register, an invalid thread-register-based read could be
performed and raise sigsegv.
2011-08-06 20:45:30 -04:00
Rich Felker
357876052b simplify multi-threaded errno, eliminate useless function pointer 2011-08-06 20:20:23 -04:00
Rich Felker
98acf04fc0 use weak aliases rather than function pointers to simplify some code 2011-08-06 20:09:51 -04:00
Rich Felker
338b663ddb fix off-by-one bug in siglongjmp that caused unpredictable behavior
if saved, signal mask would not be restored unless some low signals
were masked. if not saved, signal mask could be wrongly restored to
uninitialized values. in any, wrong mask would be restored.

i believe this function was written for a very old version of the
jmp_buf structure which did not contain a final 0 field for
compatibility with siglongjmp, and never updated...
2011-08-05 06:43:45 -04:00
Rich Felker
5f37fc132a further debloat cancellation handlers
cleanup push and pop are also no-ops if pthread_exit is not reachable.
this can make a big difference for library code which needs to protect
itself against cancellation, but which is unlikely to actually be used
in programs with threads/cancellation.
2011-08-03 19:57:46 -04:00
Rich Felker
56385dd5fe missed detail in cancellation bloat fix 2011-08-03 19:50:35 -04:00
Rich Felker
730bee725a fix static linking dependency bloat with cancellation
previously, pthread_cleanup_push/pop were pulling in all of
pthread_create due to dependency on the __pthread_unwind_next
function. this was not needed, as cancellation cleanup handlers can
never be called unless pthread_exit or pthread_cancel is reachable.
2011-08-03 19:45:21 -04:00
Rich Felker
fc0ecd35d8 implement if_nameindex and if_freenameindex 2011-08-03 12:13:13 -04:00