oweals/musl.git
4 years agomath: move x86_64 (l)lrint(f) functions to C with inline asm
Alexander Monakov [Fri, 10 Jan 2020 20:06:36 +0000 (23:06 +0300)]
math: move x86_64 (l)lrint(f) functions to C with inline asm

4 years agomath: move i386 sqrt to C with inline asm
Alexander Monakov [Tue, 7 Jan 2020 12:53:03 +0000 (15:53 +0300)]
math: move i386 sqrt to C with inline asm

4 years agomath: move i386 sqrtf to C with inline asm
Alexander Monakov [Mon, 6 Jan 2020 17:31:47 +0000 (20:31 +0300)]
math: move i386 sqrtf to C with inline asm

4 years agomath: move trivial x86-family sqrt functions to C with inline asm
Alexander Monakov [Mon, 6 Jan 2020 16:35:57 +0000 (19:35 +0300)]
math: move trivial x86-family sqrt functions to C with inline asm

4 years agomath: move x87-family fabs functions to C with inline asm
Alexander Monakov [Mon, 6 Jan 2020 08:36:18 +0000 (11:36 +0300)]
math: move x87-family fabs functions to C with inline asm

4 years agomath: move x86_64 fabs, fabsf to C with inline asm
Alexander Monakov [Sun, 5 Jan 2020 15:47:02 +0000 (18:47 +0300)]
math: move x86_64 fabs, fabsf to C with inline asm

4 years agofix parsing offsets after long timezone names
Samuel Holland [Sat, 22 Feb 2020 22:01:13 +0000 (16:01 -0600)]
fix parsing offsets after long timezone names

TZ containg a timezone name with >TZNAME_MAX characters currently
breaks musl's timezone parsing. getname() stops after TZNAME_MAX
characters. getoff() will consume no characters (because the next
character is not a digit) and incorrectly return 0. Then, because
there are remaining alphabetic characters, __daylight == 1, and
dst_off == -3600.

getname() must consume the entire timezone name, even if it will not
fit in d/__tzname, so when it returns, s points to the offset digits.

4 years agoavoid out-of-bounds read for invalid quoted timezone
Samuel Holland [Sat, 22 Feb 2020 22:01:12 +0000 (16:01 -0600)]
avoid out-of-bounds read for invalid quoted timezone

Parsing the timezone name must stop when reaching the null terminator.
In that case, there is no '>' to skip.

4 years agoremove redundant condition in memccpy
Alexander Monakov [Mon, 9 Mar 2020 18:32:16 +0000 (21:32 +0300)]
remove redundant condition in memccpy

Commit d9bdfd164 ("fix memccpy to not access buffer past given size")
correctly added a check for 'n' nonzero, but made the pre-existing test
'*s==c' redundant: n!=0 implies *s==c. Remove the unnecessary check.

Reported by Alexey Izbyshev.

4 years agoldso: remove redundant switch case for REL_NONE
Fangrui Song [Sun, 8 Mar 2020 18:10:32 +0000 (11:10 -0700)]
ldso: remove redundant switch case for REL_NONE

as a result of commit b6a6cd703ffefa6352249fb01f4da28d85d17306,
the REL_NONE case is now redundant.

4 years agodefine MAP_SYNC on powerpc/powerpc64
Samuel Holland [Sat, 14 Mar 2020 05:31:40 +0000 (00:31 -0500)]
define MAP_SYNC on powerpc/powerpc64

Linux defines MAP_SYNC on powerpc and powerpc64 as of commit
22fcea6f85f2 ("mm: move MAP_SYNC to asm-generic/mman-common.h"),
so we can stop undefining it on those architectures.

4 years agoimprove strerror speed
Timo Teräs [Wed, 4 Mar 2020 09:27:01 +0000 (11:27 +0200)]
improve strerror speed

change the current O(n) lookup to O(1) based on the machinery
described in "How To Write Shared Libraries" (Appendix B).

4 years agofix corrupt sysvipc timestamps on 32-bit archs with old kernels
Rich Felker [Fri, 13 Mar 2020 20:27:10 +0000 (16:27 -0400)]
fix corrupt sysvipc timestamps on 32-bit archs with old kernels

kernel commit 4693916846269d633a3664586650dbfac2c5562f (first included
in release v4.14) silently fixed a bug whereby the reserved space
(which was later used for high bits of time) in IPC_STAT structures
was left untouched rather than zeroed. this means that a caller that
wants to read the high bits needs to pre-zero the memory.

since it's not clear that these operations are permitted to modify the
destination buffer on failure, use a temp buffer and copy back to the
caller's buffer on success.

4 years agowork around negated error code bug on some mips kernels
Rich Felker [Wed, 11 Mar 2020 23:02:52 +0000 (19:02 -0400)]
work around negated error code bug on some mips kernels

on all mips variants, Linux did (and maybe still does) have some
syscall return paths that wrongly return both the error flag in r7 and
a negated error code in r2. in particular this happened for at least
some causes of ENOSYS.

add an extra check to only negate the error code if it's positive to
begin with.

bug report and concept for patch by Andreas Dröscher.

4 years agoremove useless mips syscall asm constraint, align style with mips64/n32
Rich Felker [Wed, 11 Mar 2020 22:58:38 +0000 (18:58 -0400)]
remove useless mips syscall asm constraint, align style with mips64/n32

commit 4221f154ff29ab0d6be1e7beaa5ea2d1731bc58e added the r7
constraint apparently out of a misunderstanding of the breakage it was
addressing, and did so because the asm was in a shared macro used by
all the __syscallN inline functions. now "+r" is used in the output
section for the forms 4-argument and up, so having it in input is
redundant, and the forms with 0-3 arguments don't need it as an input
at all.

the r2 constraint is kept because without it most gcc versions (seems
to be all prior to 9.x) fail to honor the output register binding for
r2. this seems to be a variant of gcc bug #87733.

both the r7 and r2 input constraints look useless, but the r2 one was
a quiet workaround for gcc bug 87733, which affects all modern
versions prior to 9.x, so it's kept and documented.

4 years agorevert mips (32-bit, o32) syscall asm clean-up due to regressions
Rich Felker [Wed, 11 Mar 2020 22:50:21 +0000 (18:50 -0400)]
revert mips (32-bit, o32) syscall asm clean-up due to regressions

exactly revert commit 604f8d3d8b08ee4f548de193050ef93a7753c2e0 which
was wrong; it caused a major regression on Linux versions prior to
2.6.36. old kernels did not properly preserve r2 across syscall
restart, and instead restarted with the instruction right before
syscall, imposing a contract that the previous instruction must load
r2 from an immediate or a register (or memory) not clobbered by the
syscall.

4 years agorevert mips64/n32 syscall asm clean-up due to regressions
Rich Felker [Wed, 11 Mar 2020 22:43:11 +0000 (18:43 -0400)]
revert mips64/n32 syscall asm clean-up due to regressions

