Commit Graph

1958 Commits

Author SHA1 Message Date
Rich Felker 23815f88df fix off-by-one error in checks for implementation-internal signal numbers 2013-07-18 19:21:06 -04:00
Rich Felker b823ef2db1 fix FILENAME_MAX to match PATH_MAX
POSIX is not clear on whether it includes the termination, but ISO C
requires that it does. the whole concept of this macro is rather
useless, but it's better to be correct anyway.
2013-07-18 14:15:48 -04:00
Rich Felker 2f5fe45808 make spacing in x86_64 alltypes.h.sh more uniform with other archs
patch by Luka Perkov, who noted that all other archs have a newline.
2013-07-17 17:46:38 -04:00
Rich Felker b06dc66639 make posix_spawn (and functions that use it) use CLONE_VFORK flag
this is both a minor scheduling optimization and a workaround for a
difficult-to-fix bug in qemu app-level emulation.

from the scheduling standpoint, it makes no sense to schedule the
parent thread again until the child has exec'd or exited, since the
parent will immediately block again waiting for it.

on the qemu side, as regular application code running on an underlying
libc, qemu cannot make arbitrary clone syscalls itself without
confusing the underlying implementation. instead, it breaks them down
into either fork-like or pthread_create-like cases. it was treating
the code in posix_spawn as pthread_create-like, due to CLONE_VM, which
caused horribly wrong behavior: CLONE_FILES broke the synchronization
mechanism, CLONE_SIGHAND broke the parent's signals, and CLONE_THREAD
caused the child's exec to end the parent -- if it hadn't already
crashed. however, qemu special-cases CLONE_VFORK and emulates that
with fork, even when CLONE_VM is also specified. this also gives
incorrect semantics for code that really needs the memory sharing, but
posix_spawn does not make use of the vm sharing except to avoid
momentary double commit charge.

programs using posix_spawn (including via popen) should now work
correctly under qemu app-level emulation.
2013-07-17 13:54:41 -04:00
Rich Felker 3df0b66ee9 fix missing argument in variadic syscall macros
for 0-argument syscalls (1 argument to the macro, the syscall number),
the __SYSCALL_NARGS_X macro's ... argument was not satisfied. newer
compilers seem to care about this.
2013-07-17 10:43:04 -04:00
Rich Felker ea81c0624f fix error code on time conversion overflows
POSIX mandates EOVERFLOW for this condition.
2013-07-17 10:39:11 -04:00
Rich Felker ac1bf93fc6 fix fd leak in file mapping code used in new zoneinfo support 2013-07-17 09:29:26 -04:00
Rich Felker 1cc81f5cb0 the big time handling overhaul
this commit has two major user-visible parts: zoneinfo-format time
zones are now supported, and overflow handling is intended to be
complete in the sense that all functions return a correct result if
and only if the result fits in the destination type, and otherwise
return an error. also, some noticable bugs in the way DST detection
and normalization worked have been fixed, and performance may be
better than before, but it has not been tested.
2013-07-17 05:24:50 -04:00
Rich Felker f1292e3d28 fix omission of dtv setup in static linked programs on TLS variant I archs
apparently this was never noticed before because the linker normally
optimizes dynamic TLS models to non-dynamic ones when static linking,
thus eliminating the calls to __tls_get_addr which crash when the dtv
is missing. however, some libsupc++ code on ARM was calling
__tls_get_addr when static linked and crashing. the reason is unclear
to me, but with this issue fixed it should work now anyway.
2013-07-13 14:54:34 -04:00
Rich Felker c07da2e970 add PIE support for ARM 2013-07-10 16:58:27 -04:00
Rich Felker 3e8806b4f7 add some ARM EABI-specific exception handling infrastructure
patch by Timo Teräs
2013-07-10 16:11:01 -04:00
Rich Felker 30763fd01b fix invalid library phdr pointers passed to callback from dl_iterate_phdr
map_library was saving pointers to an automatic-storage buffer rather
than pointers into the mapping. this should be a fairly simple fix,
but the patch here is slightly complicated by two issues:

1. supporting gratuitously obfuscated ELF files where the program
headers are not right at the beginning of the file.

