about summary refs log tree commit diff
path: root/src
Commit message (Collapse)AuthorAgeFilesLines
* catan: remove no-op reduction mod pi and unused codeRich Felker2024-08-163-74/+3
| | | | | the output of atan2 is already in the correct range and does not need further reduction. the MAXNUM macros were both unused and incorrect.
* remove incorrect comment regarding powl exceptional casesRich Felker2024-08-141-8/+0
| | | | | | | | the comment does not match the required or actual behavior when x<0 and y is not an integer. while it could be corrected, the role of comments here is to tell about characteristics unique to the implementation, not to restate the requirements of the standard, so just removing it seems best.
* strerror: add error strings for EUCLEAN and ENAVAILRich Felker2024-08-101-0/+2
| | | | | | | | | | | | | | | | while not the only error codes presently omitted, these two are particularly likely to be encountered in the wild. EUCLEAN is used by linux filesystem and device drivers to report filesystem structure corruption or data corruption. ENAVAIL is used by some linux drivers to indicate non-availability of a resource. both names are new inventions to correspond to how they are actually used, as the original kernel strings ("Structure needs cleaning" and "No XENIX semaphores available") are not remotely meaningful or reasonable.
* fix lost or delayed wakes in sem_post under certain race conditionsRich Felker2024-08-101-1/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | if sem_post is interrupted between clearing the waiters bit from the semaphore value and performing the futex wait operation, subsequent calls to sem_post will not perform a wake operation unless a new waiter has arrived. usually, this is at most a minor nuisance, since the original wake operation will eventually happen. however, it's possible that the wake is delayed indefinitely if interrupted by a signal handler, or that the address the wake needs to be performed on is no longer mapped if the semaphore was a process-shared one that has since been unmapped but has a waiter on a different mapping of the same semaphore. this can happen when another thread using the same mapping "steals the post" atomically before actually becoming a second waiter, deduces from success that it was the last user of the semaphore mapping, then re-posts and unmaps the semaphore mapping. this scenario was described in a report by Markus Wichmann. instead of checking only the waiters bit, also check the waiter count that was sampled before the atomic post operation, and perform the wake if it's nonzero. this will not produce any additional wakes under non-race conditions, since the waiters bit only becomes zero when targeting a single waiter for wake. checking both was already the behavior prior to commit 159d1f6c02569091c7a48bdb2e2e824b844a1902.
* timer_create: replace pthread barrier with semaphores for thread startRich Felker2024-07-241-4/+14
| | | | | | | | | | | | | | | | | | our pthread barrier implementation reportedly has bugs that are could lead to malfunction or crash in timer_create. while this has not been reviewed to confirm, there have been past reports of pthread barrier bugs, and it seems likely that something is actually wrong. pthread barriers are an obscure primitive, and timer_create is the only place we are using them internally at present. even if they were working correctly, this means we are imposing linking of otherwise likely-dead code whenever timer_create is used. a pair of semaphores functions identically to a 2-waiter barrier except for destruction order properties. since the parent is responsible for the argument structure (including semaphores) lifetimes, the last operation on them in the timer thread must be posting to the parent.
* atexit: fail rather than deadlocking after last handler is calledRich Felker2024-07-241-0/+12
| | | | | | | | | | | | | | | | previously, global dtors, which are executed after all atexit handlers have been called rather than being implemented as an atexit handler themselves, would deadlock if they called atexit. it was intentional to disallow adding more atexit handlers past the last point where they would be executed, since a successful return from atexit imposes a contract that the handler will be executed, but this was only considered in the context of calls to atexit from other threads, not calls from the dtors. to fix this, release the lock after the exit handlers loop completes, but but set a flag first so that we can make all future calls to atexit return a failure code.
* exit: add back lock to make concurrent calls to exit safeRich Felker2024-07-231-0/+14
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | per the C and POSIX standards, calling exit "more than once", including via return from main, produces undefined behavior. this language predates threads, and at the time it was written, could only have applied to recursive calls to exit via atexit handlers. C++ likewise makes calls to exit from global dtors undefined. nonetheless, by the present specification as written, concurrent calls to exit by multiple threads also have undefined behavior. originally, our implementation of exit did have locking to handle concurrent calls safely, but that was changed in commit 2e55da911896a91e95b24ab5dc8a9d9b0718f4de based on it being undefined. from a standpoint of both hardening and quality of implementation, that change seems to have been a mistake. this change adds back locking, but with awareness of the lock owner so that recursive calls to exit can be trapped rather than deadlocking. this also opens up the possibility of allowing recursive calls to succeed, if future consensus ends up being in favor of that. prior to this change, exit already behaved partly as if protected by a lock as long as atexit was linked, but multiple threads calling exit could concurrently "pop off" atexit handlers and execute them in parallel with one another rather than serialized in the reverse order of registration. this was a likely unnoticed but potentially very dangerous manifestation of the undefined behavior. if on the other hand atexit was not linked, multiple threads calling exit concurrently could each run their own instance of global dtors, if any, likely producing double-free situations. now, if multiple threads call exit concurrently, all but the first will permanently block (in SYS_pause) until the process terminates, and all atexit handlers, global dtors, and stdio flushing/position consistency will be handled in the thread that arrived first. this is really the only reasonable way to define concurrent calls to exit. it is not recommended usage, but may become so in the future if there is consensus/standardization, as there is a push from the rust language community (and potentially other languages interoperating with the C runtime) to make concurrent calls to the language's exit interfaces safe even when multiple languages are involved in a program, and this is only possible by having the locking in the underlying C exit.
* move __utc string object to its own translation unitRich Felker2024-07-232-1/+3
| | | | | having it in __tz.c caused gmtime[_r] and timegm to pull in all of the time zone code despite having no need for it.
* syslog: revert LOG_FAC/LOG_FACMASK changesRich Felker2024-07-051-1/+1
| | | | | | | | | | | | | | | | | | | | | commit 895736d49bd2bb318c69de99a05ea70c035c2da9 made these changes along with fixing a real bug in LOG_MAKEPRI. based on further information, they do not seem to be well-motivated or in line with policy. the result of LOG_FAC is not a meaningful facility value if we shift it down like before, but apparently the way it is used by applications is as an index into an array of facility names. moreover, all historical systems which define it do so with the shift. as it is a nonstandard interface, there is no justification for providing a macro by the same name that is incompatible with historical practice. the value of LOG_FACMASK likewise is 0x3f8 on all historical systems checked. while only 5 bits are used for existing facility codes, the convention seems to be that all 7 bits belong to the facility field and theoretically could be used to expand to having more facilities. that seems unlikely to happen, but there is no reason to make a gratuitously incompatible change here.
* siglongjmp: document why this function just calls longjmpRich Felker2024-06-231-0/+5
|
* inet_ntop: fix the IPv6 leading zero sequence compressionJakub Stasiak2024-06-221-1/+6
| | | | | | | | | | | | Per RFC 5952, ties for longest sequence of zero fields must be broken by choosing the earliest, but the implementation put the leading sequence of zeros at a disadvantage. That's because for example when compressing "0:0:0:10:0:0:0:10" the strspn(buf+i, ":0") call returns 6 for the first sequence and 7 for the second one – the second sequence has the benefit of a leading colon. Changing the condition to require beating the leading sequence by not one but two characters resolves the issue.
* getusershell: skip blank lines and commentsRich Felker2024-06-211-2/+4
| | | | | | | | this interface does not have a lot of historical consensus on how it handles the contents of the /etc/shells file in regard to whitespace and comments, but the commonality between all checked is that they ignore lines that are blank or that begin with '#', so that is the behavior we adopt.
* syslog: fix incorrect LOG_MAKEPRI and LOG_FAC[MASK] macrosRich Felker2024-06-131-1/+1
| | | | | | | | these are nonstandard and unnecessary for using the associated functionality, but resulted in applications that used them malfunctioning. patch based on proposed fix by erny hombre.
* add renameat2 linux syscall wrapperTony Ambardar2024-05-231-0/+11
| | | | | | | | | This syscall is available since Linux 3.15 and also implemented in glibc from version 2.28. It is commonly used in filesystem or security contexts. Constants RENAME_NOREPLACE, RENAME_EXCHANGE, RENAME_WHITEOUT are guarded by _GNU_SOURCE as with glibc.
* fix mismatched type in posix_getdents definitionRich Felker2024-05-121-1/+1
| | | | | | | commit 1b0d48517f816e98f19111df82f32bfc1608ecec wrongly copied the getdents return type of int rather than matching the ssize_t used by posix_getdents. this was overlooked in testing on 32-bit archs but obviously broke 64-bit archs.
* implement posix_getdents adopted for next issue of POSIXRich Felker2024-05-081-0/+11
| | | | | | this interface was added as the outcome of Austin Group tracker issue 697. no error is specified for unsupported flags, which is probably an oversight. for now, EOPNOTSUPP is used so as not to overload EINVAL.
* strptime: implement conversion specifiers adopted for next POSIX issueRich Felker2024-05-061-1/+65
| | | | | | | | | | | | | | | | | the %s conversion is added as the outcome of Austin Group tracker issue 169 and its unspecified behavior is clarified as the outcome of issue 1727. the %F, %g, %G, %u, %V, %z, and %Z conversions are added as the outcome of Austin Group tracker issue 879 for alignment with strftime and the behaviors of %u, %z, and %Z are defined as the outcome of issue 1727. at this time, the conversions with unspecified effects on struct tm are all left as parse-only no-ops. this may be changed at a later time, particularly for %s, if there is reasonable cross-implementation consensus outside the standards process on what the behavior should be.
* printf decimal integer formatting: shave off one divisionRich Felker2024-05-061-1/+2
| | | | | | | | | | once the remaining value is less than 10, the modulo operation to produce the final digit and division to prepare for next loop iteration can be dropped. this may be a meaningful performance distinction when formatting low-magnitude numbers in bulk, and should never hurt. based on patch by Viktor Reznov.
* initgroups: do not artificially limit number of supplementary groupsRich Felker2024-04-131-4/+22
| | | | | | | | | | | | | | | | | | | | | historically linux limited the number of supplementary groups a process could be in to 32, but this limit was raised to 65536 in linux 2.6.4. proposals to support the new limit, change NGROUPS_MAX, or make it dynamic have been stalled due to the impact it would have on initgroups where the groups array exists in automatic storage. the changes here decouple initgroups from the value of NGROUPS_MAX and allow it to fall back to allocating a buffer in the case where getgrouplist indicates the user has more supplementary groups than could be reported in the buffer. getgrouplist already involves allocation, so this does not pull in any new link dependency. likewise, getgrouplist is already using the public malloc (vs internal libc one), so initgroups does the same. if this turns out not to be the best choice, both can be changed together later. the initial buffer size is left at 32, but now as the literal value, so that any potential future change to NGROUPS_MAX will not affect initgroups.
* printf: fix edge case where hex float precision was not honoredRich Felker2024-04-121-9/+2
| | | | | | | | | | | | | | | | | | commit cfa0a54c082d41db6446638eed1d57f163434092 attempted to fix rounding on archs where long double is not 80-bit (where LDBL_MANT_DIG is not zero mod four), but failed to address the edge case where rounding was skipped because LDBL_MANT_DIG/4 rounded down in the comparison against the requested precision. the rounding logic based on hex digit count is difficult to understand and not well-motivated, so rather than try to fix it, replace it with an explicit calculation in terms of number of bits to be kept, without any truncating division operations. based on patch by Peter Ammon, but with scalbn to apply the rounding exponent since the value will not generally fit in any integer type. scalbn is used instead of scalbnl to avoid pulling in the latter unnecessarily, since the value is an exact power of two whose exponent range is bounded by LDBL_MANT_DIG, a small integer.
* complex: fix comment in cacoshSzabolcs Nagy2024-03-141-1/+1
| | | | | | | | | | | The principal expressions defining acosh and acos are such that acosh(z) = ±i acos(z) where the + is only true on the Im(z)>0 half of the complex plane (and partly on Im(z)==0 depending on number representation). fix the comment without expanding on the details.
* math: fix fma(x,y,0) when x*y rounds to -0Szabolcs Nagy2024-03-141-1/+1
| | | | | | | | | if x!=0, y!=0, z==0 then fma(x,y,z) == x*y in all rounding modes, while adding z can ruin the sign of 0 if x*y rounds to -0.
* fix pwrite/pwritev handling of O_APPEND filesRich Felker2024-03-142-1/+20
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | POSIX requires pwrite to honor the explicit file offset where the write should take place even if the file was opened as O_APPEND. however, linux historically defined the pwrite syscall family as honoring O_APPEND. this cannot be changed on the kernel side due to stability policy, but the addition of the pwritev2 syscall with a flags argument opened the door to fixing it, and linux commit 73fa7547c70b32cc69685f79be31135797734eb6 adds the RWF_NOAPPEND flag that lets us request a write honoring the file offset argument. this patch changes the pwrite function to first attempt using the pwritev2 syscall with RWF_NOAPPEND, falling back to using the old pwrite syscall only after checking that O_APPEND is not set for the open file. if O_APPEND is set, the operation fails with EOPNOTSUPP, reflecting that the kernel does not support the correct behavior. this is an extended error case needed to avoid the wrong behavior that happened before (writing the data at the wrong location), and is aligned with the spirit of the POSIX requirement that "An attempt to perform a pwrite() on a file that is incapable of seeking shall result in an error." since the pwritev2 syscall interprets the offset of -1 as a request to write at the current file offset, it is mapped to a different negative value that will produce the expected error. pwritev, though not governed by POSIX at this time, is adjusted to match pwrite in honoring the offset.
* iconv: fix missing bounds checking for shift_jis decodingRich Felker2024-03-021-0/+1
| | | | | | | | the jis0208 table we use is only 84x94 in size, but the shift_jis encoding supports a 94x94 grid. attempts to convert sequences outside of the supported zone resulted in out-of-bounds table reads, misinterpreting adjacent rodata as part of the character table and thereby converting these sequences to unexpected characters.
* add missing inline keyword on default a_barrier definitionRich Felker2024-03-021-1/+1
| | | | | | this is not needed, but may act as a hint to the compiler, and also serves to suppress unused function warnings if enabled (on by default since commit 86ac0f794731f03dfff40ee843ff9e2752945d5e).
* iconv: add aliases for GBKRich Felker2024-03-011-1/+1
| | | | | these are taken from the IANA registry, restricted to those that match the forms already used for other supported character encodings.
* iconv: add euro symbol to GBK as single byte 0x80Rich Felker2024-03-011-0/+4
| | | | | | | | | this is how it's defined in the cp936 document referenced by the IANA charset registry as defining GBK, and of the mappings defined there, was the only one missing. it is not accepted for GB18030, as GB18030 is a UTF and has its own unique mapping for the euro symbol.
* iconv: add cp932 as an alias for shift_jisRich Felker2024-02-291-1/+1
|
* riscv32: add thread supportStefan O'Rear2024-02-294-0/+76
| | | | Identical to riscv64 except for stack offsets in clone.
* riscv32: add setjmp/longjmp and sigreturnStefan O'Rear2024-02-294-0/+114
| | | | Largely copied from riscv64 but required recalculation of offsets.
* riscv32: add dlsymStefan O'Rear2024-02-291-0/+6
| | | | Identical to riscv64.
* riscv32: add fenv and mathStefan O'Rear2024-02-2914-0/+239
| | | | These are identical to riscv64.
* getnameinfo: fix calling __dns_parse with potentially too large rlenAlexey Izbyshev2024-02-291-1/+3
| | | | | | | | | __res_send returns the full answer length even if it didn't fit the buffer, but __dns_parse expects the length of the filled part of the buffer. This is analogous to commit 77327ed064bd57b0e1865cd0e0364057ff4a53b4, which fixed the only other __dns_parse call site.
* posix_spawn: fix child spinning on write to a broken pipeAlexey Izbyshev2024-02-291-1/+6
| | | | | | | | | A child process created by posix_spawn reports errors to its parent via a pipe, retrying infinitely on any write error to prevent falsely reporting success. If the (original) parent dies before write is attempted, there is nobody to report to, but the child will remain stuck in the write loop forever if SIGPIPE is blocked or ignored. Fix this by not retrying write if it fails with EPIPE.
* loongarch64 __clone: align stack pointer mod 16wanghongliang2024-02-261-0/+1
| | | | | According to LoongArch ABI Specs, stack need to be 16 align to improve performance and compiler layout of stack frames.
* riscv: fall back to syscall __riscv_flush_icacheStefan O'Rear2024-02-251-0/+1
| | | | | Matches glibc behavior and fixes a case where we could fall off the function without returning a value.
* sh dlsym: fix passing of return address for RTLD_NEXT useRich Felker2024-02-251-1/+1
| | | | | | | this code dates back to the original commit of the sh port, with no real clue as to how the bug was introduced. it looks like it was written to assume the return address was pushed to the stack like on x86, rather than arriving in the pr special register.
* add statx interface using syscall, fallback to fstatatDuncan Bellamy2024-02-241-0/+42
|
* use new SYS_fchmodat2 syscall to implement fchmodat with flagsGaël PORTAY2024-02-221-1/+4
| | | | | | | | | | | commit 0dc4824479e357a3e23a02d35527e23fca920343 worked around for lack of flags argument in syscall for fchmodat. linux 6.6 introduced a new syscall, SYS_fchmodat2, fixing this deficiency. use it if any flags are passed, and fallback to the old strategy on ENOSYS. continue using the old syscall when there are no flags. this is the exact same strategy used when SYS_faccessat2 was used to implement faccessat with flags.
* remove flag argument from fchmodat syscallGaël PORTAY2024-02-221-1/+1
| | | | linux's does not have the flag argument for fchmodat syscall.
* add framework to support archs without a native wait4 syscallRich Felker2024-02-226-4/+71
| | | | | | | | | | this commit should make no codegen change for existing archs, but is a prerequisite for new archs including riscv32. the wait4 emulation backend provides both cancellable and non-cancellable variants because waitpid is required to be a cancellation point, but all of our other uses are not, and most of them cannot be. based on patch by Stefan O'Rear.
* sh: fix sigsetjmp corrupting call-saved register r8Rich Felker2024-02-171-1/+1
| | | | | due to incorrect base address register when attempting to reload the saved value of r8, the caller's value of r8 was not preserved.
* add loongarch64 portHongliang Wang2024-02-1610-0/+257
| | | | | | | | | | | | | Author: Xiaojuan Zhai <zhaixiaojuan@loongson.cn> Author: Meidan Li <limeidan@loongson.cn> Author: Guoqi Chen <chenguoqi@loongson.cn> Author: Xiaolin Zhao <zhaoxiaolin@loongson.cn> Author: Fan peng <fanpeng@loongson.cn> Author: Jiantao Shan <shanjiantao@loongson.cn> Author: Xuhui Qiang <qiangxuhui@loongson.cn> Author: Jingyun Hua <huajingyun@loongson.cn> Author: Liu xue <liuxue@loongson.cn> Author: Hongliang Wang <wanghongliang@loongson.cn>
* strftime: fix breakage in last change (uninitialized pointer access)Rich Felker2024-02-161-1/+6
| | | | | | | | | | commit f47a5d400b8ffa26cfc5b345dbff52fec94ac7f3 overlooked that strtoul was responsible for setting p to a const-laundered copy of the format string pointer f, even in the case where there was no number to parse. by making the call conditional on isdigit, that copy was lost. the logic here is a mess and should be cleaned up, but for now, this seems to be the least invasive change that undoes the breakage.
* syslog: use C locale for timestamp generationRich Felker2024-02-071-1/+2
| | | | | | | | | | | | | depending on contents of the LC_TIME locale, log messages could be malformatted (especially if the ABMON strings contain non-alphabetic characters) or the subsequent code could invoke undefined behavior, via passing a timebuf[] with unspecified contents to snprintf, if the translated ABMON string did not fit in the 16-byte timebuf. this does not appear to be a security-relevant bug, as locale loading functionality is intentionally not available to set*id programs -- the MUSL_LOCPATH environment variable is ignored when libc.secure is true, and custom locales are not loadable without it.
* riscv: add TLSDESC supportRich Felker2024-02-031-0/+32
|
* sqrtl: fix invalid use of a non-constant-expression as static initializerRich Felker2024-02-031-2/+2
| | | | | | | | | having these constants be static was unnecessary, so just remove the static. this error should have been caught by compilers, but recent versions of both gcc and clang accept these as "other forms of constant expressions" which the C standard allows.
* riscv: correct symbol version of __vdso_flush_icachegns2024-02-031-1/+1
| | | | | | | | Previously, __riscv_flush_icache would not work correctly as __vdso_flush_icache had a wrong symbol version. Fix this by correcting symbol version. Fixes: 0a48860c27a8 ("add riscv64 architecture support")
* add preadv2 and pwritev2 syscall wrappers, flag value macrosRich Felker2024-01-252-0/+34
|
* expose ppoll in default feature profileRich Felker2024-01-211-1/+1
| | | | | | | the ppoll function has been accepted as a future part of the standard as the outcome of Austin Group tracker issue 1263. at some point it should be exposed unconditionally, but for now, expose it in the default feature profile.