effectivly revert commit ddc7c4f936c7a90781072f10dbaa122007e939d0
which was wrong; it caused a major regression on Linux versions prior
to 2.6.36. old kernels did not properly preserve r2 across syscall
restart, and instead restarted with the instruction right before
syscall, imposing a contract that the previous instruction must load
r2 from an immediate or a register (or memory) not clobbered by the
syscall.

since other changes were made since, including removal of the struct
stat conversion that was replaced by separate struct kstat, this is
not a direct revert, only a functional one.

the "0"(r2) input constraint added back seems useless/erroneous, but
without it most gcc versions (seems to be all prior to 9.x) fail to
honor the output register binding for r2. this seems to be a variant
of gcc bug #87733. further changes should be made later if a better
workaround is found, but this one has been working since 2012. it
seems this issue was encountered but misidentified then, when it
inspired commit 4221f154ff29ab0d6be1e7beaa5ea2d1731bc58e.

4 years agoremove duplicate definitions of INET[6]_ADDRSTRLEN
Rich Felker [Wed, 4 Mar 2020 17:33:35 +0000 (12:33 -0500)]
remove duplicate definitions of INET[6]_ADDRSTRLEN

these were leftover from early beginnings when arpa/inet.h was not
including netinet/in.h.

4 years agoadd PTHREAD_NULL
Rich Felker [Wed, 26 Feb 2020 15:09:32 +0000 (10:09 -0500)]
add PTHREAD_NULL

this is added for POSIX-future as the outcome of Austin Group issue
599. since it's in the reserved namespace for pthread.h, there are no
namespace considerations for adding it early.

4 years agouse __socketcall to simplify socket()
Rich Felker [Sat, 22 Feb 2020 16:07:14 +0000 (11:07 -0500)]
use __socketcall to simplify socket()

commit 59324c8b0950ee94db846a50554183c845ede160 added __socketcall
analogous to __syscall, returning the negated error rather than
setting errno. use it to simplify the fallback path of socket(),
avoiding extern calls and access to errno.

Author: Rich Felker <dalias@aerifal.cx>
Date:   Tue Jul 30 17:51:16 2019 -0400

    make __socketcall analogous to __syscall, error-returning

4 years agoremove wrap_write helper from vdprintf
Rich Felker [Sat, 22 Feb 2020 04:44:20 +0000 (23:44 -0500)]
remove wrap_write helper from vdprintf

this reverts commit 4ee039f3545976f9e3e25a7e5d7b58f1f2316dc3, which
added the helper as a hack to make vdprintf usable before relocation,
contingent on strong assumptions about the arch and tooling, back when
the dynamic linker did not have a real staged model for
self-relocation. since commit f3ddd173806fd5c60b3f034528ca24542aecc5b9
this has been unnecessary and the function was just wasting size and
execution time.

4 years agomath: fix sinh overflows in non-nearest rounding
Szabolcs Nagy [Mon, 20 Jan 2020 20:38:45 +0000 (20:38 +0000)]
math: fix sinh overflows in non-nearest rounding

The final rounding operation should be done with the correct sign
otherwise huge results may incorrectly get rounded to or away from
infinity in upward or downward rounding modes.

This affected sinh and sinhf which set the sign on the result after
a potentially overflowing mul. There may be other non-nearest rounding
issues, but this was a known long standing issue with large ulp error
(depending on how ulp is defined near infinity).

The fix should have no effect on sinh and sinhf performance but may
have a tiny effect on cosh and coshf.

4 years agomath: fix __rem_pio2 in non-nearest rounding modes
Szabolcs Nagy [Sat, 18 Jan 2020 17:55:25 +0000 (17:55 +0000)]
math: fix __rem_pio2 in non-nearest rounding modes

Handle when after reduction |y| > pi/4+tiny. This happens in directed
rounding modes because the fast round to int code does not give the
nearest integer. In such cases the reduction may not be symmetric
between x and -x so e.g. cos(x)==cos(-x) may not hold (but polynomial
evaluation is not symmetric either with directed rounding so fixing
that would require more changes with bigger performance impact).

The fix only adds two predictable branches in nearest rounding mode,
simple ubenchmark does not show relevant performance regression in
nearest rounding mode.

The code could be improved: e.g reducing the medium size threshold
such that two step reduction is enough instead of three, and the
single precision case can avoid the issue by doing the round to int
differently, but this fix was kept minimal.

4 years agorelease 1.2.0 v1.2.0
Rich Felker [Fri, 21 Feb 2020 00:37:02 +0000 (19:37 -0500)]
release 1.2.0

4 years agofix remaining direct use of stat syscalls outside fstatat.c
Rich Felker [Wed, 12 Feb 2020 22:23:29 +0000 (17:23 -0500)]
fix remaining direct use of stat syscalls outside fstatat.c

because struct stat is no longer assumed to correspond to the
structure used by the stat-family syscalls, it's not valid to make any
of these syscalls directly using a buffer of type struct stat.

commit 9493892021eac4edf1776d945bcdd3f7a96f6978 moved all logic around
this change for stat-family functions into fstatat.c, making the
others wrappers for it. but a few other direct uses of the syscall
were overlooked. the ones in tmpnam/tempnam are harmless since the
syscalls are just used to test for file existence. however, the uses
in fchmodat and __map_file depend on getting accurate file properties,
and these functions may actually have been broken one or more mips
variants due to removal of conversion hacks from syscall_arch.h.

as a low-risk fix, simply use struct kstat in place of struct stat in
the affected places.

4 years agoremove i386 asm for single and double precision exp-family functions
Rich Felker [Thu, 6 Feb 2020 21:29:49 +0000 (16:29 -0500)]
remove i386 asm for single and double precision exp-family functions

these did not truncate excess precision in the return value. fixing
them looks like considerable work, and the current C code seems to
outperform them significantly anyway.

long double functions are left in place because they are not subject
to excess precision issues and probably better than the C code.

4 years agorename i386 exp.s to exp_ld.s
Rich Felker [Thu, 6 Feb 2020 21:24:03 +0000 (16:24 -0500)]
rename i386 exp.s to exp_ld.s

this commit is for the sake of reviewable history.

4 years agofix excess precision in return value of i386 log-family functions
Rich Felker [Thu, 6 Feb 2020 18:29:45 +0000 (13:29 -0500)]
fix excess precision in return value of i386 log-family functions

4 years agofix excess precision in return value of i386 acos[f] and asin[f]
Rich Felker [Thu, 6 Feb 2020 17:06:30 +0000 (12:06 -0500)]
fix excess precision in return value of i386 acos[f] and asin[f]

analogous to commit 1c9afd69051a64cf085c6fb3674a444ff9a43857 for
atan[2][f].

4 years agofix excess precision in return value of i386 atan[2][f]
Rich Felker [Thu, 6 Feb 2020 16:34:54 +0000 (11:34 -0500)]
fix excess precision in return value of i386 atan[2][f]

