Commit Graph
100 Commits
Author SHA1 Message Date
Rich Felker 96315d27b0 add _SC_PHYS_PAGES and _SC_AVPHYS_PAGES extentions to sysconf 2014-04-15 18:45:21 -04:00
Rich Felker de20a8ffc5 add namespace-protected name for sysinfo function
it will be needed to implement some things in sysconf, and the syscall
can't easily be used directly because the x32 syscall uses the wrong
structure layout. the l (uncreative, for "linux") prefix is used since
the symbol name __sysinfo is already taken for AT_SYSINFO from the aux
vector.

the way the x32 override of this function works is also changed to be
simpler and avoid the useless jump instruction.
2014-04-15 18:16:37 -04:00
Rich Felker 6cf7d17f53 in sysconf, use getrlimit function rather than raw syscall for rlimits
the syscall is deprecated (replaced by prlimit64) and does not work
correctly on x32. this change mildly increases size, but is likely
needed anyway for newer archs that might omit deprecated syscalls.
2014-04-15 18:05:30 -04:00
Rich Felker 233767b48a avoid linear-time if/else special cases in sysconf
the previous handling of cases that could not fit in the 16-bit table
or which required non-constant results was extremely ugly and could
not scale. the new code remaps these keys into a contiguous range
that's efficient for a switch statement.
2014-04-15 13:30:20 -04:00
Rich Felker 805698401d fix fallback code for old kernels in clock_gettime 2014-04-14 23:48:40 -04:00
Rich Felker 3933fdd500 use dmb barrier instruction for atomics on arm v7
aside from potentially offering better performance, this change is
needed since the old coprocessor-based approach to barriers is
deprecated in arm v7, and some compilers/assemblers issue errors when
using the deprecated instruction for v7 targets.
2014-04-14 23:41:49 -04:00
Rich Felker 83c98aac4c use hidden visibility rather than protected for syscall internals
the use of visibility at all is purely an optimization to avoid the
need for the caller to load the GOT register or similar to prepare for
a call via the PLT. there is no reason for these symbols to be
externally visible, so hidden works just as well as protected, and
using protected visibility is undesirable due to toolchain bugs and
the lack of testing it receives.

in particular, GCC's microblaze target is known to generate symbolic
relocations in the GOT for functions with protected visibility. this
in turn results in a dynamic linker which crashes under any nontrivial
usage that requires making a syscall before symbolic relocations are
processed.
2014-04-12 00:16:19 -04:00
Rich Felker e94d069286 fix printf rounding with %g for some corner case midpoints
the subsequent rounding code assumes the end pointer (z) accurately
reflects the end of significance in the decimal expansion, but for
certain large integers, spurious trailing zero slots were left behind
when applying the binary exponent.

issue reported by Morten Welinder; the analysis of the cause was
performed by nsz, who also proposed this change.
2014-04-07 13:50:05 -04:00
Rich Felker efe07b0f89 fix arm atomic asm register constraint
the "m" constraint could give a memory reference with an offset that's
not compatible with ldrex/strex, so the arm-specific "Q" constraint is
needed instead.
2014-04-07 04:28:12 -04:00
Rich Felker 1974bffa2d use inline atomics and thread pointer on arm models supporting them
this is perhaps not the optimal implementation; a_cas still compiles
to nested loops due to the different interface contracts of the kuser
helper cas function (whose contract this patch implements) and the
a_cas function (whose contract mimics the x86 cmpxchg). fixing this
may be possible, but it's more complicated and thus deferred until a
later time.

aside from improving performance and code size, this patch also
provides a means of producing binaries which can run on hardened
kernels where the kuser helpers have been disabled. however, at
present this requires producing binaries for armv6k or later, which
will not run on older cpus. a real solution to the problem of kernels
that omit the kuser helpers would be runtime detection, so that
universal binaries which run on all arm cpu models can also be
compatible with all kernel hardening profiles. robust detection
however is a much harder problem, and will be addressed at a later
time.
2014-04-07 04:03:18 -04:00
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 89740868c9 fix failure of printf %g to strip trailing zeros in some cases
the code to strip trailing zeros was only looking in the last slot for
up to 9 zeros, assuming that the rounding code had already removed
fully-zero slots from the end. however, this ignored cases where the
rounding code did not run at all, which occur when the value being
printed is exactly representable in the requested precision.

