Commit Graph

3528 Commits

Author SHA1 Message Date
Rich Felker
adfe682eb0 fix mrand48/jrand48 return value on 64-bit archs
POSIX specifies the result to have signed 32-bit range. on 32-bit
archs, the implicit conversion to long achieved the desired range
already, but when long is 64-bit, a cast is needed.

patch by Ed Schouten.
2016-12-16 23:23:10 -05:00
Quentin Rameau
bfcf5735d0 in public headers, don't assume pre-C99 compilers have __inline keyword 2016-12-16 23:12:32 -05:00
Bobby Bingham
c1020cf21e fix crashing sigsetjmp on s390x
the bz instruction that was wrongly used only admits a small immediate
displacement and cannot be used with external symbols; apparently the
linker fails to diagnose the overflow.
2016-12-16 22:39:19 -05:00
Bobby Bingham
3f79eaa870 fix use of incomplete struct type in s390x user.h 2016-12-16 22:36:22 -05:00
Bobby Bingham
afefce19fd fix typo in s390x user.h 2016-12-16 22:34:36 -05:00
Rich Felker
ffaaa6d230 remove legacy i386 fallback stdarg implementation and framework
this has been slated for removal for a long time. there is
fundamentally no way to implement stdarg without compiler assistance;
any attempt to do so has serious undefined behavior; its working
depends not just (as a common misconception goes) on ABI, but also on
assumptions about compiler code generation internal to a translation
unit, which is not subject to external ABI constraints.
2016-12-15 12:18:24 -05:00
Rich Felker
6f1866768a remove largish unused field from pthread structure 2016-12-06 22:57:15 -05:00
Rich Felker
54991729fd work around gdb issues recognizing sigreturn trampoline on x86_64
gdb can only backtrace/unwind across signal handlers if it recognizes
the sa_restorer trampoline. for x86_64, gdb first attempts to
determine the symbol name for the function in which the program
counter resides and match it against "__restore_rt". if no name can be
found (e.g. in the case of a stripped binary), the exact instruction
sequence is matched instead.

when matching the function name, however, gdb's unwind code wrongly
considers the interval [sym,sym+size] rather than [sym,sym+size).
thus, if __restore_rt begins immediately after another function, gdb
wrongly identifies pc as lying within the previous adjacent function.
this patch adds a nop before __restore_rt to preclude that
possibility. it also removes the symbol name __restore and replaces it
with a macro since the stability of whether gdb identifies the
function as __restore_rt or __restore is not clear.

for the no-symbols case, the instruction sequence is changed to use
%rax rather than %eax to match what gdb expects.

based on patch by Szabolcs Nagy, with extended description and
corresponding x32 changes added.
2016-11-12 19:54:43 -05:00
Bobby Bingham
1509494305 add s390x port 2016-11-11 23:06:21 -05:00
Bobby Bingham
54482898ab treat null vdso base same as missing
On s390x, the kernel provides AT_SYSINFO_EHDR, but sets it to zero, if the
program being run does not have a program interpreter.  This causes
problems when running the dynamic linker directly.
2016-11-11 12:58:27 -05:00
Rich Felker
b418ea1b66 generalize ELF hash table types not to assume 32-bit entries
alpha and s390x gratuitously use 64-bit entries (wasting 2x space and
cache utilization) despite the values always being 32-bit.

based on patch by Bobby Bingham, with changes suggested by Alexander
Monakov to use the public Elf_Symndx type from link.h (and make it
properly variable by arch) rather than adding new internal
infrastructure for handling the type.
2016-11-11 12:46:06 -05:00
Rich Felker
4078a5c31f fix build regression on archs with variable page size
commit 31fb174dd2 used
DEFAULT_GUARD_SIZE from pthread_impl.h in a static initializer,
breaking build on archs where its definition, PAGE_SIZE, is not a
constant. instead, just define DEFAULT_GUARD_SIZE as 4096, the minimal
page size on any arch we support. pthread_create rounds up to whole
pages anyway, so defining it to 1 would also work, but a moderately
meaningful value is nicer to programs that use
pthread_attr_getguardsize on default-initialized attribute objects.
2016-11-08 18:03:42 -05:00
Rich Felker
31fb174dd2 add limited pthread_setattr_default_np API to set stack size defaults
based on patch by Timo Teräs:

While generally this is a bad API, it is the only existing API to
affect c++ (std::thread) and c11 (thrd_create) thread stack size.
This patch allows applications only to increate stack and guard
page sizes.
2016-11-08 12:45:03 -05:00
Rich Felker
ea7891a651 fix pthread_create regression from stack/guard size simplification
commit 33ce920857 broke pthread_create
in the case where a null attribute pointer is passed; rather than
using the default sizes, sizes of 0 (plus the remainder of one page
after TLS/TCB use) were used.
2016-11-08 11:51:57 -05:00
Rich Felker
04983f2272 make netinet/in.h suppress clashing definitions from kernel headers
the linux kernel uapi headers provide their own definitions of the
structures from netinet/in.h, resulting in errors when a program
includes both the standard libc header and one or more of the
networking-related kernel headers that pull in the kernel definitions.

as before, we do not attempt to support the case where kernel headers
are included before the libc ones, since the kernel definitions may
have subtly incorrect types, namespace violations, etc. however, we
can easily support the inclusion of the kernel headers after the libc
ones, since the kernel headers provide a public interface for
suppressing their definitions. this patch adds the necessary macro
definitions for such suppression.
2016-11-07 23:19:19 -05:00
Rich Felker
33ce920857 simplify pthread_attr_t stack/guard size representation
previously, the pthread_attr_t object was always initialized all-zero,
and stack/guard size were represented as differences versus their
defaults. this required lots of confusing offset arithmetic everywhere
they were used. instead, have pthread_attr_init fill in the default
values, and work with absolute sizes everywhere.
2016-11-07 20:47:24 -05:00
Rich Felker
7442442ccc fix swprintf internal buffer state and error handling
the swprintf write callback never reset its buffer pointers, so after
its 256-byte buffer filled up, it would keep repeating those bytes
over and over in the output until the destination buffer filled up. it
also failed to set the error indicator for the stream on EILSEQ,
potentially allowing output to continue after the error.
2016-11-07 20:39:59 -05:00
Daniel Sabogal
bc1e7731ce fix integer overflow of tm_year in __secs_to_tm
the overflow check for years+100 did not account for the extra
year computed from the remaining months. instead, perform this
check after obtaining the final number of years.
2016-11-07 13:00:54 -05:00
Szabolcs Nagy
5ffe515ca4 fix ldso reserved library name handling
If a DT_NEEDED entry was the prefix of a reserved library name
(up to the first dot) then it was incorrectly treated as a libc
reserved name.

e.g. libp.so dependency was not loaded as it matched libpthread
reserved name.
2016-11-07 12:00:32 -05:00
Szabolcs Nagy
86e8cc0fd4 fix accidental global static pointer in ldso
this was harmless as load_library is not called concurrently,
but it used one word of bss.
2016-11-07 11:59:58 -05:00
Rich Felker
c8fdcfe550 don't claim support for resolv.h APIs that aren't supported
the value 19991006 for __RES implies availability of res_ninit and
related functions that take a resolver state argument; these are not
supported since our resolver is stateless. instead claim support for
just the older API by defining __RES to 19960801.

based on patch by Dmitrij D. Czarkoff.
2016-11-07 11:55:53 -05:00
Hannu Nyman
8ca27ac4bf fix parsing of quoted time zone names
Fix parsing of the < > quoted time zone names. Compare the correct
character instead of repeatedly comparing the first character.
2016-11-07 11:54:09 -05:00
Rich Felker
7352b59d68 remove redundant feature test macro checks in sys/time.h
this header is XSI-shaded itself and thus does not need to limit
specific content to _XOPEN_SOURCE.
2016-11-07 11:49:22 -05:00
Rich Felker
ed86967425 redesign snprintf without undefined behavior
the old snprintf design setup the FILE buffer pointers to point
directly into the destination buffer; if n was actually larger than
the buffer size, the pointer arithmetic to compute the buffer end
pointer was undefined. this affected sprintf, which is implemented in
terms of snprintf, as well as some unusual but valid direct uses of
snprintf.

instead, setup the FILE as unbuffered and have its write function
memcpy to the destination. the printf core sets up its own temporary
buffer for unbuffered streams.
2016-10-21 22:15:31 -04:00
Rich Felker
7597fc25a2 fix various header namespace issues under feature-test-macro control
reported and changes suggested by Daniel Sabogal.
2016-10-20 17:20:01 -04:00
Rich Felker
2ed4e9d927 remove parameter names from public headers
inclusion of these names was unintentional and in most cases is a
namespace violation. Daniel Sabogal tracked down and reported these.
2016-10-20 17:04:37 -04:00
Rich Felker
4b8f94c250 fix misspelling of a legacy macro name in sys/param.h 2016-10-20 17:01:56 -04:00
Daniel Sabogal
71e8392765 add missing if_ether.h constants
ETH_P_HSR (IEC 62439-3 HSRv1) added in
linux 4.7 commit ee1c27977284907d40f7f72c2d078d709f15811f