for functions implemented in C, this is a requirement of C11 (F.6);
strictly speaking that text does not apply to standard library
functions, but it seems to be intended to apply to them, and C2x is
expected to make it a requirement.

failure to drop excess precision is particularly bad for inverse trig
functions, where a value with excess precision can be outside the
range of the function (entire range, or range for a particular
subdomain), breaking reasonable invariants a caller may expect.

4 years agoremove legacy time32 timer[fd] syscalls from public syscall.h
Rich Felker [Wed, 5 Feb 2020 14:55:02 +0000 (09:55 -0500)]
remove legacy time32 timer[fd] syscalls from public syscall.h

this extends commit 5a105f19b5aae79dd302899e634b6b18b3dcd0d6, removing
timer[fd]_settime and timer[fd]_gettime. the timerfd ones are likely
to have been used in software that started using them before it could
rely on libc exposing functions.

4 years agoremove further legacy time32 clock syscalls from public syscall.h
Rich Felker [Wed, 5 Feb 2020 14:51:09 +0000 (09:51 -0500)]
remove further legacy time32 clock syscalls from public syscall.h

this extends commit 5a105f19b5aae79dd302899e634b6b18b3dcd0d6, removing
clock_settime, clock_getres, clock_nanosleep, and settimeofday.

4 years agofix incorrect results for catanf and catanl with some inputs
Rich Felker [Wed, 5 Feb 2020 14:40:11 +0000 (09:40 -0500)]
fix incorrect results for catanf and catanl with some inputs

catan was fixed in 10e4bd3780050e75b72aac5d85c31816419bb17d but the
same bug in catanf and catanl was overlooked. the patch is completely
analogous.

4 years agomove riscv64 register index constants to signal.h
Rich Felker [Tue, 4 Feb 2020 14:29:13 +0000 (09:29 -0500)]
move riscv64 register index constants to signal.h

under _GNU_SOURCE for namespace cleanliness, analogous to other archs.
the original placement in sys/reg.h seems not to have been motivated;
such a header isn't even present on other implementations.

4 years agoremove legacy clock_gettime and gettimeofday from public syscall.h
Rich Felker [Thu, 30 Jan 2020 16:25:07 +0000 (11:25 -0500)]
remove legacy clock_gettime and gettimeofday from public syscall.h

some nontrivial number of applications have historically performed
direct syscalls for these operations rather than using the public
functions. such usage is invalid now that time_t is 64-bit and these
syscalls no longer match the types they are used with, and it was
already harmful before (by suppressing use of vdso).

since syscall() has no type safety, incorrect usage of these syscalls
can't be caught at compile-time. so, without manually inspecting or
running additional tools to check sources, the risk of such errors
slipping through is high.

this patch renames the syscalls on 32-bit archs to clock_gettime32 and
gettimeofday_time32, so that applications using the original names
will fail to build without being fixed.

note that there are a number of other syscalls that may also be unsafe
to use directly after the time64 switchover, but (1) these are the
main two that seem to be in widespread use, and (2) most of the others
continue to have valid usage with a null timeval/timespec argument, as
the argument is an optional timeout or similar.

4 years agofix misleading use of _POSIX_VDISABLE in sys/ttydefaults.h
Rich Felker [Wed, 29 Jan 2020 15:47:48 +0000 (10:47 -0500)]
fix misleading use of _POSIX_VDISABLE in sys/ttydefaults.h

_POSIX_VDISABLE is only visible if unistd.h has already been included,
so conditional use of it here makes no sense. the value is always 0
anyway; it does not vary.

4 years agofix unprotected macro argument in sys/ttydefaults.h
Rich Felker [Wed, 29 Jan 2020 15:47:19 +0000 (10:47 -0500)]
fix unprotected macro argument in sys/ttydefaults.h

4 years agomath/x32: correct lrintl.s for 32-bit long
Alexander Monakov [Sat, 18 Jan 2020 16:15:16 +0000 (19:15 +0300)]
math/x32: correct lrintl.s for 32-bit long

4 years agomove struct dirent to bits header, allow NAME_MAX to vary
Rich Felker [Sun, 26 Jan 2020 04:08:55 +0000 (23:08 -0500)]
move struct dirent to bits header, allow NAME_MAX to vary

this is not necessary for linux but is a simple, inexpensive change to
make that facilitates ports to systems where NAME_MAX needs to be
longer.

4 years agofix riscv64 a_cas inline asm operand sign extension
Luís Marques [Wed, 15 Jan 2020 13:24:41 +0000 (13:24 +0000)]
fix riscv64 a_cas inline asm operand sign extension

This patch adds an explicit cast to the int arguments passed to the
inline asm used in the RISC-V's implementation of `a_cas`, to ensure
that they are properly sign extended to 64 bits. They aren't
automatically sign extended by Clang, and GCC technically also doesn't
guarantee that they will be sign extended.

4 years agofix incorrect escaping in add-cfi.*.awk scripts
Will Dietz [Wed, 8 Jan 2020 19:20:44 +0000 (13:20 -0600)]
fix incorrect escaping in add-cfi.*.awk scripts

gawk 5 complains.

4 years agoadd thumb2 support to arm assembler memcpy
Andre McCurdy [Fri, 13 Sep 2019 18:44:31 +0000 (11:44 -0700)]
add thumb2 support to arm assembler memcpy

For Thumb2 compatibility, replace two instances of a single
instruction "orr with a variable shift" with the two instruction
equivalent. Neither of the replacements are in a performance critical
loop.

4 years agofix incorrect __hwcap seen in dynamic-linked __set_thread_area
Rich Felker [Wed, 15 Jan 2020 21:15:49 +0000 (16:15 -0500)]
fix incorrect __hwcap seen in dynamic-linked __set_thread_area

the bug fixed in commit b82cd6c78d812d38c31febba5a9e57dbaa7919c4 was
mostly masked on arm because __hwcap was zero at the point of the call
from the dynamic linker to __set_thread_area, causing the access to
libc.auxv to be skipped and kuser_helper versions of TLS access and
atomics to be used instead of the armv6 or v7 versions. however, on
kernels with kuser_helper removed for hardening it would crash.

since __set_thread_area potentially uses __hwcap, it must be
initialized before the function is called. move the AT_HWCAP lookup
from stage 3 to stage 2b.

4 years agodefine RLIMIT_RTTIME, bump RLIMIT_NLIMITS
Leah Neukirchen [Sat, 11 Jan 2020 19:16:59 +0000 (20:16 +0100)]
define RLIMIT_RTTIME, bump RLIMIT_NLIMITS

This macro exists since Linux 2.6.25 and is defined in glibc since 2011.

4 years agofix wcwidth wrongly returning 0 for most of planes 4 and up
Rich Felker [Thu, 2 Jan 2020 01:02:51 +0000 (20:02 -0500)]
fix wcwidth wrongly returning 0 for most of planes 4 and up