the simplest solution is to move the code that strips trailing zero
slots to run unconditionally, immediately after rounding, rather than
as the last step of rounding.
2014-04-07 02:05:20 -04:00
Rich Felker 109048e031 fix carry into uninitialized slots during printf floating point rounding
in cases where rounding caused a carry, the slot into which the carry
was taking place was unconditionally treated as valid, despite the
possibility that it could be a new slot prior to the beginning of the
existing non-rounded number. in theory this could lead to unbounded
runaway carry, but in order for that to happen, the whole
uninitialized buffer would need to have been pre-filled with 32-bit
integer values greater than or equal to 999999999.

patch based on proposed fix by Morten Welinder, who also discovered
and reported the bug.
2014-04-07 01:36:40 -04:00
Rich Felker 7e8b0761e5 remove some cruft from libc/tls init code 2014-04-07 01:12:31 -04:00
Rich Felker 561e0a0968 remove cruft left behind when lazy thread pointer init was removed
the function itself was static, but the weak alias provided an
externally visible reference and thus prevented the dead code from
being omitted from the output. so this change actually reduces bloat
in mandatory static-linked code.
2014-04-04 21:43:20 -04:00
Rich Felker b9b2db2f37 add __sigsetjmp ABI-compat alias for sigsetjmp 2014-04-02 19:32:57 -04:00
Rich Felker 5446303328 avoid malloc failure for small requests when brk can't be extended
this issue mainly affects PIE binaries and execution of programs via
direct invocation of the dynamic linker binary: depending on kernel
behavior, in these cases the initial brk may be placed at at location
where it cannot be extended, due to conflicting adjacent maps.

when brk fails, mmap is used instead to expand the heap. in order to
avoid expensive bookkeeping for managing fragmentation by merging
these new heap regions, the minimum size for new heap regions
increases exponentially in the number of regions. this limits the
number of regions, and thereby the number of fixed fragmentation
points, to a quantity which is logarithmic with respect to the size of
virtual address space and thus negligible. the exponential growth is
tuned so as to avoid expanding the heap by more than approximately 50%
of its current total size.
2014-04-02 17:57:15 -04:00
Rich Felker 91d5aa0657 fix microblaze syscall register clobbers
the kernel entry point for syscalls on microblaze nominally saves and
restores all registers, and testing on qemu always worked since qemu
behaves this way too. however, the real kernel treats r3:r4 as a
potential 64-bit return value from the syscall function, and copies
both over top of the saved registers before returning to userspace.
thus, we need to treat r4 as always-clobbered.
2014-04-02 14:13:20 -04:00
Rich Felker 436d3723af if dynamic linker's relro mprotect call fails, include reason in message 2014-03-25 16:23:27 -04:00
Rich Felker fa7248c971 cosmetic improvements in dynamic linker cleanup
consistent use of braces in if/else structure, line length.
2014-03-25 16:21:50 -04:00
Rich Felker 689e0e6bf7 fix pointer type mismatch and misplacement of const 2014-03-24 17:39:08 -04:00
Rich Felker dab441aea2 always initialize thread pointer at program start
this is the first step in an overhaul aimed at greatly simplifying and
optimizing everything dealing with thread-local state.

previously, the thread pointer was initialized lazily on first access,
or at program startup if stack protector was in use, or at certain
random places where inconsistent state could be reached if it were not
initialized early. while believed to be fully correct, the logic was
fragile and non-obvious.

in the first phase of the thread pointer overhaul, support is retained
(and in some cases improved) for systems/situation where loading the
thread pointer fails, e.g. old kernels.

some notes on specific changes:

- the confusing use of libc.main_thread as an indicator that the
  thread pointer is initialized is eliminated in favor of an explicit
  has_thread_pointer predicate.

- sigaction no longer needs to ensure that the thread pointer is
  initialized before installing a signal handler (this was needed to
  prevent a situation where the signal handler caused the thread
  pointer to be initialized and the subsequent sigreturn cleared it
  again) but it still needs to ensure that implementation-internal
  thread-related signals are not blocked.

- pthread tsd initialization for the main thread is deferred in a new
  manner to minimize bloat in the static-linked __init_tp code.

- pthread_setcancelstate no longer needs special handling for the
  situation before the thread pointer is initialized. it simply fails
  on systems that cannot support a thread pointer, which are
  non-conforming anyway.

- pthread_cleanup_push/pop now check for missing thread pointer and
  nop themselves out in this case, so stdio no longer needs to avoid
  the cancellable path when the thread pointer is not available.