ETH_P_TSN (IEEE 1722) added in
linux 4.3 commit 1ab1e895492d8084dfc1c854efacde219e56b8c1
this constant breaks the ascending order to match the kernel header

ETH_P_XDSA (Multiplexed DSA protocol) added in
linux 3.18 commit 3e8a72d1dae374cf6fc1dba97cec663585845ff9
2016-10-20 16:55:57 -04:00
Daniel Sabogal
79c7ded0ed add missing if_arp.h constant
ARPHRD_6LOWPAN (IPv6 over LoWPAN) added in
linux 3.14 commit 0abc652c796dab74d34d60473ec5594cd21620be
2016-10-20 16:55:51 -04:00
Daniel Sabogal
1fa2a32d1e fix typo in utmpx.h 2016-10-20 16:55:32 -04:00
Daniel Sabogal
104e8a0e3b add missing confstr constants
the _CS_V6_ENV and _CS_V7_ENV constants are required to be available for use
with confstr. glibc defines these constants with values 1148 and 1149,
respectively.

the only missing (and required) confstr constants are
_CS_POSIX_V7_THREADS_CFLAGS and _CS_POSIX_V7_THREADS_LDFLAGS which remain
unavailable in glibc.
2016-10-20 16:55:05 -04:00
Rich Felker
e314258e2f fix minor problem in previous strtod non-nearest rounding bug fix
commit 6ffdc4579f set lnz in the code
path for non-zero digits after a huge string of zeros, but the
assignment of dc to lnz truncates if the value of dc does not fit in
int; this is possible for some pathologically long inputs, either via
strings on 64-bit systems or via scanf-family functions.

instead, simply set lnz to match the point at which we add the
artificial trailing 1 bit to simulate nonzero digits after a huge
run of zeros.
2016-10-20 14:40:59 -04:00
Szabolcs Nagy
6ffdc4579f fix strtod int optimization in non-nearest rounding mode
the mid-sized integer optimization relies on lnz set up properly
to mark the last non-zero decimal digit, but this was not done
if the non-zero digit lied outside the KMAX digits of the base
10^9 number representation.

so if the fractional part was a very long list of zeros (>2048*9 on
x86) followed by non-zero digits then the integer optimization could
kick in discarding the tiny non-zero fraction which can mean wrong
result on non-nearest rounding mode.

strtof, strtod and strtold were all affected.
2016-10-20 13:29:34 -04:00
Szabolcs Nagy
d184a09e05 fix strtod and strtof rounding with many trailing zeros
in certain cases excessive trailing zeros could cause incorrect
rounding from long double to double or float in decfloat.

e.g. in strtof("9444733528689243848704.000000", 0) the argument
is 0x1.000001p+73, exactly halfway between two representible floats,
this incorrectly got rounded to 0x1.000002p+73 instead of 0x1p+73,
but with less trailing 0 the rounding was fine.

the fix makes sure that the z index always points one past the last
non-zero digit in the base 10^9 representation, this way trailing
zeros don't affect the rounding logic.
2016-10-20 13:29:09 -04:00
Rich Felker
f33b175850 fix gratuitous undefined behavior in strptime
accessing an object of type const char *restrict as if it had type
char * is not defined.
2016-10-20 13:22:20 -04:00
Rich Felker
b24f1d2520 fix getopt_long_only misinterpreting "--" as an option 2016-10-20 12:13:33 -04:00
Szabolcs Nagy
51ab6db4ed fix float formatting of some exact halfway cases
in nearest rounding mode exact halfway cases were not following the
round to even rule if the rounding happened at a base 1000000000 digit
boundary of the internal representation and the previous digit was odd.

e.g. printf("%.0f", 1.5) printed 1 instead of 2.
2016-10-20 01:54:15 -04:00
Felix Janda
8fb28b0b3e add pthread_setname_np
the thread name is displayed by gdb's "info threads".
2016-10-20 01:48:27 -04:00
Daniel Sabogal
3ca2d2d4ae fix clock_nanosleep error case
posix requires that EINVAL be returned if the first parameter specifies
the cpu-time clock of the calling thread (CLOCK_THREAD_CPUTIME_ID).
linux returns ENOTSUP instead so we handle this.
2016-10-20 01:36:08 -04:00
Szabolcs Nagy
688d3da0f1 math: fix pow signed shift ub
j is int32_t and thus j<<31 is undefined if j==1, so j is changed to
uint32_t locally as a quick fix, the generated code is not affected.

(this is a strict conformance fix, future c standard may allow 1<<31,
see DR 463.  the bug was inherited from freebsd fdlibm, the proper fix
is to use uint32_t for all bit hacks, but that requires more intrusive
changes.)

