Commit Graph

4459 Commits

Author SHA1 Message Date
Rich Felker
2e0907ce62 move __string_read into vsscanf source file
apparently this function was intended at some point to be used by
strto* family as well, and thus was put in its own file; however, as
far as I can tell, it's only ever been used by vsscanf. move it to the
same file to reduce the number of source files and external symbols.
2020-04-17 16:18:07 -04:00
Rich Felker
2acf3bce01 remove spurious repeated semicolon in fmemopen 2020-04-17 16:11:43 -04:00
Rich Felker
74fa4aac12 combine two calls to memset in fmemopen
this idea came up when I thought we might need to zero the UNGET
portion of buf as well, but it seems like a useful improvement even
when that turned out not to be necessary.
2020-04-17 16:10:28 -04:00
Rich Felker
086542fb5b fix possible access to uninitialized memory in shgetc (via scanf)
shgetc sets up to be able to perform an "unget" operation without the
caller having to remember and pass back the character value, and for
this purpose used a conditional store idiom:

    if (f->rpos[-1] != c) f->rpos[-1] = c

to make it safe to use with non-writable buffers (setup by the
sh_fromstring macro or __string_read with sscanf).

however, validity of this depends on the buffer space at rpos[-1]
being initialized, which is not the case under some conditions
(including at least unbuffered files and fmemopen ones).

whenever data was read "through the buffer", the desired character
value is already in place and does not need to be written. thus,
rather than testing for the absence of the value, we can test for
rpos<=buf, indicating that the last character read could not have come
from the buffer, and thereby that we have a "real" buffer (possibly of
zero length) with writable pushback (UNGET bytes) below it.
2020-04-17 15:55:17 -04:00
Rich Felker
b287cd745c fix undefined behavior in scanf core
as reported/analyzed by Pascal Cuoq, the shlim and shcnt
macros/functions are called by the scanf core (vfscanf) with f->rpos
potentially null (if the FILE is not yet activated for reading at the
time of the call). in this case, they compute differences between a
null pointer (f->rpos) and a non-null one (f->buf), resulting in
undefined behavior.

it's unlikely that any observably wrong behavior occurred in practice,
at least without LTO, due to limits on what's visible to the compiler
from translation unit boundaries, but this has not been checked.