a number of cases remain where certain interfaces may crash if the
system does not support a thread pointer. at this point, these should
be limited to pthread interfaces, and the number of such cases should
be fewer than before.
2014-03-24 16:57:11 -04:00
Rich Felker 98221c3611 reduce static linking overhead from TLS support by inlining mmap syscall
the external mmap function is heavy because it has to handle error
reporting that the kernel cannot do, and has to do some locking for
arcane race-condition-avoidance purposes. for allocating initial TLS,
we do not need any of that; the raw syscall suffices.

on i386, this change shaves off 13% of the size of .text for the empty
program.
2014-03-23 23:19:30 -04:00
Rich Felker 30c1205acd include header that declares __syscall_ret where it's defined
in general, we aim to always include the header that's declaring a
function before defining it so that the compiler can check that
prototypes match.

additionally, the internal syscall.h declares __syscall_ret with a
visibility attribute to improve code generation for shared libc (to
prevent gratuitous GOT-register loads). this declaration should be
visible at the point where __syscall_ret is defined, too, or the
inconsistency could theoretically lead to problems at link-time.
2014-03-23 20:42:05 -04:00
Rich Felker 8afa7cf5d0 release 1.0.0 2014-03-20 04:41:15 -04:00
Rich Felker b427d847f4 remove claim of XSI coverage from README
in addition to the dbm functions (which we don't intent to implement
anyway), fmtmsg is still missing too. rather than adding exceptions I
think it's best just to avoid making the claim.
2014-03-20 04:15:47 -04:00
Rich Felker 4b0f39cb53 update README in preparation for release
reduces the amount of news-like content on progress and development
direction and focuses on the present.
2014-03-20 02:24:10 -04:00
Rich Felker cec05e0429 update INSTALL file with new information and better advice
the text covering an ill-advised procedure for 'bootstrapping' a new
musl-based system in-place is removed. new information on targets and
compilers is added. formatting improved. the remaining text is
adjusted to cover both usage with musl-gcc on a non-musl-based system
and upgrading a musl-based system or toolchain.
2014-03-20 00:55:28 -04:00
Rich Felker 4ed1d0a908 update COPYRIGHT file with additional contributor information 2014-03-20 00:34:19 -04:00
Rich Felker 9505bfbc40 fix signal.h breakage from moving stack_t to arch-specific bits
in the previous changes, I missed the fact that both the prototype of
the sigaltstack function and the definition of ucontext_t depend on
stack_t.
2014-03-18 23:27:45 -04:00
Rich Felker 12f37cdee5 fix mips stack_t
like almost everything on mips, this is gratuitously different.
2014-03-18 23:13:56 -04:00
Rich Felker bd5f221eaa move signal.h definition of stack_t to arch-specific bits
it's different at least on mips. mips version will be fixed in a
separate commit to show the change.
2014-03-18 23:12:40 -04:00
Rich Felker 25faa2034d fix mips sigsetjmp asm to match fixed jmp_buf size
this was missed in the previous commit.
2014-03-18 22:48:22 -04:00
Rich Felker 40d58b44d0 fix typo in filename used in sh port 2014-03-18 22:11:14 -04:00
Rich Felker cee45f9cb2 fix size of mips jmp_buf
the excess space was unused and unintentional. this change does not
affect the ABI between applications and libc. while it does
theoretically affect linkage between third-party translation units
using jmp_buf as part of a structure, we've already changed jmp_buf at
least once on all archs, and problems were never observed, likely
because such usage would be very unusual. in any case it's best to get
things right now rather than making changes sometime during the 1.0.x
series or later.
2014-03-18 21:52:24 -04:00
Rich Felker d444064d5a remove useless and incorrect uc_regspace member from mips ucontext_t
this seems to have been copied erroneously from the arm version of the
file. it's fairly harmless but it's a mistake and better to fix now
than later.
2014-03-18 21:37:05 -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 f162c064ab make configure accept alternate gcc tuples for x32
the previous pattern required "x32" to be used as the second field of
the gcc tuple, which is usually reserved for vendor use and not
appropriate as an ABI specifier. with this change, putting "x32" at
the end of the tuple, the way ABI specifiers are normally done, is
also permitted.
2014-03-17 17:38:22 -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 514c2dd24f fix socket.h struct msghdr member types on powerpc
these were incorrectly copied from the kernel, whose ABI matches the
POSIX requirements but with the wrong underlying types and wrong
signedness.
2014-03-11 17:21:38 -04:00
Rich Felker ad66ae93d0 fix sysvipc structures on powerpc
these have been wrong for a long time and were never detected or
corrected. powerpc needs some gratuitous extra padding/reserved slots
in ipc_perm, big-endian ordering for the padding of time_t slots that
was intended by the kernel folks to allow a transition to 64-bit
time_t, and some minor gratuitous reordering of struct members.
2014-03-11 17:01:34 -04:00
Rich Felker f6e2f7e13f move struct semid_ds to from shared sys/sem.h to bits
the definition was found to be incorrect at least for powerpc, and
fixing this cleanly requires making the definition arch-specific. this
will allow cleaning up the definition for other archs to make it more
specific, and reversing some of the ugliness (time_t hacks) introduced
with the x32 port.