reported by Daniel Sabogal
2016-10-20 01:32:27 -04:00
Szabolcs Nagy
87643335ac update icmphdr struct following linux v4.8
add union field that is used in the kernel for SIT/GRE tunneling ICMPv4
messages. see linux commit 20e1954fe238dbe5f8d3a979e593fe352bd703cf
2016-10-20 01:29:06 -04:00
Szabolcs Nagy
cc7c95e98e add TCP_REPAIR_WINDOW to netinet/tcp.h from linux v4.8
another kernel internal state exposure for checkpoint-restore.
see linux commit b1ed4c4fa9a5ccf325184fd90edc50978ef6e33a
2016-10-20 01:28:44 -04:00
Szabolcs Nagy
fe39aaae0e add bits/hwcap.h and include it in sys/auxv.h
aarch64, arm, mips, mips64, mipsn32, powerpc, powerpc64 and sh have
cpu feature bits defined in linux for AT_HWCAP auxv entry, so expose
those in sys/auxv.h

it seems the mips hwcaps were never exposed to userspace neither
by linux nor by glibc, but that's most likely an oversight.
2016-10-20 01:28:25 -04:00
Szabolcs Nagy
5a05f67599 elf.h: update EM_ elf machine defines and add R_BPF_ defines
sync with gabi: http://www.sco.com/developers/gabi/latest/ch4.eheader.html

EM_BPF is new in linux v4.8 and officially assigned:
https://lists.iovisor.org/pipermail/iovisor-dev/2016-June/000266.html
added related relocs too.
2016-10-20 01:27:46 -04:00
Szabolcs Nagy
9487cc5f22 add ETH_P_NCSI to netinet/if_ether.h from linux v4.8
see linux commit 6389eaa7fa9c3ee6c7d39f6087b86660d17236ac
2016-10-20 01:27:28 -04:00
Szabolcs Nagy
189acc705e add sh syscall numbers from linux v4.8
sh was updated in linux commit 74bdaa611fa69368fb4032ad437af073d31116bd
to have numbers for new syscalls.
2016-10-20 01:27:24 -04:00
Szabolcs Nagy
2ed811a38a fix preadv2 and pwritev2 syscall numbers on x32 for linux v4.8
the numbers were wrong in musl, but they were also wrong in the kernel
and got fixed in v4.8 commit 3ebfd81f7fb3e81a754e37283b7f38c62244641a
2016-10-20 01:27:07 -04:00
Natanael Copa
05973dc3bb use dynamic buffer for getmntent
overlayfs may have fairly long lines so we use getline to allocate a
buffer dynamically. The buffer will be allocated on first use, expand as
needed, but will never be free'ed.

Downstream bug: http://bugs.alpinelinux.org/issues/5703

Signed-off-by: Natanael Copa <ncopa@alpinelinux.org>
2016-10-20 01:20:27 -04:00
Rich Felker
167dfe9672 fix integer overflows and uncaught EOVERFLOW in printf core
this patch fixes a large number of missed internal signed-overflow
checks and errors in determining when the return value (output length)
would exceed INT_MAX, which should result in EOVERFLOW. some of the
issues fixed were reported by Alexander Cherepanov; others were found
in subsequent review of the code.

aside from the signed overflows being undefined behavior, the
following specific bugs were found to exist in practice:

- overflows computing length of floating point formats with huge
  explicit precisions, integer formats with prefix characters and huge
  explicit precisions, or string arguments or format strings longer
  than INT_MAX, resulted in wrong return value and wrong %n results.

- literal width and precision values outside the range of int were
  misinterpreted, yielding wrong behavior in at least one well-defined
  case: string formats with precision greater than INT_MAX were
  sometimes truncated.

- in cases where EOVERFLOW is produced, incorrect values could be
  written for %n specifiers past the point of exceeding INT_MAX.

in addition to fixing these bugs, we now stop producing output
immediately when output length would exceed INT_MAX, rather than
continuing and returning an error only at the end.
2016-10-20 00:22:09 -04:00
Rich Felker
70d2687d85 fix integer overflow in float printf needed-precision computation
if the requested precision is close to INT_MAX, adding
LDBL_MANT_DIG/3+8 overflows. in practice the resulting undefined
behavior manifests as a large negative result, which is then used to
compute the new end pointer (z) with a wildly out-of-bounds value
(more overflow, more undefined behavior). the end result is at least
incorrect output and character count (return value); worse things do
not seem to happen, but detailed analysis has not been done.

this patch fixes the overflow by performing the intermediate
computation as unsigned; after division by 9, the final result
necessarily fits in int.
2016-10-19 20:17:16 -04:00