2. cleaning up the map_library function so that data isn't clobbered
by the time we need it.
2013-07-10 14:38:20 -04:00
Rich Felker c713d87978 fix a couple misleading/wrong signal descriptions in strsignal
there are still several more that are misleading, but SIGFPE (integer
division error misdescribed as floating point) and and SIGCHLD
(possibly non-exit status change events described as exiting) were the
worst offenders.
2013-07-09 02:30:21 -04:00
Rich Felker c90fa2ace7 add realtime signals to strsignal
the name format RTnn/RTnnn was chosen to minimized bloat while
uniquely identifying the signal.
2013-07-09 02:23:16 -04:00
Rich Felker 8599822ee1 fix off-by-one array bound in strsignal 2013-07-09 02:11:52 -04:00
Rich Felker b6218764eb fix bogus lazy allocation in ctermid and missing malloc failure check
also clean up, optimize, and simplify the code, removing branches by
simply pre-setting the result string to an empty string, which will be
preserved if other operations fail.
2013-07-09 00:50:11 -04:00
Rich Felker cdf0f53f8b fix fd leak on races and cancellation in ctermid 2013-07-09 00:42:09 -04:00
Rich Felker 0716b10ac8 fix missing SOCK_CLOEXEC in various functions that use sockets internally 2013-07-09 00:40:17 -04:00
Rich Felker ca9aff6a16 add NFDBITS in sys/select.h with appropriate feature tests
the main use for this macro seems to be knowing the correct allocation
granularity for dynamic-sized fd_set objects. such usage is
non-conforming and results in undefined behavior, but it is widespread
in applications.
2013-07-06 01:12:28 -04:00
Rich Felker 6d861ac874 move core memalign code from aligned_alloc to __memalign
there are two motivations for this change. one is to avoid
gratuitously depending on a C11 symbol for implementing a POSIX
function. the other pertains to the documented semantics. C11 does not
define any behavior for aligned_alloc when the length argument is not
a multiple of the alignment argument. posix_memalign on the other hand
places no requirements on the length argument. using __memalign as the
implementation of both, rather than trying to implement one in terms
of the other when their documented contracts differ, eliminates this
confusion.
2013-07-04 23:58:16 -04:00
Rich Felker 651416182d move alignment check from aligned_alloc to posix_memalign
C11 has no requirement that the alignment be a multiple of
sizeof(void*), and in fact seems to require any "valid alignment
supported by the implementation" to work. since the alignment of char
is 1 and thus a valid alignment, an alignment argument of 1 should be
accepted.
2013-07-04 23:54:12 -04:00
rofl0r ab72420439 add legacy sys/ttydefaults.h header 2013-07-03 18:07:51 +02:00
rofl0r 0636d5977a add legacy scsi/scsi_ioctl.h header 2013-07-03 18:07:50 +02:00
rofl0r f206fec1c8 paths.h: remove cruft
a research in debian codesearch and grepping over the pkgsrc
directory tree have shown that these macros are all either unused,
or defined by programs in case they need them.
2013-07-03 18:07:50 +02:00
Rich Felker fbcd82040c add stubs for additional legacy ether.h functions
these would not be expensive to actually implement, but reading
/etc/ethers does not sound like a particularly useful feature, so for
now I'm leaving them as stubs.
2013-07-01 13:50:02 -04:00
Rich Felker d66ab4f140 fix Makefile so "make install" works before include/bits symlink exists
previously, determination of the list of header files for installation
depended on the include/bits symlink (to the arch-specific files)
already having been created. in other words, running "make install"
immediately after configure without first running "make" caused the
bits headers not to be installed.

the solution I have applied is to pull the list of headers directly
from arch/$(ARCH)/bits rather than include/bits, and likewise to
install directly from arch/$(ARCH)/bits rather than via the symlink.