this first commit simply copies the existing definition to each arch
without any changes. this is intentional, to make it easier to review
changes made on a per-arch basis.
2014-03-11 15:27:13 -04:00
Rich Felker 9743a399bf fix incorrect rounding in printf floating point corner cases
the printf floating point formatting code contains an optimization to
avoid computing digits that will be thrown away by rounding at the
specified (or default) precision. while it was correctly retaining all
places up to the last decimal place to be printed, it was not
retaining enough precision to see the next nonzero decimal place in
all cases. this could cause incorrect rounding down in round-to-even
(default) rounding mode, for example, when printing 0.5+DBL_EPSILON
with "%.0f".

in the fix, LDBL_MANT_DIG/3 is a lazy (non-sharp) upper bound on the
number of zeros between any two nonzero decimal digits.
2014-03-09 03:09:49 -04:00
Rich Felker ba231cf9e5 fix buffer overflow in printf formatting of denormals with low bit set
empirically the overflow was an off-by-one, and it did not seem to be
overwriting meaningful data. rather than simply increasing the buffer
size by one, however, I have attempted to make the size obviously
correct in terms of bounds on the number of iterations for the loops
that fill the buffer. this still results in no more than a negligible
size increase of the buffer on the stack (6-7 32-bit slots) and is a
"safer" fix unless/until somebody wants to do the proof that a smaller
buffer would suffice.
2014-03-09 01:38:52 -05:00
Rich Felker 73f5b09605 in sys/procfs.h, avoid using __WORDSIZE macro
this was problematic because several archs don't define __WORDSIZE. we
could add it, but I would rather phase this macro out in the long
term. in our version of the headers, UINTPTR_MAX is available here, so
just use it instead.
2014-03-08 00:50:19 -05:00
Rich Felker e12fda3bff add bits/user.h for sh port
this seems to have been overlooked, and resulted in breakage in
anything including sys/user.h.
2014-03-08 00:14:33 -05:00
Rich Felker b576766d51 in fcntl, use unsigned long instead of long for variadic argument type
neither is correct; different commands take different argument types,
and some take no arguments at all. I have a much larger overhaul of
fcntl prepared to address this, but it's not appropriate to commit
during freeze.

the immediate problem being addressed affects forward-compatibility on
x32: if new commands are added and they take pointers, but the
libc-level fcntl function is not aware of them, using long would
sign-extend the pointer to 64 bits and give the kernel an invalid
pointer. on the kernel side, the argument to fcntl is always treated
as unsigned long, so no harm is done by treating possibly-signed
integer arguments as unsigned. for every command that takes an integer
argument except for F_SETOWN, large integer arguments and negative
arguments are handled identically anyway. in the case of F_SETOWN, the
kernel is responsible for converting the argument which it received as
unsigned long to int, so the sign of negative arguments is recovered.

the other problem that will be addressed later is that the type passed
to va_arg does not match the type in the caller of fcntl. an advanced
compiler doing cross-translation-unit analysis could potentially see
this mismatch and issue warnings or otherwise make trouble.

