aboutsummaryrefslogtreecommitdiff
AgeCommit message (Collapse)AuthorFilesLines
2021-08-27iconv: Accept redundant shift sequences in IBM1364 [BZ #26224]Arjun Shankar1-12/+2
The IBM1364, IBM1371, IBM1388, IBM1390 and IBM1399 character sets share converter logic (iconvdata/ibm1364.c) which would reject redundant shift sequences when processing input in these character sets. This led to a hang in the iconv program (CVE-2020-27618). This commit adjusts the converter to ignore redundant shift sequences and adds test cases for iconv_prog hangs that would be triggered upon their rejection. This brings the implementation in line with other converters that also ignore redundant shift sequences (e.g. IBM930 etc., fixed in commit 692de4b3960d). Reviewed-by: Carlos O'Donell <carlos@redhat.com>
2021-08-27iconv: Fix incorrect UCS4 inner loop bounds (BZ#26923)Michael Colavita3-13/+56
Previously, in UCS4 conversion routines we limit the number of characters we examine to the minimum of the number of characters in the input and the number of characters in the output. This is not the correct behavior when __GCONV_IGNORE_ERRORS is set, as we do not consume an output character when we skip a code unit. Instead, track the input and output pointers and terminate the loop when either reaches its limit. This resolves assertion failures when resetting the input buffer in a step of iconv, which assumes that the input will be fully consumed given sufficient output space.
2021-08-27math/test-sinl-pseudo: Use stack protector only if availableFlorian Weimer1-0/+2
This fixes commit 9333498794cde1d5cca518bad ("Avoid ldbl-96 stack corruption from range reduction of pseudo-zero (bug 25487).").
2021-08-27Avoid ldbl-96 stack corruption from range reduction of pseudo-zero (bug 25487).Joseph Myers3-1/+55
Bug 25487 reports stack corruption in ldbl-96 sinl on a pseudo-zero argument (an representation where all the significand bits, including the explicit high bit, are zero, but the exponent is not zero, which is not a valid representation for the long double type). Although this is not a valid long double representation, existing practice in this area (see bug 4586, originally marked invalid but subsequently fixed) is that we still seek to avoid invalid memory accesses as a result, in case of programs that treat arbitrary binary data as long double representations, although the invalid representations of the ldbl-96 format do not need to be consistently handled the same as any particular valid representation. This patch makes the range reduction detect pseudo-zero and unnormal representations that would otherwise go to __kernel_rem_pio2, and returns a NaN for them instead of continuing with the range reduction process. (Pseudo-zero and unnormal representations whose unbiased exponent is less than -1 have already been safely returned from the function before this point without going through the rest of range reduction.) Pseudo-zero representations would previously result in the value passed to __kernel_rem_pio2 being all-zero, which is definitely unsafe; unnormal representations would previously result in a value passed whose high bit is zero, which might well be unsafe since that is not a form of input expected by __kernel_rem_pio2. Tested for x86_64.
2021-08-27posix: Sync gnulib regex implementationAdhemerval Zanella11-1161/+1591
This patch syncs the regex implementation with gnulib (commit 0ee5212). Only two changes in GLIBC regex testing are required: 1. posix/bug-regex28.c: as previously discussed [1] the change of expected results on the pattern should be safe. 2. posix/PCRE.tests: the ERE (a)|\1 is malformed (in the sense that the \1 doesn't mean anything) and although current GLIBC accepts it has undefined behavior. This patch removes the specific test. This sync contains some patches from thread 'Regex: Make libc regex more usable outside GLIBC.' [2] which have been pushed upstream in gnulib. This patches also fixes some regex issues (BZ #23233, BZ #21163, BZ #18986, BZ #13762) and I did not add testcases for both #23233 and #13762 because I couldn't think a simple way to trigger the expected failure path to trigger them. Checked on x86_64-linux-gnu and i686-linux-gnu. [BZ #23233] [BZ #21163] [BZ #18986] [BZ #13762] * posix/Makefile (tests): Add bug-regex37 and bug-regex38. * posix/PCRE.tests: Remove invalid test. * posix/bug-regex28.c: Fix expected values for used syntax. * posix/bug-regex37.c: New file. * posix/bug-regex38.c: Likewise. * posix/regcomp.c: Sync with gnulib. * posix/regex.c: Likewise. * posix/regex.h: Likewise. * posix/regex_internal.c: Likewise. * posix/regex_internal.h: Likewise. * posix/regexec.c: Likewise. [1] https://sourceware.org/ml/libc-alpha/2017-12/msg00807.html [2] https://sourceware.org/ml/libc-alpha/2017-12/msg00237.html
2021-08-27Fix use-after-free in glob when expanding ~user (bug 25414)Andreas Schwab1-12/+13
The value of `end_name' points into the value of `dirname', thus don't deallocate the latter before the last use of the former.
2021-08-27Fix a return type in elf unload testStan Shebs1-1/+2
2021-08-27Fix buffer overrun in EUC-KR conversion module (bz #24973)Andreas Schwab3-8/+57
The byte 0xfe as input to the EUC-KR conversion denotes a user-defined area and is not allowed. The from_euc_kr function used to skip two bytes when told to skip over the unknown designation, potentially running over the buffer end.
2021-08-27gconv: Fix assertion failure in ISO-2022-JP-3 module (bug 27256)Florian Weimer3-20/+179
The conversion loop to the internal encoding does not follow the interface contract that __GCONV_FULL_OUTPUT is only returned after the internal wchar_t buffer has been filled completely. This is enforced by the first of the two asserts in iconv/skeleton.c: /* We must run out of output buffer space in this rerun. */ assert (outbuf == outerr); assert (nstatus == __GCONV_FULL_OUTPUT); This commit solves this issue by queuing a second wide character which cannot be written immediately in the state variable, like other converters already do (e.g., BIG5-HKSCS or TSCII). Reported-by: Tavis Ormandy <taviso@gmail.com>
2021-08-27Read f->func.cxa under the lock.Vitaly Buka3-11/+135
2021-08-27Fix bug where ld.so hashtable would retain strings passed to dlopen().Ambrose Feinstein1-11/+2
2021-08-27Extend elf/unload8 to test an additional load/unload patternStan Shebs3-1/+55
2021-08-27Don't crash if /var/tmp doesn't existShu-Chun Weng1-2/+1
`xstat` is checked `stat64` crashing the program if the latter returns failure. In this loop, we are trying to find one folder that satisfies the condition, no reason to crash the program if one folder doesn't.
2021-08-27More aggressively prevent a buffer from being optimized outShu-Chun Weng1-2/+2
The volatile global variable was first introduced in e86f9654c. I have noticed the compiler still optimizing the buffer out on AArch64 presumably because the assignment is after all other observable behaviors so it's still valid to eliminate it.
2021-08-27x86_64: Remove unneeded static PIE check for undefined weak diagnosticFangrui Song2-58/+0
https://sourceware.org/bugzilla/show_bug.cgi?id=21782 dropped an ld diagnostic for R_X86_64_PC32 referencing an undefined weak symbol in -pie links. Arguably keeping the diagnostic like other ports is more correct, since statically resolving movl foo(%rip), %eax to the link-time zero address produces a corrupted output. It turns out that --enable-static-pie builds do not depend on the ld behavior. GCC generates GOT indirection for weak declarations for -fPIE/-fPIC, so what ld does with the PC-relative relocation doesn't really matter. Reviewed-by: H.J. Lu <hjl.tools@gmail.com>
2021-08-27[PATCH 7/7] sin/cos slow paths: refactor sincos implementationWilco Dijkstra2-45/+52
Refactor the sincos implementation - rather than rely on odd partial inlining of preprocessed portions from sin and cos, explicitly write out the cases. This makes sincos much easier to maintain and provides an additional 16-20% speedup between 0 and 2^27. The overall speedup of sincos is 48% over this range. Between 0 and PI it is 66% faster. * sysdeps/ieee754/dbl-64/s_sin.c (__sin): Cleanup ifdefs. (__cos): Likewise. * sysdeps/ieee754/dbl-64/s_sin.c (__sincos): Refactor using the same logic as sin and cos.
2021-08-27[PATCH 6/7] sin/cos slow paths: refactor duplicated code into dosinWilco Dijkstra1-27/+13
Refactor duplicated code into do_sin. Since all calls to do_sin use copysign to set the sign of the result, move it inside do_sin. Small inputs use a separate polynomial, so move this into do_sin as well (the check is based on the more conservative case when doing large range reduction, but could be relaxed). * sysdeps/ieee754/dbl-64/s_sin.c (do_sin): Use TAYLOR_SIN for small inputs. Return correct sign. (do_sincos): Remove small input check before do_sin, let do_sin set the sign. (__sin): Likewise. (__cos): Likewise.
2021-08-27[PATCH 5/7] sin/cos slow paths: remove unused slowpath functionsWilco Dijkstra1-444/+3
Remove all unused slowpath functions. * sysdeps/ieee754/dbl-64/s_sin.c (TAYLOR_SLOW): Remove. (do_cos_slow): Likewise. (do_sin_slow): Likewise. (reduce_and_compute): Likewise. (slow): Likewise. (slow1): Likewise. (slow2): Likewise. (sloww): Likewise. (sloww1): Likewise. (sloww2): Likewise. (bslow): Likewise. (bslow1): Likewise. (bslow2): Likewise. (cslow2): Likewise.
2021-08-27[PATCH 4/7] sin/cos slow paths: remove slow paths from huge range reductionWilco Dijkstra2-64/+34
For huge inputs use the improved do_sincos function as well. Now no cases use the correction factor returned by do_sin, do_cos and TAYLOR_SIN, so remove it. * sysdeps/ieee754/dbl-64/s_sin.c (TAYLOR_SIN): Remove cor parameter. (do_cos): Remove corp parameter and calculations. (do_sin): Likewise. (do_sincos): Remove cor variable. (__sin): Use do_sincos for huge inputs. (__cos): Likewise. * sysdeps/ieee754/dbl-64/s_sincos.c (__sincos): Likewise. (reduce_and_compute_sincos): Remove unused function.
2021-08-27[PATCH 3/7] sin/cos slow paths: remove slow paths from small range reductionWilco Dijkstra2-53/+47
This patch improves the accuracy of the range reduction. When the input is large (2^27) and very close to a multiple of PI/2, using 110 bits of PI is not enough. Improve range reduction accuracy to 136 bits. As a result the special checks for results close to zero can be removed. The ULP of the polynomials is at worst 0.55ULP, so there is no reason for the slow functions, and they can be removed. * sysdeps/ieee754/dbl-64/s_sin.c (reduce_sincos_1): Rename to reduce_sincos, improve accuracy to 136 bits. (do_sincos_1): Rename to do_sincos, remove fallbacks to slow functions. (__sin): Use improved reduction and simplified do_sincos calculation. (__cos): Likewise. * sysdeps/ieee754/dbl-64/s_sincos.c (__sincos): Likewise.
2021-08-27[PATCH 2/7] sin/cos slow paths: remove large range reductionWilco Dijkstra2-103/+2
This patch removes the large range reduction code and defers to the huge range reduction code. The first level range reducer supports inputs up to 2^27, which is way too large given that inputs for sin/cos are typically small (< 10), and optimizing for a smaller range would give a significant speedup. Input values above 2^27 are practically never used, so there is no reason for supporting range reduction between 2^27 and 2^48. Removing it significantly simplifies code and enables further speedups. There is about a 2.3x slowdown in this range due to __branred being extremely slow (a better algorithm could easily more than double performance). * sysdeps/ieee754/dbl-64/s_sin.c (reduce_sincos_2): Remove function. (do_sincos_2): Likewise. (__sin): Remove middle range reduction case. (__cos): Likewise. * sysdeps/ieee754/dbl-64/s_sincos.c (__sincos): Remove middle range reduction case.
2021-08-27[PATCH 1/7] sin/cos slow paths: avoid slow paths for small inputsWilco Dijkstra3-26/+26
This series of patches removes the slow patchs from sin, cos and sincos. Besides greatly simplifying the implementation, the new version is also much faster for inputs up to PI (41% faster) and for large inputs needing range reduction (27% faster). ULP is ~0.55 with no errors found after testing 1.6 billion inputs across most of the range with mpsin and mpcos. The number of incorrectly rounded results (ie. ULP >0.5) is at most ~2750 per million inputs between 0.125 and 0.5, the average is ~850 per million between 0 and PI. Tested on AArch64 and x86_64 with no regressions. The first patch removes the slow paths for the cases where the input is small and doesn't require range reduction. Update ULP tables for sin, cos and sincos on AArch64 and x86_64. * sysdeps/aarch64/libm-test-ulps: Update ULP for sin, cos, sincos. * sysdeps/ieee754/dbl-64/s_sin.c (__sin): Remove slow paths for small inputs. (__cos): Likewise. * sysdeps/x86_64/fpu/libm-test-ulps: Update ULP for sin, cos, sincos.
2021-08-27locale: Align _nl_C_LC_CTYPE_class and _nl_C_LC_CTYPE_class32Lirong Yuan1-2/+3
Otherwise, programs that use character classification macros such as isspace may observe unaligned pointers.
2021-08-27Change this offsetof computation to use c89 offsetof. Tested:Nick Lewycky1-1/+1
2021-08-27Update build process to create libnsl stubStan Shebs3-3/+4
2021-08-27Forward-port google-nsl-stubPaul Pluzhnikov4-0/+81
2021-08-27Fix memory leak in TLS allocationJames Y Knight1-0/+1
2021-08-27Add a test of TLS support that will fail if leakyStan Shebs3-2/+151
2021-08-27Let time and gettimeofday use vdso by removing old clang workaroundStan Shebs2-8/+2
2021-08-27Use crt*.o files from llvm compiler-rt when building with clangStan Shebs1-0/+20
2021-08-27Do not use ppc-specific long double pack/unpack when compiling with clangStan Shebs1-0/+5
2021-08-27Remove old workaround in power7 logb functions, clang no longer crashes on ↵Stan Shebs3-24/+0
the inline assembly
2021-08-27Additional fixes for llvm-asJosh Kunz2-2/+2
Unlike GCC, llvm always uses an integrated assembler, which attempts to recognized all `asm` statements written in the C code. glibc uses some syntactically invalid asm statements to emit constants into assembly that are later extracted with a sed or AWK script. This change fixes two such invalid `asm` statements by wrapping the output in a `.ascii` directive.. This does not break the sed/AWK (the same special sequence is output) but it makes the statement syntactically valid. See cf8e3f8757 for a previous fix for the same issue.
2021-08-27Add workaround for infinite looping in ppc vsyscall for sched_getcpu.Stan Shebs1-0/+17
2021-08-27Add -Wno-incomplete-setjmp-declaration to prevent clang from unhelpfully ↵Stan Shebs1-0/+1
complaining about __sigsetjmp, both in library build and testsuite runs.
2021-08-27Update passwd.borg handling to use passwd.borg.realStan Shebs1-64/+151
2021-08-27Add a case to async-signal-safe TLS to set static TLS instead of waiting for ↵Stan Shebs1-2/+25
a dlopen that may not actually be happening.
2021-08-27Add an LD_DEBUG=tls option to help debug thread-local storage handling in ld.soStan Shebs4-8/+189
2021-08-27Remove an unneeded local refactor in _dl_update_slotinfoStan Shebs1-7/+6
2021-08-27Fix year 2039 bug for localtime with 64-bit time_t (bug 22639).Joseph Myers4-2/+55
Bug 22639 reports localtime failing to handle time offset transitions correctly in 2039 and later on platforms with 64-bit time_t. The problem is the use of SECSPERDAY (constant 86400) in calculations such as t = ((year - 1970) * 365 + /* Compute the number of leapdays between 1970 and YEAR (exclusive). There is a leapday every 4th year ... */ + ((year - 1) / 4 - 1970 / 4) /* ... except every 100th year ... */ - ((year - 1) / 100 - 1970 / 100) /* ... but still every 400th year. */ + ((year - 1) / 400 - 1970 / 400)) * SECSPERDAY; where t is of type time_t and year is of type int. Before my commit 92bd70fb85bce57ac47ba5d8af008736832c955a (an update from tzcode, included in 2.26 and later releases), SECSPERDAY was obtained from a file imported from tzcode, where the value included a cast to int_fast32_t. On 64-bit platforms, glibc defines int_fast32_t to be long int, so 64-bit, but my patch resulted in it changing to int. (The bug would probably have existed even before my patch for x32, which has 64-bit time_t but 32-bit int_fast32_t, but I haven't verified that.) This patch fixes the problem by including a cast to time_t in the definition of SECSPERDAY. (64-bit time support for 32-bit systems should move such code that isn't a public interface to using the internal 64-bit version of time_t throughout.) Tested for x86_64 and x86. [BZ #22639] * time/tzset.c (SECSPERDAY): Cast to time_t. * time/tst-y2039.c: New file. * time/Makefile (tests): Add tst-y2039.
2021-08-27Reduce __MAX_ALLOCA_CUTOFF to 8192Stan Shebs1-1/+3
2021-08-27Make multi-arch ifunc support work with clangStan Shebs3-14/+24
2021-08-27Revert clang workaround for _begin that is no longer neededStan Shebs1-6/+0
2021-08-27Redesign the fastload support for additional performanceAmbrose Feinstein9-434/+474
2021-08-27Add comments explaining the diff from cf8e3f8757Josh Kunz2-0/+14
These comments should make it easier to see the (small) diff introduced in cf8e3f8757. Without these comments, the diff may get list on a future upstream merge.
2021-08-27Make gen-XX-const scripts work with llvm-asJosh Kunz3-5/+4
The gen-as-const and gen-py-const scripts are used to generate integer constant definitions from a list of constant C-expressions. This is achieved by generating a C program with inline `asm` statements, that depend on these constant expressions. During compilation, the constant expressions are evaluated, and included in the inline asm. The build process generates only the assembly, and then used `sed` to extract the values from the assembly text. This is clever. It allows the build process to extract the value of C statements built under the target architecture. The implementation is a bit fragile, but it is not immediately obvious to me how it could be improved. This change slightly modifies `gen-as-const` and `gen-py-const` to emit valid assembly directives instead of invalid directives that were previously emitted. Since the values are extracted via string parsing, this has no effect on the values extracted. This is needed because the LLVM assembler validates all statements before emitting them, whereas it appears GCC will literally emit any `asm` directives without validation or recognition.
2021-08-27Fix sense of a test in the static-linking version of ppc get_clockfreqStan Shebs1-1/+1
2021-08-27Makes it compile for AArch64Shu-Chun Weng1-2/+14
De-nesting fix in 83c02e85 changed function signature but AArch64 was untested.
2021-08-27Makes AArch64 assembly acceptable to clangShu-Chun Weng4-14/+14
According to ARMv8 architecture reference manual section C7.2.188, SIMD MOV (to general) instruction format is MOV <Xd>, <Vn>.D[<index>] gas appears to accept "<Vn>.2D[<index>]" as well, but clang's assembler does not. C.f. https://community.arm.com/developer/ip-products/processors/f/cortex-a-forum/5214/aarch64-assembly-syntax-for-armclang
2021-08-27Include STATIC_PIE_BOOTSTRAP with !NESTING in powerpc64/dl-machine.hSiva Chandra Reddy1-1/+1