commit 1b0ce9af6d2aa7b92edaf3e9c631cb635bae22bd introduced this bug
back in 2012 and it was never noticed, presumably since the affected
planes are essentially unused in Unicode.

4 years agounconditonally define alloca as __builtin_alloca
Michael Forney [Tue, 19 Nov 2019 09:56:34 +0000 (01:56 -0800)]
unconditonally define alloca as __builtin_alloca

This enables alternative compilers, which may not define __GNUC__,
to implement alloca, which is still fairly widely used.

This is similar to how stdarg.h already works in musl; compilers must
implement __builtin_va_arg, there is no fallback definition.

4 years agoupdate COPYRIGHT year
Rich Felker [Wed, 1 Jan 2020 16:13:51 +0000 (11:13 -0500)]
update COPYRIGHT year

4 years agoremove gratuitous aligned attribute from __ptrace_syscall_info
Rich Felker [Wed, 1 Jan 2020 16:10:07 +0000 (11:10 -0500)]
remove gratuitous aligned attribute from __ptrace_syscall_info

this change was discussed on the mailing list thread for the linux
uapi v5.3 patches, and submitted as a v2 patch, but overlooked when I
applied the patches much later.

revert commit f291c09ec90e2514c954020e9b9bdb30e2adfc7f and apply the
v2 as submitted; the net change is just padding.

notes by Szabolcs Nagy follow:

compared to the linux uapi (and glibc) a padding is used instead of
aligned attribute for keeping the layout the same across targets, this
means the alignment of the struct may be different on some targets
(e.g. m68k where uint64_t is 2 byte aligned) but that should not affect
syscalls and this way the abi does not depend on nonstandard extensions.

4 years agofix fdpic regression in dynamic linker with overly smart compilers
Rich Felker [Wed, 1 Jan 2020 05:15:04 +0000 (00:15 -0500)]
fix fdpic regression in dynamic linker with overly smart compilers

at least gcc 9 broke execution of DT_INIT/DT_FINI for fdpic archs
(presently only sh) by recognizing that the stores to the
compound-literal function descriptor constructed to call them were
dead stores. there's no way to make a "may_alias function", so instead
launder the descriptor through an asm-statement barrier. in practice
just making the compound literal volatile seemed to have worked too,
but this should be less of a hack and more accurately convey the
semantics of what transformations are not valid.

4 years agofix crashing ldso on archs where __set_thread_area examines auxv
Rich Felker [Wed, 1 Jan 2020 02:59:07 +0000 (21:59 -0500)]
fix crashing ldso on archs where __set_thread_area examines auxv

commit 1c84c99913bf1cd47b866ed31e665848a0da84a2 moved the call to
__init_tp above the initialization of libc.auxv, inadvertently
breaking archs where __set_thread_area examines auxv for the sake of
determining the TLS/atomic model needed at runtime. this broke armv6
and sh2.

4 years agomove stage3_func typedef out of shared internal dynlink.h header
Rich Felker [Wed, 1 Jan 2020 02:51:07 +0000 (21:51 -0500)]
move stage3_func typedef out of shared internal dynlink.h header

this interface contract is entirely internal to dynlink.c.

4 years agomips: add clone3 syscall numbers from linux v5.4
Szabolcs Nagy [Sun, 22 Dec 2019 12:31:44 +0000 (12:31 +0000)]
mips: add clone3 syscall numbers from linux v5.4

the syscall numbers were reserved in v5.3 but not wired up on mips, see

  linux commit 0671c5b84e9e0a6d42d22da9b5d093787ac1c5f3
  MIPS: Wire up clone3 syscall

4 years agomips: add hwcap bits from linux v5.4
Szabolcs Nagy [Sun, 22 Dec 2019 12:19:16 +0000 (12:19 +0000)]
mips: add hwcap bits from linux v5.4

mips application specific isa extensions were previously not exported
in hwcaps so userspace could not apply optimized code at runtime.

  linux commit 38dffe1e4dde1d3174fdce09d67370412843ebb5
  MIPS: elf_hwcap: Export userspace ASEs

4 years agosys/wait.h: add P_PIDFD from linux v5.4
Szabolcs Nagy [Sun, 22 Dec 2019 12:11:30 +0000 (12:11 +0000)]
sys/wait.h: add P_PIDFD from linux v5.4

allows waiting on a pidfd, in the future it might allow retrieving the
exit status by a non-parent process, see

  linux commit 3695eae5fee0605f316fbaad0b9e3de791d7dfaf
  pidfd: add P_PIDFD to waitid()

4 years agonetinet/tcp.h: add new tcp_info fields from linux v5.4
Szabolcs Nagy [Sun, 22 Dec 2019 12:02:52 +0000 (12:02 +0000)]
netinet/tcp.h: add new tcp_info fields from linux v5.4

tcpi_rcv_ooopack for tracking connection quality:

  linux commit f9af2dbbfe01def62765a58af7fbc488351893c3
  tcp: Add TCP_INFO counter for packets received out-of-order

tcpi_snd_wnd peer window size for diagnosing tcp performance problems:

  linux commit 8f7baad7f03543451af27f5380fc816b008aa1f2
  tcp: Add snd_wnd to TCP_INFO

4 years agosys/prctl.h: add PR_*_TAGGED_ADDR_* from linux v5.4
Szabolcs Nagy [Sun, 22 Dec 2019 10:51:37 +0000 (10:51 +0000)]
sys/prctl.h: add PR_*_TAGGED_ADDR_* from linux v5.4

per thread prctl commands to relax the syscall abi such that top bits
of user pointers are ignored in the kernel. this allows the use of
those bits by hwasan or by mte to color pointers and memory on aarch64:

  linux commit 63f0c60379650d82250f22e4cf4137ef3dc4f43d
  arm64: Introduce prctl() options to control the tagged user addresses ABI

4 years agosys/mman.h: add MADV_COLD and MADV_PAGEOUT from linux v5.4
Szabolcs Nagy [Sun, 22 Dec 2019 10:26:20 +0000 (10:26 +0000)]
sys/mman.h: add MADV_COLD and MADV_PAGEOUT from linux v5.4

These were mainly introduced so android can optimize the memory usage
of unused apps.

MADV_COLD hints that the memory range is currently not needed (unlike
with MADV_FREE the content is not garbage, it needs to be swapped):

  linux commit 9c276cc65a58faf98be8e56962745ec99ab87636
  mm: introduce MADV_COLD

MADV_PAGEOUT hints that the memory range is not needed for a long time
so it can be reclaimed immediately independently of memory pressure
(unlike with MADV_DONTNEED the content is not garbage):

  linux commit 1a4e58cce84ee88129d5d49c064bd2852b481357
  mm: introduce MADV_PAGEOUT