on i386, this patch was confirmed not to alter the code generated by
gcc 4.7.3. in principle the generated code should not be affected on
any arch except x32.
2014-03-07 23:56:48 -05:00
Rich Felker 1154e7c9db update copyright dates to 2014 2014-03-06 18:59:51 -05:00
Rich Felker abdd2e48df fix strerror on mips: one error code is out of the 8-bit table range
if we ever encounter other targets where error codes don't fit in the
8-bit range, the table should probably just be bumped to 16-bit, but
for now I don't want to increase the table size on all archs just
because of a bug in the mips abi.
2014-03-05 16:08:56 -05:00
Rich Felker 0b8f0c57c0 improve configure's target arch matching
most notably, it was failing to match sh4-*, etc., but in general the
explicit matching of hyphens for some archs was problematic because it
failed to accept simply the musl-style arch name (without a gcc-style
tuple) as an input. the original motivation of matching hyphens was to
prevent incorrectly identifying a 64-bit arch as the corresponding
32-bit arch (e.g. mips* matching mips64) but this is easily fixed by
simply checking (and for now, rejecting as unsupported) the relevant
64-bit archs.
2014-02-28 13:12:40 -05:00
Rich Felker 3d7f5c363e fix missing CFLAGS in configure test for float on sh 2014-02-28 00:09:55 -05:00
Rich Felker 946b9fad03 fix copy-and-paste error in configure's IEEE double check for sh 2014-02-27 23:55:04 -05:00
Rich Felker b1683a1d6a add nofpu subarchs to the sh arch, and properly detect compiler's fpu config 2014-02-27 23:18:42 -05:00
Rich Felker 5c27c4458f fix endian subarchs for sh arch
default endianness for sh on linux is little, and while conventions
vary, "eb" seems to be the most widely used suffix for big endian.
2014-02-27 22:20:44 -05:00
Rich Felker aacd348637 rename superh port to "sh" for consistency
linux, gcc, etc. all use "sh" as the name for the superh arch. there
was already some inconsistency internally in musl: the dynamic linker
was searching for "ld-musl-sh.path" as its path file despite its own
name being "ld-musl-superh.so.1". there was some sentiment in both
directions as to how to resolve the inconsistency, but overall "sh"
was favored.
2014-02-27 22:03:25 -05:00
Rich Felker b9f7f2e876 fix readdir not to set ENOENT when directory is removed while reading
per POSIX, ENOENT is reserved for invalid stream position; it is an
optional error and would only happen if the application performs
invalid seeks on the underlying file descriptor. however, linux's
getdents syscall also returns ENOENT if the directory was removed
between the time it was opened and the time of the read. we need to
catch this case and remap it to simple end-of-file condition (null
pointer return value like an error, but no change to errno). this
issue reportedly affects GNU make in certain corner cases.

rather than backing up and restoring errno, I've just changed the
syscall to be made in a way that doesn't affect errno (via an inline
syscall rather than a call to the __getdents function). the latter
still exists for the purpose of providing the public getdents alias
which sets errno.
2014-02-25 13:05:38 -05:00
Rich Felker e7837ec79f add missing sub files for mipsel-sf to use softfloat code
the build system has no automatic way to know this code applies to
both big (default) and little endian variants, so explicit .sub files
are needed.
2014-02-24 17:31:00 -05:00
Rich Felker 744f11897a make the x32 port use the correct ld-musl-x32.path filename
previously it was wrongly using the x86_64 one, precluding having both
x32 and x86_64 libs present on the same system.
2014-02-23 23:20:18 -05:00
Rich Felker d8b587796f mostly-cosmetic fixups to x32 port merge 2014-02-23 05:43:09 -05:00
Rich Felker dc01e2cbfb add fallback emulation for accept4 on old kernels
the other atomic FD_CLOEXEC interfaces (dup3, pipe2, socket) already
had such emulation in place. the justification for doing the emulation
here is the same as for the other functions: it allows applications to
simply use accept4 rather than having to have their own fallback code
for ENOSYS/EINVAL (which one you get is arch-specific!) and there is
no reasonable way an application could benefit from knowing the
operation is emulated/non-atomic since there is no workaround at the
application level for non-atomicity (that is the whole reason these
interfaces were added).
2014-02-21 22:25:26 -05:00
Rich Felker fdb3efa5dd add flock64 alias for (struct) flock in fcntl.h
this was a missing part of the LFS64 API; it's "needed" for use with
fcntl and the corresponding lock commands.
2014-02-18 11:04:15 -05:00
Rich Felker 3e02ce1b41 add ipv6 and icmpv6 to getprotoent-family functions
based on patch by orc.
2014-02-13 12:27:40 -05:00
Rich Felker eb375ef795 fix typo in table for getprotoent that caused out-of-bound reads
this was unlikely to lead to any crash or dangerous behavior, but
caused adjacent string constants to be treated as part of the
protocols table, possibly returning nonsensical results for unknown
protocol names/numbers or when getprotoent was called in a loop to
enumerate all protocols.
2014-02-13 12:24:40 -05:00
Rich Felker 8011614da0 make posix_spawn accept null pid pointer arguments
this is a requirement in the specification that was overlooked.
2014-02-12 01:03:07 -05:00
Rich Felker 758ab35a16 in fdopen, avoid setting O_APPEND flag if it's already set
this saves a syscall in the case where the underlying open already
took place with O_APPEND, which is common because fopen with append
modes sets O_APPEND at the time of open before passing the file
descriptor to __fdopen.
2014-02-07 01:16:53 -05:00
Rich Felker 3af2edee15 fix ftello result for append streams with unflushed output
when there is unflushed output, ftello (and ftell) compute the logical
stream position as the underlying file descriptor's offset plus an
adjustment for the amount of buffered data. however, this can give the
wrong result for append-mode streams where the unflushed writes should
adjust the logical position to be at the end of the file, as if a seek
to end-of-file takes place before the write.