at this point, the only purpose served by keeping the symlink around
is that it enables use of the in-tree headers and libs directly via -I
and -L, which can be useful when testing against a new version of the
library before installing it. on the other hand, removing the bits
symlink would be beneficial if we ever want to support building
multiple archs in the same source tree.
2013-07-01 13:43:43 -04:00
Rich Felker 6688a778b0 release notes for 0.9.11 2013-06-29 22:43:05 -04:00
Rich Felker 4ca442157e fix failure of mbsrtowcs to record stop position when dest is full 2013-06-29 16:16:47 -04:00
Rich Felker 9b732fe51b fix shifts possibly larger than type in major() macro
in theory this should not be an issue, since major() should only be
applied to type dev_t, which is 64-bit. however, it appears some
applications are not using dev_t but a smaller integer type (which
works on Linux because the kernel's dev_t is really only 32-bit). to
avoid the undefined behavior, do it as two shifts.
2013-06-29 13:57:13 -04:00
Rich Felker 780cbbe63a implement minimal dlinfo function 2013-06-29 12:46:46 -04:00
Rich Felker 2b0af609ef add some comments about the mips ksigaction structure weirdness 2013-06-29 12:24:06 -04:00
Rich Felker 509b50eda8 fix missing synchronization in calls from dynamic linker to global ctors
this change is needed to correctly handle the case where a constructor
creates a new thread which calls dlopen. previously, the lock was not
held in this case. the reason for the complex logic to avoid locking
whenever possible is that, since the mutex is recursive, it will need
to inspect the thread pointer to get the current thread's tid, and
this requires initializing the thread pointer. we do not want
non-multi-threaded programs to attempt to access the thread pointer
unnecessarily; doing so could make them crash on ancient kernels that
don't support threads but which may otherwise be capable of running
the program.
2013-06-29 02:24:02 -04:00
Rich Felker 17aef0b41e prevent shmget from allocating objects that overflow ptrdiff_t
rather than returning an error, we have to increase the size argument
so high that the kernel will have no choice but to fail. this is
because POSIX only permits the EINVAL error for size errors when a new
shared memory segment would be created; if it already exists, the size
argument must be ignored. unfortunately Linux is non-conforming in
this regard, but I want to keep the code correct in userspace anyway
so that if/when Linux is fixed, the behavior applications see will be
conforming.
2013-06-29 00:02:38 -04:00
Rich Felker 062f40ef3e work around wrong kernel type for sem_nsems member of struct semid_ds
rejecting invalid values for n is fine even in the case where a new
sem will not be created, since the kernel does its range checks on n
even in this case as well.

by default, the kernel will bound the limit well below USHRT_MAX
anyway, but it's presumably possible that an administrator could
override this limit and break things.
2013-06-28 23:57:58 -04:00
Rich Felker 553d566c3f add missing type shmatt_t in sys/shm.h
this type is not really intended to be used; it's just there to allow
implementations to choose the type for the shm_nattch member of
struct shmid_sh, presumably since historical implementations disagreed
on the type. in any case, it needs to be there, so now it is.
2013-06-28 23:39:50 -04:00
Rich Felker aea7919032 implement week-based-year year numbers in strftime
in the process, I refactored the week-number code so it can be used by
the week-based-year formats to determine year adjustments at the
boundary values. this also improves indention/code readability.
2013-06-28 12:38:42 -04:00
Rich Felker 062446a85d fix breakage in last commit to strftime due to missing INT_MAX
that's what I get for changing a hard-coded threshold to a proper
non-magic-number without testing.
2013-06-28 12:12:55 -04:00
Rich Felker c5faf1bf09 implement week numbers and half of the week-based-year logic for strftime
output for plain week numbers (%U and %W) has been sanity-checked, and
output for the week-based-year week numbers (%V) has been checked
extensively against known-good data for the full non-negative range of
32-bit time_t.

year numbers for week-based years (%g and %G) are not yet implemented.
2013-06-28 12:03:58 -04:00
Rich Felker 1e2281b835 minor compatibility fixes in utmp.h and fixing mismatch with paths.h
the pathnames prefixed with /dev/null/ are guaranteed never to be
valid. the previous use of /dev/null alone was mildly dangerous in
that bad software might attempt to unlink the name when it found a
non-regular file there and create a new file.
2013-06-27 20:00:29 -04:00
Rich Felker 3cd6f5229f disallow creation of objects larger than PTRDIFF_MAX via mmap
internally, other parts of the library assume sizes don't overflow
ssize_t and/or ptrdiff_t, and the way this assumption is made valid is
by preventing creating of such large objects. malloc already does so,
but the check was missing from mmap.

this is also a quality of implementation issue: even if the
implementation internally could handle such objects, applications
could inadvertently invoke undefined behavior by subtracting pointers
within an object. it is very difficult to guard against this in
applications, so a good implementation should simply ensure that it
does not happen.
2013-06-27 12:48:59 -04:00
Rich Felker b17c75a4d5 fix syscall argument bug in pthread_getschedparam
the address of the pointer to the sched param, rather than the
pointer, was being passed to the kernel.
2013-06-26 22:02:23 -04:00
Rich Felker 7c20a11801 fix temp file leak in sem_open on successful creation of new semaphore 2013-06-26 21:41:51 -04:00
Rich Felker a033cd22aa fix bug whereby sem_open leaked its own internal slots on failure 2013-06-26 21:39:15 -04:00
Rich Felker 52d4444f8e in sem_open, don't leak vm mapping if fstat fails
fstat should not fail under normal circumstances, so this fix is
mostly theoretical.
2013-06-26 21:35:56 -04:00
Rich Felker 21088aee2e fix failure of pthread_setschedparam to pass correct param to kernel
the address of the pointer, rather than the pointer, was being passed.
this was probably a copy-and-paste error from corresponding get code.
2013-06-26 21:34:44 -04:00
Rich Felker f03db4bdff document in sysconf and unistd.h that per-thread cpu clocks exist 2013-06-26 19:43:24 -04:00
Rich Felker 6a4cfbdbe7 fix iconv conversion to legacy 8bit codepages
this seems to have been a simple copy-and-paste error from the code
for converting from legacy codepages.
2013-06-26 14:27:45 -04:00
Rich Felker 59b481d970 remove useless conditional before free from dynamic linker path code 2013-06-26 10:51:36 -04:00
Rich Felker 11bc173765 fix dynamic linker handling of empty path file or error reading path file
previously, the path string was being used despite being invalid. with
this change, empty path file or error reading the path file is treated
as an empty path. this is preferable to falling back to a default
path, so that attacks to prevent reading of the path file could not
result in loading incorrect and possibly dangerous (outdated or
mismatching ABI) libraries from.

the code to strip the final newline has also been removed; now that
newline is accepted as a delimiter, it's harmless to leave it in
place.
2013-06-26 10:17:29 -04:00
Rich Felker a3e2f3c2b1 respect iso c namespace in stdio.h and wchar.h regarding va_list
despite declaring functions that take arguments of type va_list, these
headers are not permitted by the c standard to expose the definition
of va_list, so an alias for the type must be used. the name
__isoc_va_list was chosen to convey that the purpose of this alternate
name is for iso c conformance, and to avoid the multitude of names
which gcc mangles with its hideous "fixincludes" monstrosity, leading
to serious header breakage if these "fixes" are run.
2013-06-25 22:26:20 -04:00