4 years agoadd clone3 syscall number from linux v5.3
Szabolcs Nagy [Sun, 3 Nov 2019 23:27:31 +0000 (23:27 +0000)]
add clone3 syscall number from linux v5.3

the syscall number is reserved on all targets, but it is not wired up
on all targets, see

  linux commit 8f6ccf6159aed1f04c6d179f61f6fb2691261e84
  Merge tag 'clone3-v5.3' of ... brauner/linux

  linux commit 8f3220a806545442f6f26195bc491520f5276e7c
  arch: wire-up clone3() syscall

  linux commit 7f192e3cd316ba58c88dfa26796cf77789dd9872
  fork: add clone3

4 years agoadd pidfd_open syscall number from linux v5.3
Szabolcs Nagy [Sun, 3 Nov 2019 23:16:53 +0000 (23:16 +0000)]
add pidfd_open syscall number from linux v5.3

see

  linux commit 7615d9e1780e26e0178c93c55b73309a5dc093d7
  arch: wire-up pidfd_open()

  linux commit 32fcb426ec001cb6d5a4a195091a8486ea77e2df
  pid: add pidfd_open()

4 years agosys/ptrace.h: add PTRACE_GET_SYSCALL_INFO from linux v5.3
Szabolcs Nagy [Sun, 3 Nov 2019 22:45:05 +0000 (22:45 +0000)]
sys/ptrace.h: add PTRACE_GET_SYSCALL_INFO from linux v5.3

ptrace API to get details of the syscall the tracee is blocked in, see

  linux commit 201766a20e30f982ccfe36bebfad9602c3ff574a
  ptrace: add PTRACE_GET_SYSCALL_INFO request

the align attribute was used to keep the layout the same across targets
e.g. on m68k uint32_t is 2 byte aligned, this helps with compat ptrace.

4 years agosys/socket.h: add SO_DETACH_REUSEPORT_BPF from linux v5.3
Szabolcs Nagy [Sun, 3 Nov 2019 22:27:13 +0000 (22:27 +0000)]
sys/socket.h: add SO_DETACH_REUSEPORT_BPF from linux v5.3

see

  linux commit 99f3a064bc2e4bd5fe50218646c5be342f2ad18c
  bpf: net: Add SO_DETACH_REUSEPORT_BPF

4 years agonetinet/if_ether.h: add ETH_P_LLDP from linux v5.3
Szabolcs Nagy [Sun, 3 Nov 2019 22:22:32 +0000 (22:22 +0000)]
netinet/if_ether.h: add ETH_P_LLDP from linux v5.3

see

  linux commit c54c2c72b2b90a3ba61b8cad032a578ce2bf5b35
  net: Add a define for LLDP ethertype

4 years agonetinet/tcp.h: add TCP_TX_DELAY from linux v5.3
Szabolcs Nagy [Thu, 31 Oct 2019 21:15:43 +0000 (21:15 +0000)]
netinet/tcp.h: add TCP_TX_DELAY from linux v5.3

see

  linux commit a842fe1425cb20f457abd3f8ef98b468f83ca98b
  tcp: add optional per socket transmit delay

4 years agofix types for mips sigcontext/mcontext_t regset members
Khem Raj [Wed, 18 Dec 2019 22:02:37 +0000 (14:02 -0800)]
fix types for mips sigcontext/mcontext_t regset members

4 years agospare archs without time32 legacy the cost of ioctl fallback conversions
Rich Felker [Sun, 22 Dec 2019 18:25:17 +0000 (13:25 -0500)]
spare archs without time32 legacy the cost of ioctl fallback conversions

adding this condition makes the entire convert_ioctl_struct function
and compat_map table statically unreachable, and thereby optimized out
by dead code elimination, on archs where they are not needed.

4 years agoadd further ioctl time64 fallback conversion for device-specific command
Rich Felker [Sun, 22 Dec 2019 18:18:47 +0000 (13:18 -0500)]
add further ioctl time64 fallback conversion for device-specific command

VIDIOC_OMAP3ISP_STAT_REQ is a device-specific command for the omap3isp
video device. the command number is in a device-private range and
therefore could theoretically be used by other devices too in the
future, but problematic clashes should not be able to arise without
intentional misuse.

4 years agoadd uapi guards for new netinet/ip.h conflict with struct iphdr
A. Wilcox [Sun, 22 Dec 2019 06:06:47 +0000 (00:06 -0600)]
add uapi guards for new netinet/ip.h conflict with struct iphdr

This ensures that the musl definition of 'struct iphdr' does not conflict
with the Linux kernel UAPI definition of it.

Some software, i.e. net-tools, will not compile against 5.4 kernel headers
without this patch and the corresponding Linux kernel patch.

4 years agoadjust utmpx struct layout for time64, 32-/64-bit arch compat
Rich Felker [Sun, 22 Dec 2019 17:37:16 +0000 (12:37 -0500)]
adjust utmpx struct layout for time64, 32-/64-bit arch compat

since time64 switchover has changed the size and layout of the struct
anyway, take the opportunity to fix it up so that it can be shared
between 32- and 64-bit ABIs on the same system as long as byte order
matches.

the ut_type member is explicitly padded to make up for m68k having
only 2-byte alignment; explicit padding has no effect on other archs.

ut_session is changed from long to int, with endian-matched padding.
this affects 64-bit archs as well, but brings the type into alignment
with glibc's x86_64 struct, so it should not break software, and does
not break on-disk format. the semantic type is int (pid-like) anyway.
the padding produces correct alignment for the ut_tv member on 32-bit
archs that don't naturally align it, so that ABI matches 64-bit.

this type is presently not used anywhere in the ABI between libc and
libc consumers; it's only used between pairs of consumers if a
third-party utmp library using the system utmpx.h is in use.

4 years agofix elf_prstatus regression on time64, existing wrong definition on x32
Rich Felker [Sun, 22 Dec 2019 16:20:44 +0000 (11:20 -0500)]
fix elf_prstatus regression on time64, existing wrong definition on x32

the elf_prstatus structure is used in core dumps, and the timeval
structures in it are longs matching the elf class, *not* the kernel
"old timeval" for the arch. this means using timeval here for x32 was
always wrong, despite kernel uapi headers and glibc also exposing it
this way, and of course it's wrong for any arch with 64-bit time_t.

rather than just changing the type on affected archs, use a tagless
struct containing long tv_sec and tv_usec members in place of the
timevals. this intentionally breaks use of them as timevals (e.g.
assignment, passing address, etc.) on 64-bit archs as well so that any
usage unsafe for 32-bit archs is caught even in software that only
gets tested on 64-bit archs. from what I could gather, there is not
any software using these members anyway. the only reason they need to
be fixed to begin with is that the only members which are commonly
used, the saved registers, follow the time members and have the wrong
offset if the time members are sized incorrectly.