the solution turns out to be a simple trick: when ftello (indirectly)
calls lseek to determine the current file offset, use SEEK_END instead
of SEEK_CUR if the stream is append-mode and there's unwritten
buffered data.

the ISO C rules regarding switching between reading and writing for a
stream opened in an update mode, along with the POSIX rules regarding
switching "active handles", conveniently leave undefined the
hypothetical usage cases where this fix might lead to observably
incorrect offsets.

the bug being fixed was discovered via the test case for glibc issue
2014-02-07 00:57:50 -05:00
Rich Felker 89511cd943 reduce namespace pollution in netinet/udp.h
the affected part of the header is responsible for providing both GNU
and BSD versions of the udphdr structure. previously, the
namespace-polluting GNU names were always used for the actual struct
members, and the BSD names, which are named in a manner resembling a
sane namespace, were always macros defined to expand to the GNU names.
now, unless _GNU_SOURCE is defined, the BSD names are used as the
actual structure members, and the macros and GNU names only come into
play when the application requests them.
2014-02-05 17:25:39 -05:00
Rich Felker 685b1cd4a0 fix use of legacy u_intN_t types in netinet/tcp.h
policy is to avoid using these types except where they are needed for
namespace conformance. C99-style stdint.h types should be used
instead.
2014-02-05 17:22:26 -05:00
Rich Felker fdaaa68d82 add support for BSD struct tcphdr in netinet/tcp.h
there are two versions of this structure: the BSD version and the GNU
version. previously only the GNU version was supported. the only way
to support both simultaneously is with an anonymous union, which was a
nonstandard extension prior to C11, so some effort is made to avoid
breakage with compilers which do not support anonymous unions.

this commit is based on a patch by Timo Teräs, but with some changes.
in particular, the GNU version of the structure is not exposed unless
_GNU_SOURCE is defined; this both avoids namespace pollution and
dependency on anonymous unions in the default feature profile.
2014-02-05 16:55:30 -05:00
Rich Felker ad87c2eecf add nonstandard timespec/timeval conversion macros in sys/time.h
these are poorly designed (illogical argument order) and even poorly
implemented (brace issues) on glibc, but unfortunately some software
is using them. we could consider removing them again in the future at
some point if they're documented as deprecated, but for now the
simplest thing to do is just to provide them under _GNU_SOURCE.
2014-02-05 16:34:23 -05: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 59314304a0 add version.h to .gitignore; it is a generated file 2014-01-21 01:06:42 -05:00
Rich Felker 69003e0590 fix crash in dynamic linker when certain copy relocations are unsatisfied
STB_WEAK is only a weak reference for undefined symbols (those with a
section of SHN_UNDEF). otherwise, it's a weak definition. normally
this distinction would not matter, since a relocation referencing a
symbol that also provides a definition (not SHN_UNDEF) will always
succeed in finding the referenced symbol itself. however, in the case
of copy relocations, the referenced symbol itself is ignored in order
to search for another symbol to copy from, and thus it's possible that
no definition is found. in this case, if the symbol being resolved
happened to be a weak definition, it was misinterpreted as a weak
reference, suppressing the error path and causing a crash when the
copy relocation was performed with a null source pointer passed to
memcpy.