fix is simply ensuring that the FILE is activated for read mode before
entering the main scanf loop, and erroring out early if it can't be.
2020-04-17 15:19:05 -04:00
Alexander Monakov
19f870c3a6 math: add x86_64 remquol 2020-03-24 16:31:36 -04:00
Alexander Monakov
bc87299ce7 math: move x87-family fmod functions to C with inline asm 2020-03-24 16:31:36 -04:00
Alexander Monakov
b173e4262f math: move x87-family remainder functions to C with inline asm 2020-03-24 16:31:36 -04:00
Alexander Monakov
51f4f8c512 math: move x87-family rint functions to C with inline asm 2020-03-24 16:31:36 -04:00
Alexander Monakov
9443f1b5cf math: move x87-family lrint functions to C with inline asm 2020-03-24 16:31:36 -04:00
Alexander Monakov
6bbdbfdcde math: move x86_64 (l)lrint(f) functions to C with inline asm 2020-03-24 16:31:36 -04:00
Alexander Monakov
acfe6d033e math: move i386 sqrt to C with inline asm 2020-03-24 16:31:36 -04:00
Alexander Monakov
29adaeb2c0 math: move i386 sqrtf to C with inline asm 2020-03-24 16:31:36 -04:00
Alexander Monakov
41b290ba39 math: move trivial x86-family sqrt functions to C with inline asm 2020-03-24 16:27:38 -04:00
Alexander Monakov
c24a992386 math: move x87-family fabs functions to C with inline asm 2020-03-24 16:27:38 -04:00
Alexander Monakov
87026f6843 math: move x86_64 fabs, fabsf to C with inline asm 2020-03-24 16:27:06 -04:00
Samuel Holland
33338ebc85 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.
2020-03-21 12:47:09 -04:00
Samuel Holland
8e452abae6 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.
2020-03-21 12:24:40 -04:00
Alexander Monakov
526df238d0 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.
2020-03-20 15:45:08 -04:00
Fangrui Song
72658c658b ldso: remove redundant switch case for REL_NONE
as a result of commit b6a6cd703f,
the REL_NONE case is now redundant.
2020-03-20 12:35:38 -04:00
Samuel Holland
3e9d3386f1 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.
2020-03-14 21:39:39 -04:00
Timo Teräs
8343334d7b 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).
2020-03-14 21:23:37 -04:00
Rich Felker
2b2c8aafce 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.
2020-03-14 21:23:37 -04:00
Rich Felker
5db475f0b9 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.
2020-03-14 21:23:37 -04:00
Rich Felker
db86ec100d remove useless mips syscall asm constraint, align style with mips64/n32
commit 4221f154ff 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.
2020-03-14 21:23:37 -04:00
Rich Felker
972b5fde9a revert mips (32-bit, o32) syscall asm clean-up due to regressions
exactly revert commit 604f8d3d8b 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.
2020-03-14 21:22:50 -04:00
Rich Felker
5053fd2644 revert mips64/n32 syscall asm clean-up due to regressions
effectivly revert commit ddc7c4f936
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 4221f154ff.
2020-03-14 21:21:45 -04:00
Rich Felker
2f2348c958 remove duplicate definitions of INET[6]_ADDRSTRLEN
these were leftover from early beginnings when arpa/inet.h was not
including netinet/in.h.
2020-03-04 12:33:35 -05:00
Rich Felker
4e0796dfc7 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.
2020-02-26 10:09:32 -05:00
Rich Felker
7063c459e7 use __socketcall to simplify socket()
commit 59324c8b09 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
2020-02-22 11:07:14 -05:00
Rich Felker
a01f1fe66f remove wrap_write helper from vdprintf
this reverts commit 4ee039f354, 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 f3ddd17380
this has been unnecessary and the function was just wasting size and
execution time.
2020-02-21 23:44:20 -05:00
Szabolcs Nagy
d20558148d 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.
2020-02-21 23:42:12 -05:00
Szabolcs Nagy
b3797d3b2e 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.
2020-02-21 23:42:05 -05:00
Rich Felker
040c1d16b4 release 1.2.0 2020-02-20 19:37:02 -05:00
Rich Felker
c9ebff4736 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 9493892021 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.
2020-02-12 17:34:17 -05:00
Rich Felker
a662220df5 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.
2020-02-06 16:46:15 -05:00
Rich Felker
2f0c31c027 rename i386 exp.s to exp_ld.s
this commit is for the sake of reviewable history.
2020-02-06 16:24:03 -05:00
Rich Felker
ab9e20905d fix excess precision in return value of i386 log-family functions 2020-02-06 13:29:45 -05:00
Rich Felker
141c8d4ccb fix excess precision in return value of i386 acos[f] and asin[f]
analogous to commit 1c9afd6905 for
atan[2][f].
2020-02-06 13:21:26 -05:00
Rich Felker
1c9afd6905 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.
2020-02-06 13:18:00 -05:00
Rich Felker
b4712ba445 remove legacy time32 timer[fd] syscalls from public syscall.h
this extends commit 5a105f19b5, 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.
2020-02-05 09:57:41 -05:00
Rich Felker
2cae9f59da remove further legacy time32 clock syscalls from public syscall.h
this extends commit 5a105f19b5, removing
clock_settime, clock_getres, clock_nanosleep, and settimeofday.
2020-02-05 09:51:09 -05:00
Rich Felker
1102062081 fix incorrect results for catanf and catanl with some inputs
catan was fixed in 10e4bd3780 but the
same bug in catanf and catanl was overlooked. the patch is completely
analogous.
2020-02-05 09:40:11 -05:00
Rich Felker
329e79299d 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.
2020-02-04 09:29:13 -05:00
Rich Felker
5a105f19b5 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.
2020-01-30 11:25:07 -05:00
Rich Felker
e6093b5a87 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.
2020-01-29 10:47:48 -05:00
Rich Felker
a0217a2ff7 fix unprotected macro argument in sys/ttydefaults.h 2020-01-29 10:47:19 -05:00
Alexander Monakov
ff5b8ad386 math/x32: correct lrintl.s for 32-bit long 2020-01-27 13:02:19 -05:00
Rich Felker
614c9e7b1e 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.
2020-01-25 23:08:55 -05:00
Luís Marques
83350eb17b 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.
2020-01-22 14:57:16 -05:00