4 years agodon't continue looping through ioctl compat_map after finding match
Rich Felker [Sat, 21 Dec 2019 17:21:04 +0000 (12:21 -0500)]
don't continue looping through ioctl compat_map after finding match

there's only one matching entry for any given command so this had no
functional distinction, but additional loops are pointless and
wasteful.

4 years agorevert unwanted and inadvertent change that slipped into mmap.c
Rich Felker [Sat, 21 Dec 2019 02:27:39 +0000 (21:27 -0500)]
revert unwanted and inadvertent change that slipped into mmap.c

commit ae388becb529428ac926da102f1d025b3c3968da accidentally
introduced #define SYSCALL_NO_TLS 1 in mmap.c, which was probably a
stale change left around from unrelated syscall timing measurements.
reverse it.

4 years agoadd further ioctl time64 fallback conversions
Rich Felker [Fri, 20 Dec 2019 00:50:31 +0000 (19:50 -0500)]
add further ioctl time64 fallback conversions

this commit covers all remaining ioctls I'm aware of that use
time_t-derived types in their interfaces. it may still be incomplete,
and has undergone only minimal testing for a few commands used in
audio playback.

the SNDRV_PCM_IOCTL_SYNC_PTR command is special-cased because, rather
than the whole structure expanding, it has two substructures each
padded to 64 bytes that expand within their own 64-byte reserved zone.
as long as it's the only one of its type, it doesn't really make sense
to make a general framework for it, but the existing table framework
is still used for the substructures in the special-case. one of the
substructures, snd_pcm_mmap_status, has a snd_pcm_uframes_t member
which is not a timestamp but is expanded just like one, to match the
64-bit-arch version of the structure. this is handled just like a
timestamp at offset 8, and is the motivation for the conversions table
holding offsets of individual values to be expanded rather than
timespec/timeval type pairs.

for some of the types, the size to which they expand is dependent on
whether the arch's ABI aligns 8-byte types on 8-byte boundaries.
new_req entries in the table need to reflect this size to get the
right ioctl request number that will match what callers pass, but we
don't have access to the actual structure type definitions here and
duplicating them would be cumbersome. instead, the new_misaligned
macro introduced here constructs an artificial object whose size is
the result of expanding a misaligned timespec/timeval to 64-bit and
imposing the arch's alignment on the result, which can be passed to
the _IO{R,W,WR} macros.

4 years agoimprove ioctl time64 conversion fallback framework
Rich Felker [Thu, 19 Dec 2019 15:47:10 +0000 (10:47 -0500)]
improve ioctl time64 conversion fallback framework

record offsets of individual slots that expand from 32- to 64-bit,
rather than timespec/timeval pairs. this flexibility will be needed
for some ioctls. reduce size of types in table. adjust representation
of offsets to include a count rather than needing -1 padding so that
the table is less ugly and doesn't need large diffs if we increase max
number of slots.

4 years agoconvert ioctl time64 fallbacks to table-driven framework
Rich Felker [Thu, 19 Dec 2019 01:48:58 +0000 (20:48 -0500)]
convert ioctl time64 fallbacks to table-driven framework

with the current set of supported ioctls, this conversion is hardly an
improvement, but it sets the stage for being able to do alsa, v4l2,
ppp, and other ioctls with timespec/timeval-derived types. without
this capability, a lot of functionality users depend on would stop
working with the time64 switchover.

4 years agofix regression in ioctl definitions provided by arch/generic bits
Rich Felker [Wed, 18 Dec 2019 23:03:43 +0000 (18:03 -0500)]
fix regression in ioctl definitions provided by arch/generic bits

commit b60fdf133c033d4ad6b04a8237f253563fae5928 broke the
SIOCGSTAMP[NS] ioctl fallbacks introduced in commit
2e554617e5a6a41bf3f6c6306c753cd53abf728c, as well as use of these
ioctls, by creating a situation where bits/ioctl.h could be included
without __LONG_MAX being visible.

4 years agohook recvmmsg up to SO_TIMESTAMP[NS] fallback for pre-time64 kernels
Rich Felker [Wed, 18 Dec 2019 04:00:24 +0000 (23:00 -0500)]
hook recvmmsg up to SO_TIMESTAMP[NS] fallback for pre-time64 kernels

always try the time64 syscall first since we can use its success to
conclude that no conversion is needed (any setsockopt for the
timestamp options would have succeeded without need for fallbacks).
otherwise, we have to remember the original controllen for each
msghdr, requiring O(vlen) space, so vlen must be bounded. linux clamps
it to IOV_MAX for sendmmsg only (not recvmmsg), but doing the same for
recvmmsg is not unreasonable, especially since the limitation will
only apply to old kernels.

we could optimize to avoid trying SYS_recvmmsg_time64 first if all
msghdrs have controllen zero, or support unlimited vlen by looping and
emulating the timeout logic, but I'm not inclined to do complex and
error-prone optimizations on a function that has so many underlying
problems it should really never be used.

4 years agoimplement SO_TIMESTAMP[NS] fallback for kernels without time64 versions
Rich Felker [Wed, 18 Dec 2019 01:12:03 +0000 (20:12 -0500)]
implement SO_TIMESTAMP[NS] fallback for kernels without time64 versions

the definitions of SO_TIMESTAMP* changed on 32-bit archs in commit
38143339646a4ccce8afe298c34467767c899f51 to the new versions that
provide 64-bit versions of timeval/timespec structure in control
message payload. socket options, being state attached to the socket
rather than function calls, are not trivial to implement as fallbacks
on ENOSYS, and support for them was initially omitted on the
assumption that the ioctl-based polling alternatives (SIOCGSTAMP*)
could be used instead by applications if setsockopt fails.

unfortunately, it turns out that SO_TIMESTAMP is sufficiently old and
widely supported that a number of applications assume it's available
and treat errors as fatal.

this patch introduces emulation of SO_TIMESTAMP[NS] on pre-time64
kernels by falling back to setting the "_OLD" (time32) versions of the
options if the time64 ones are not recognized, and performing
translation of the SCM_TIMESTAMP[NS] control messages in recvmsg.
since recvmsg does not know whether its caller is legacy time32 code
or time64, it performs translation for any SCM_TIMESTAMP[NS]_OLD
control messages it sees, leaving the original time32 timestamp as-is
(it can't be rewritten in-place anyway, and memmove would be mildly
expensive) and appending the converted time64 control message at the
end of the buffer. legacy time32 callers will see the converted one as
a spurious control message of unknown type; time64 callers running on
pre-time64 kernels will see the original one as a spurious control
message of unknown type. a time64 caller running on a kernel with
native time64 support will only see the time64 version of the control
message.

emulation of SO_TIMESTAMPING is not included at this time since (1)
applications which use it seem to be prepared for the possibility that
it's not present or working, and (2) it can also be used in sendmsg
control messages, in a manner that looks complex to emulate
completely, and costly even when running on a time64-supporting
kernel.

corresponding changes in recvmmsg are not made at this time; they will
be done separately.