there are almost certainly still situations in which invalid
combinations of symbol and relocation types can cause the dynamic
linker to crash (this is pretty much inevitable), but the intent is
that crashes not be possible for symbol/relocation tables produced by
a valid linker.
2014-01-21 00:36:35 -05:00
Rich Felker 7cbb6f70c8 fix system breakage window during make install due to permissions
install.sh was wrongly waiting until after atomically replacing the
old file to set the correct permissions on the new file. in the case
of the dynamic linker, this would cause a dynamic-linked chmod command
not to run (due to missing executable permissions on the dynamic
linker) and thus leave the system in an unusable state.

even if chmod is static-linked, the old behavior had a race window
where dynamic-linked programs could fail to run.
2014-01-15 22:29:13 -05:00
Rich Felker 50a50988d5 remove more unnecessary operand-size suffixes from x86_64 atomic.h 2014-01-15 21:48:44 -05:00
Rich Felker 311736516e remove gratuitous temp vars, casts, and suffixes in x86_64 atomic.h
aside from general cleanup, this should allow the identical atomic.h
file to be used for the upcoming x32 port.
2014-01-11 19:37:09 -05:00
Rich Felker f29e834d98 remove size suffix in x86_64 __pthread_self asm
the operand size is unnecessary, since the assembler knows it from the
destination register size. removing the suffix makes it so the same
code should work for x32.
2014-01-11 11:23:10 -05:00
Rich Felker 7acbbdfd5d make type of st_dev explicitly dev_t in x86_64 stat.h
otherwise it's unclear that it's correct. aside from that, it makes
for a gratuitous difference between the x86_64 header and the upcoming
x32 header.
2014-01-11 11:20:01 -05:00
Rich Felker 513136efa4 fix namespace violation in sys/shm.h
in fixing this, I've changed the logic from ugly #if/#else blocks
inside the struct shm_info definition to a fixed struct definition and
optional macros to rename the elements. this will be helpful if we
need to move shm_info to a bits header in the future, as it will keep
the feature test logic out of bits.
2014-01-08 19:39:18 -05:00
Rich Felker a1527a0c3e fix namespace violations in utmpx.h 2014-01-08 19:36:29 -05:00
Rich Felker d18df33cb1 add IUTF8 to termios.h on archs that were missing it 2014-01-08 19:27:56 -05:00
Rich Felker a627eb3586 fix namespace violations in termios.h, at least mostly
the fix should be complete on archs that use the generic definitions
(i386, arm, x86_64, microblaze), but mips and powerpc have not been
checked thoroughly and may need more fixes.
2014-01-08 19:20:55 -05:00
Rich Felker acde013522 fix remaining known namespace violations for netinet/in.h
the imr_, imsf_, ip6_, ip6m_, ipi_, ipi6_, SCM_, and SOL_ prefixes are
not in the reserved namespace for this header. thus the constants and
structures using them need to be protected under appropriate feature
test macros.

this also affects some headers which are permitted to include
netinet/in.h, particularly netdb.h and arpa/inet.h.

the SOL_ macros are moved to sys/socket.h where they are in the
reserved namespace (SO*). they are still accessible via netinet/in.h
since it includes sys/socket.h implicitly (which is permitted).

the SCM_SRCRT macro is simply removed, since the definition used for
it, IPV6_RXSRCRT is not defined anywhere. it could be re-added, this
time in sys/socket.h, if the appropriate value can be determined;
however, given that the erroneous definition was not caught, it is
unlikely that any software actually attempts to use SCM_SRCRT.
2014-01-08 18:54:33 -05:00
Rich Felker 8e776e3ed4 fix inadvertent use of struct in place of union for semun 2014-01-08 17:37:05 -05:00
Rich Felker 289294220f fix type of semctl variadic argument
per POSIX, the variadic argument has type union semun, which may
contain a pointer or int; the type read depends on the command being
issued. this allows the userspace part of the implementation to be
type-correct without requiring special-casing for different commands.
the kernel always expects to receive the argument interpreted as
unsigned long (or equivalently, a pointer), and does its own handling
of extracting the int portion from the representation, as needed.

this change fixes two possible issues: most immediately, reading the
argument as a (signed) long and passing it to the syscall would
perform incorrect sign-extension of pointers on the upcoming x32
target. the other possible issue is that some archs may use different
(user-space) argument-passing convention for unions, preventing va_arg
from correctly obtaining the argument when the type long (or even
unsigned long or void *) is passed to it.
2014-01-08 16:12:47 -05:00
Rich Felker 131871a3d8 in fcntl, avoid passing pointer arguments to syscalls as longs
really, fcntl should be changed to use the correct type corresponding
to cmd when calling va_arg, and to carry the correct type through
until making the syscall. however, this greatly increases binary size
and does not seem to offer any benefits except formal correctness, so
I'm holding off on that change for now.