4 years agosignal to kernel headers that time_t is 64-bit
Rich Felker [Tue, 17 Dec 2019 23:19:05 +0000 (18:19 -0500)]
signal to kernel headers that time_t is 64-bit

linux/input.h and perhaps others use this macro to determine whether
the userspace time_t is 64-bit when potentially defining types in
terms of time_t and derived structures. the name __USE_TIME_BITS64 is
unfortunate; it really should have been in the __UAPI namespace. but
this is what was chosen back in v4.16 when first preparing input.h for
time64 userspace, presumably based on expectations about what the
glibc-internal features.h macro for time64 would be, and changing it
now would just put a new minimum version requirement on kernel
headers.

the __USE_TIME_BITS64 macro is not intended as a public interface. it
is purely an internal contract between libc and Linux uapi headers.

4 years agofix null pointer dereference in setitimer time32 compat shim
Rich Felker [Sun, 8 Dec 2019 15:35:04 +0000 (10:35 -0500)]
fix null pointer dereference in setitimer time32 compat shim

this interface permits a null pointer for where to store the old
itimerval being replaced. an early version of the time32 compat shim
code had corresponding bugs for lots of functions; apparently
setitimer was overlooked when fixing them.

4 years agoarm: avoid conditional branch to PLT in sigsetjmp
Andre McCurdy [Wed, 18 Sep 2019 06:04:05 +0000 (23:04 -0700)]
arm: avoid conditional branch to PLT in sigsetjmp

The R_ARM_THM_JUMP19 relocation type generated for the original code
when targeting Thumb 2 is not supported by the gold linker.

4 years agoriscv64: fix fesetenv(FE_DFL_ENV) crash
Ruinland ChuanTzu Tsai [Mon, 2 Dec 2019 11:06:52 +0000 (19:06 +0800)]
riscv64: fix fesetenv(FE_DFL_ENV) crash

When FE_DFL_ENV is passed to fesetenv(), the very first instruction
lw t1, 0(a0) will fail since a0 is -1.

4 years agoupdate contributor name
Ada Worcester [Sun, 24 Nov 2019 00:15:38 +0000 (17:15 -0700)]
update contributor name

This changes my name in the COPYRIGHT file, and adds a .mailmap entry
for my new name.

5 years agoppc: add configure check for older compilers erroring on 'd' constraint
rofl0r [Tue, 5 Nov 2019 21:01:42 +0000 (21:01 +0000)]
ppc: add configure check for older compilers erroring on 'd' constraint

5 years agofix build regression on mips64 due to endian.h removal
Rich Felker [Tue, 5 Nov 2019 15:15:11 +0000 (10:15 -0500)]
fix build regression on mips64 due to endian.h removal

commit 4d3a162d001a93edd285fb6603a883c30ae553ba overlooked that the
mips64 reloc.h dependent on endian.h not only for setting the ABI ldso
name to match the byte order, but also for use of the byte swapping
macros. they are needed to override R_TYPE, R_SYM, and R_INFO, to
compensate for a mips "quirk" of always using big endian order for
symbol references in relocations.

part of that commit canot be reverted because the original code was
wrong: it's invalid to define _GNU_SOURCE or any feature test macro
in reloc.h, or anywhere except at the top of a source file. however,
thanks to commit 316730cdc7a330cddf288b4e5c1de5daa64e19f4, the feature
test macro is no longer needed to access the endian-swapping macros,
so simply bringing back the #include directive suffices.

5 years agofix failure to build time32 compat shims with out-of-tree builds
Rich Felker [Mon, 4 Nov 2019 06:47:38 +0000 (01:47 -0500)]
fix failure to build time32 compat shims with out-of-tree builds