the minimal changes made in this patch are in preparation for addition
of the x32 port, where the syscall macros need to know whether their
arguments are pointers or integers in order to properly pass them to
the 64-bit kernel.
2014-01-08 02:18:06 -05:00
Rich Felker 1d23b3c913 fix const-correctness of argument to stime
it's unclear what the historical signature for this function was, but
semantically, the argument should be a pointer to const, and this is
what glibc uses. correct programs should not be using this function
anyway, so it's unlikely to matter.
2014-01-07 03:02:14 -05:00
Rich Felker 74998fbec1 fix signedness of pgoff argument to remap_file_pages
both the kernel and glibc agree that this argument is unsigned; the
incorrect type ssize_t came from erroneous man pages.
2014-01-07 02:58:28 -05:00
Rich Felker 3500555db3 fix const-correctness in sigandset/sigorset arguments
this change is consistent with the corresponding glibc functions and
is semantically const-correct. the incorrect argument types without
const seem to have been taken from erroneous man pages.
2014-01-07 02:50:34 -05:00
Rich Felker 2c5e756025 remove sys/sysctl.h
this functionality has essentially always been deprecated in linux,
and was never supported by musl. the presence of the header was
reported to cause some software to attempt to use the nonexistant
function, so removing the header is the cleanest solution.
2014-01-07 02:44:47 -05:00
Rich Felker 2750337379 fix incorrect type for wd argument of inotify_rm_watch
this was wrong since the original commit adding inotify, and I don't
see any explanation for it. not even the man pages have it wrong. it
was most likely a copy-and-paste error.
2014-01-07 02:41:27 -05:00
Rich Felker dbe221ecff fix argument types for legacy function inet_makeaddr
the type int was taken from seemingly erroneous man pages. glibc uses
in_addr_t (uint32_t), and semantically, the arguments should be
unsigned.
2014-01-06 22:17:24 -05:00
Rich Felker eca335fc04 eliminate explicit (long) casts when making syscalls
this practice came from very early, before internal/syscall.h defined
macros that could accept pointer arguments directly and handle them
correctly. aside from being ugly and unnecessary, it looks like it
will be problematic when we add support for 32-bit ABIs on archs where
registers (and syscall arguments) are 64-bit, e.g. x32 and mips n32.
2014-01-06 22:05:54 -05:00
Rich Felker 839cc4e6da const-qualify the address argument to dladdr
this agrees with implementation practice on glibc and BSD systems, and
is the const-correct way to do things; it eliminates warnings from
passing pointers to const. the prototype without const came from
seemingly erroneous man pages.
2014-01-06 22:03:38 -05:00
Rich Felker 1e7a581ad6 add some missing LFS64 aliases for fadvise/fallocate functions 2014-01-06 21:31:17 -05:00
Rich Felker b589fb4e29 release 0.9.15 2014-01-03 14:33:44 -05:00
Rich Felker 863d628d93 disable the brk function
the reasons are the same as for sbrk. unlike sbrk, there is no safe
usage because brk does not return any useful information, so it should
just fail unconditionally.
2014-01-02 17:13:19 -05:00
Rich Felker 7a995fe706 disable sbrk for all values of increment except 0
use of sbrk is never safe; it conflicts with malloc, and malloc may be
used internally by the implementation basically anywhere. prior to
this change, applications attempting to use sbrk to do their own heap
management simply caused untrackable memory corruption; now, they will
fail with ENOMEM allowing the errors to be fixed.

sbrk(0) is still permitted as a way to get the current brk; some
misguided applications use this as a measurement of their memory
usage or for other related purposes, and such usage is harmless.

eventually sbrk may be re-added if/when malloc is changed to avoid
using the brk by using mmap for all allocations.
2014-01-02 17:03:34 -05:00
Rich Felker 18144af297 implement legacy function herror
based on patch by Timo Teräs; greatly simplified to use fprintf.
2013-12-20 11:56:16 -05:00
Rich Felker e36d8a1d74 add sys/quota.h and quotactl syscall wrapper
based on patch by Timo Teräs.
2013-12-20 11:52:10 -05:00