commit de90f38e3b105802655d19d965d66335d25d59ef omitted $(srcdir) from
the makefile include pathname it added. since the include directive
was prefixed with - to make it optional (for archs that don't use it),
the failure to find arch/$(ARCH)/arch.mak was silent.

5 years agofix time64 link regression of dlsym stub for static-linked programs
Rich Felker [Sun, 3 Nov 2019 06:19:01 +0000 (01:19 -0500)]
fix time64 link regression of dlsym stub for static-linked programs

in commit 22daaea39f1cc5f7391f0a5cd84576ffb58c2860, the
__dlsym_redir_time64 function providing the backend for __dlsym_time64
was defined only in the dynamic linker, and thus was undefined when
static linking a program referencing dlsym. use the same stub_dlsym
definition that provides __dlsym (the non-redirecting backend) for
static linked programs to provide it, conditional on _REDIR_TIME64.

5 years agomove time_t and suseconds_t definitions to common alltypes.h.in
Rich Felker [Tue, 22 Oct 2019 21:08:56 +0000 (17:08 -0400)]
move time_t and suseconds_t definitions to common alltypes.h.in

now that all 32-bit archs have 64-bit time_t (and suseconds_t), the
arch-provided _Int64 macro (long or long long, as appropriate) can be
used to define them, and arch-specific definitions are no longer
needed.

5 years agomove time64 ioctl numbers to generic bits/ioctl.h
Rich Felker [Sat, 2 Nov 2019 00:22:41 +0000 (20:22 -0400)]
move time64 ioctl numbers to generic bits/ioctl.h

now that all 32-bit archs have 64-bit time types, the values for the
time-related ioctls can be shared. the mechanism for this is an
arch/generic version of the bits header. archs which don't use the
generic header still need to duplicate the definitions.

x32, which does not use the new time64 values of the macros, already
has its own overrides, so this commit does not affect it.

5 years agomove time64 socket options from arch bits to top-level sys/socket.h
Rich Felker [Sat, 2 Nov 2019 00:11:08 +0000 (20:11 -0400)]
move time64 socket options from arch bits to top-level sys/socket.h

now that all 32-bit archs have 64-bit time types, the values for the
time-related socket option macros can be treated as universal for
32-bit archs. the sys/socket.h mechanism for this predates
arch/generic and is instead in the top-level header.

x32, which does not use the new time64 values of the macros, already
has its own overrides, so this commit does not affect it.

5 years agoswitch all existing 32-bit archs to 64-bit time_t
Rich Felker [Fri, 2 Aug 2019 19:41:27 +0000 (15:41 -0400)]
switch all existing 32-bit archs to 64-bit time_t

this commit preserves ABI fully for existing interface boundaries
between libc and libc consumers (applications or libraries), by
retaining existing symbol names for the legacy 32-bit interfaces and
redirecting sources compiled against the new headers to alternate
symbol names. this does not necessarily, however, preserve the
pairwise ABI of libc consumers with one another; where they use
time_t-derived types in their interfaces with one another, it may be
necessary to synchronize updates with each other.

the intent is that ABI resulting from this commit already be stable
and permanent, but it will not be officially so until a release is
made. changes to some header-defined types that do not play any role
in the ABI between libc and its consumers may still be subject to
change.

mechanically, the changes made by this commit for each 32-bit arch are
as follows:

- _REDIR_TIME64 is defined to activate the symbol redirections in
  public headers

- COMPAT_SRC_DIRS is defined in arch.mak to activate build of ABI
  compat shims to serve as definitions for the original symbol names

- time_t and suseconds_t definitions are changed to long long (64-bit)

- IPC_STAT definition is changed to add the IPC_TIME64 bit (0x100),
  triggering conversion of semid_ds, shmid_ds, and msqid_ds split
  low/high time bits into new time_t members

- structs semid_ds, shmid_ds, msqid_ds, and stat are modified to add
  new 64-bit time_t/timespec members at the end, maintaining existing
  layout of other members.

- socket options (SO_*) and ioctl (sockios) command macros are
  redefined to use the kernel's "_NEW" values.

in addition, on archs where vdso clock_gettime is used, the
VDSO_CGT_SYM macro definition in syscall_arch.h is changed to use a
new time64 vdso function if available, and a new VDSO_CGT32_SYM macro
is added for use as fallback on kernels lacking time64.

5 years agoadd x32 bits/ioctl_fix.h defining time-related sockios macros
Rich Felker [Fri, 1 Nov 2019 03:40:10 +0000 (23:40 -0400)]
add x32 bits/ioctl_fix.h defining time-related sockios macros

these definitions are copied from generic bits/ioctl.h, so that x32
keeps the "_OLD" versions (which are already time64 on x32) when
32-bit archs switch to 64-bit time_t.

5 years agoadd back x32 bits/socket.h defining time-related socket options
Rich Felker [Fri, 1 Nov 2019 03:21:35 +0000 (23:21 -0400)]
add back x32 bits/socket.h defining time-related socket options

these definitions are merely copied from the top-level sys/socket.h,
so there is no functional change at this time. however, the top-level
definitions will change to use the time64 "_NEW" versions on 32-bit
archs when time_t is switched over to 64-bit. this commit ensures that
change will be suppressed on x32.

5 years agomove msghdr and cmsghdr out of bits/socket.h
Rich Felker [Fri, 1 Nov 2019 03:09:48 +0000 (23:09 -0400)]
move msghdr and cmsghdr out of bits/socket.h

these structures can now be defined generically in terms of endianness
and long size. previously, the 32-bit archs all shared a common
definition from the generic bits header, and each 64-bit arch had to
repeat the 64-bit version, with endian conditionals if the arch had
variants of each endianness.

I would prefer getting rid of the preprocessor conditionals for
padding and instead using unnamed bitfield members, like commit
9b2921bea1d5017832e1b45d1fd64220047a9802 did for struct timespec.
however, at present sendmsg, recvmsg, and recvmmsg need access to the
padding members by name to zero them. this could perhaps be cleaned up
in the future.

5 years agofix x32 msghdr struct by removing x32 bits/socket.h
Rich Felker [Fri, 1 Nov 2019 02:55:39 +0000 (22:55 -0400)]
fix x32 msghdr struct by removing x32 bits/socket.h

being that it contains pointers and (from the kernel perspective,
which is wrong) size_t members, x32 uses the 32-bit version of the
structure, not a half-32-bit, half-64-bit layout like we had here. the
x86_64 definition was inadvertently copied when x32 was first added.

unlike errors in the opposite direction (missing padding), this error
was not easily detected breakage, because the layout of the commonly
used initial subset of members still matched. breakage could only be
observed in the presence of control messages or flags.

5 years agomake time-related socket options overridable by arch bits files
Rich Felker [Thu, 31 Oct 2019 20:48:30 +0000 (16:48 -0400)]
make time-related socket options overridable by arch bits files

SO_RCVTIMEO and SO_SNDTIMEO already were, but only in aggregate with
SO_DEBUG and all of the other low/traditional options that varied per
arch. SO_TIMESTAMP* are newly overridable. the two groups have to be
done separately since mips64 and powerpc64 will override the former
but not the latter.

at some point this should be cleaned up to use bits headers more
idiomatically.

5 years agoadd framework for arch-provided makefile fragments, compat source dirs
Rich Felker [Mon, 21 Oct 2019 00:03:20 +0000 (20:03 -0400)]
add framework for arch-provided makefile fragments, compat source dirs

the immediate usage case for this is to let 32-bit archs moving to
64-bit time_t via symbol redirection pull in wrapper shims that
provide the old symbol names. in the future it may be used for other
types of compatibility-only source files that are not relevant to all
archs.

5 years agoadd __dlsym_time64 asm entry point for all legacy-32bit-time_t archs
Rich Felker [Sun, 20 Oct 2019 18:32:20 +0000 (14:32 -0400)]
add __dlsym_time64 asm entry point for all legacy-32bit-time_t archs

5 years agoadd time64 redirect for, and redirecting implementation of, dlsym
Rich Felker [Fri, 9 Aug 2019 19:26:23 +0000 (15:26 -0400)]
add time64 redirect for, and redirecting implementation of, dlsym

if symbols are being redirected to provide the new time64 ABI, dlsym
must perform matching redirections; otherwise, it would poke a hole in
the magic and return pointers to functions that are not safe to call
from a caller using time64 types.

rather than duplicating a table of redirections, use the time64
symbols present in libc's symbol table to derive the decision for
whether a particular symbol needs to be redirected.

5 years agoadd time32 ABI compat shims, compat source tree
Rich Felker [Fri, 2 Aug 2019 19:52:42 +0000 (15:52 -0400)]
add time32 ABI compat shims, compat source tree

these files provide the symbols for the traditional 32-bit time_t ABI
on existing 32-bit archs by wrapping the real, internal versions of
the corresponding functions, which always work with 64-bit time_t.
they are written to be as agnostic as possible to the implementation
details of the real functions, so that they can be written once and
mostly forgotten, but they are aware of details of the old (and
sometimes new) ABI, which is okay since ABI is fixed and cannot
change.

a new compat tree is added, separate from src, which the Makefile does
not see or use now, but which archs will be able to add to the build
process. we could also consider moving other things that are compat
shims here, like functions which are purely for glibc-ABI-compat, with
the goal of making it optional or just cleaning up the main src tree
to make the distinction between actual implementation/API files and
ABI-compat shims clear.

5 years agomake fstatat fill in old time32 stat fields too
Rich Felker [Fri, 2 Aug 2019 01:33:57 +0000 (21:33 -0400)]
make fstatat fill in old time32 stat fields too

here _REDIR_TIME64 is used as an indication that there's an old ABI,
and thereby the old time32 timespec fields of struct stat.

keeping struct stat compatible and providing both versions of the
timespec fields is done so that ftw/nftw does not need painful compat
shims, and (more importantly) so that similar interfaces between pairs
of libc consumers (applications/libraries) will be less likely to
break when one has been rebuilt for time64 but the other has not.