about summary refs log tree commit diff
Commit message (Collapse)AuthorAgeFilesLines
* update contributor name in authorship noticesRich Felker2024-10-102-3/+3
|
* fix compile regression in exit on archs without SYS_pauseRich Felker2024-10-101-1/+1
| | | | | | | | commit 8cca79a72cccbdb54726125d690d7d0095fc2409 added use of SYS_pause to exit() without accounting for newer archs omitting the syscall. use the newly-added __sys_pause abstraction instead, which uses SYS_ppoll when SYS_pause is missing.
* abstract missing SYS_pause syscall with macrosRich Felker2024-10-102-5/+12
| | | | | | | newer archs lack the syscall. the pause() function accounted for this with its own #ifdef, but that didn't allow use of the syscall directly elsewhere, so move the logic to macros in src/internal/syscall.h where it can be shared.
* statx: add new struct statx fields and corresponding mask macrosRich Felker2024-09-131-1/+8
|
* statx: fix uninitialized attributes/mask in fallback pathRich Felker2024-09-131-1/+1
| | | | | | | | | | | | | | | commit b817541f1cfd38e4b81257b3215e276ea9d0fc61 introduced statx with a fallback using fstatat, but failed to fill in stx_rdev_major/minor and stx_attributes[_mask]. the rdev omission has been addressed separately. rather than explicitly zeroing the attributes and their mask, pre-fill the entire structure with zeros. this will also cover the padding adjacent to stx_mode, in case it's ever used in the future. explicit zeroing of stx_btime is removed since, with this change, it will already be pre-zeroed. as an aside, zeroing it was not strictly necessary, since STATX_BASIC_STATS does not include STATX_BTIME and thus does not indicate any validity for it.
* statx: fix ENOSYS emulation not setting stx_rdev_*Gabriel Ravier2024-09-131-0/+2
| | | | | | | The current implementation of the statx function fails to set the values of stx->stx_rdev_major and stx->stx_rdev_minor if the statx syscall fails with ENOSYS and thus the statx function has to fall back on fstatat-based emulation.
* sysconf: fix _SC_MINSIGSTKSZ computation to match kernel interpretationRich Felker2024-08-311-2/+7
| | | | | | | | | the value placed in the aux vector AT_MINSIGSTKSZ by the kernel is purely the signal frame size, and does not include any execution space for the signal handler. this is contrary to the POSIX definition of MINSIGSTKSZ to be a value that can actually execute at least some minimal signal handler, and contrary to the historical definitions of MINSIGSTKSZ which had at least 1k of headroom.
* sigaltstack: enforce dynamic MINSIGSTKSZ limitRich Felker2024-08-311-1/+3
| | | | | | | | commit 996b6154b20184c3b08cce28eb01edb7f47e9413 added support for querying the dynamic limit but did not enforce it in sigaltstack. the kernel also does not seem to reliably enforce it, or at least does not necessarily enforce the same limit exposed to userspace, so it needs to be enforced here.
* printf: drastically reduce stack usage without [long] double argsRich Felker2024-08-261-4/+8
| | | | | | | | | | | | | | | | internally, printf always works with the maximal-size supported integer and floating point formats. however, the space needed to format a floating point number is proportional to the mantissa and exponent ranges. on archs where long double is larger than double, knowing that the actual value fit in double allows us to use a much smaller buffer, roughly 1/16 the size. as a bonus, making the working buffer a VLA whose dimension depends on the format specifier prevents the compiler from lifting the stack adjustment to the top of printf_core. this makes it so printf calls without floating point arguments do not waste even the smaller amount of stack space needed for double, making it much more practical to use printf in tightly stack-constrained environments.
* isatty: don't collapse all non-EBADF errors to ENOTTYRich Felker2024-08-201-4/+2
| | | | | | | | | | | | | | | linux puts hung-up ttys in a state where ioctls produce EIO, and may do the same for other types of devices in error or shutdown states. such an error clearly does not mean the device is not a tty, but it also can't reliably establish that the device is a tty, so the only safe thing to do seems to be reporting the error. programs that don't check errno will conclude that the device is not a tty, which is no different from what happens now, but at least they gain the option to differentiate between the cases. commit c84971995b3a6d5118f9357c040572f4c78bcd55 introduced the errno collapsing behavior, but prior to that, errno was not set at all by isatty.
* printf core: replace if(0) blocks around switch cases with explicit gotosRich Felker2024-08-181-3/+3
| | | | | | | | | | | | | | this is purely a readability change, not a functional one. all of the integer format cases use a common tail for handling precision logic after the string representation of the number has been generated. the code as I originally wrote it was overly clever in the aim of making a point that the flow could be done without goto, and jumped over intervening cases by wrapping them in if (0) { }, with the case labels for each inside the conditional block scope. this has been a perpetual source of complaints about the readability and comprehensibility of the file, so I am now changing it to explicitly jump to the tail logic with goto statements.
* iconv: add cp858Rich Felker2024-08-181-0/+11
| | | | | | this is the same as cp850, but with the euro symbol replacing the lowercase dotless i at 0xd5. it is significant because it's used by thermal receipt printers.
* 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.
* use hidden visibility for C entry point function _start_cRich Felker2024-08-101-1/+1
| | | | | | | | | | | | | | | | | the file-level crt_arch.h asm fragments generally make direct (non-PLT) calls from _start to _start_c, which is only valid when there is a local, non-interposable definition for _start_c. generally, the linker is expected to know that local definitions in a main executable (as opposed to shared library) output are non-interposable, making this work, but historically there have been linker bugs in this area, and microblaze is reportedly still broken, flagging the relocation for the call as a textrel. the equivalent _dlstart_c, called from the same crt_arch.h asm fragments, has always used hidden visibility without problem, and semantically it should be hidden, so make it hidden. this ensures the direct call is always valid regardless of whether the linker properly special-cases main executable output.
* 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.
* m68k: fix POLLWRNORM and POLLWRBANDBaruch Siach2024-08-091-0/+2
| | | | | As noted in commit f5011c62c3 ("fix POLLWRNORM and POLLWRBAND on mips") m68k uses a different definition.
* fix missing make dependency for Scrt1.o due to typoRich Felker2024-08-091-1/+1
| | | | | commit 2f853dd6b9a95d5b13ee8f9df762125e0588df5d inadvertently changed Scrt1.o to scrt1.o in the Makefile rule for dependency on crt_arch.h.
* 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-052-3/+3
| | | | | | | | | | | | | | | | | | | | | 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.
* dynlink: avoid copying to temp buffer in get_lfs64Rich Felker2024-06-221-9/+4
| | | | | | | | while commit 53ac44ff4c0e91536e1e34e8e59e19d2a1196a67 fixed the temp buffer being undersized, the use of a temp buffer to begin with was a mistake. instead, compare the requested symbol name in-place and use the already-null-terminated copy of the name without "64" present in lfs64_list[] to look up the real symbol.
* sys/epoll.h: add epoll ioctlsJoe Damato2024-06-221-0/+12
| | | | | | | | add two ioctls to get and set struct epoll_params to allow users to control epoll based busy polling of network sockets. added to uapi in commit 18e2bf0edf4dd88d9656ec92395aa47392e85b61 (Linux kernel 6.9 and newer).
* 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.
* dynlink: fix get_lfs64() with posix_fallocate64Florian Ziesche2024-06-201-1/+1
| | | | "posix_fallocate64" is 17 characters long, so 16 is one too short.
* syslog: fix incorrect LOG_MAKEPRI and LOG_FAC[MASK] macrosRich Felker2024-06-132-4/+4
| | | | | | | | 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-232-0/+18
| | | | | | | | | 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.
* aarch64 crti.o: fix alignment of _init/_finimojyack2024-05-121-0/+2
| | | | | | without explicit alignment directives, whether they end up at the necessary alignment depends on linker/linking conditions. initially reported as mold issue 1255.
* fix typo that broke sys/reg.h and sys/user.hGonzalo Alvarez2024-05-112-2/+2
| | | | | commit 7019fbe103165b9b26a9391d5ecd4c7fcb6f3ec9 and commit e709a6f07ade208ba513f9225222336f30c304b0 misspelled bits/alltypes.h.
* implement posix_getdents adopted for next issue of POSIXRich Felker2024-05-082-3/+26
| | | | | | 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.
* stdint.h: derive limits from __LONG_MAX, use common fast16 typesRich Felker2024-05-0718-340/+9
| | | | | | the bits file is retained, but as a single generic version, to allow for the unlikely future possibility of letting a new arch define something differently.
* sys/user.h: derive __WORDSIZE from __LONG_MAXRich Felker2024-05-075-12/+9
| | | | | | previously, only a few archs defined it here. this change makes the presence consistent across all archs, and reduces the amount of header duplication (and potential for future inconsistency) between archs.
* sys/reg.h: derive __WORDSIZE from __LONG_MAXRich Felker2024-05-0719-42/+9
| | | | | this removes an otherwise-unnecessary bits header from most archs, replacing it with an empty generic version.
* unistd.h: derive ILP32/LP64 macros from __LONG_MAX instead of arch bitsRich Felker2024-05-0719-37/+7
|
* unify bits/stat.h for all archs sharing a common definitionRich Felker2024-05-074-54/+0
| | | | | future archs should not define their own bits/stat.h but use this generic one.
* align aarch64, riscv64, loongarch64 stat structure padding typeRich Felker2024-05-073-3/+3
| | | | | | | this change is purely to document that they are the same in preparation to remove the arch-specific headers for these archs and replace them with a generic version that matches riscv32 and can be shared by these and all future archs.
* ldso: fix non-functional fix to early dynamic PAGE_SIZE accessRich Felker2024-05-071-3/+5
| | | | | | | | | | | | | commit f47a8cdd250d9163fcfb39bf4e9d813957c0b187 introduced an alternate mechanism for access to runtime page size for compatibility with early stages of dynamic linking, but because pthread_impl.h indirectly includes libc.h, the condition #ifndef PAGE_SIZE was never satisfied. rather than depend on order of inclusion, use the (baseline POSIX) macro PAGESIZE, not the (XSI) macro PAGE_SIZE, to determine whether page size is dynamic. our internal libc.h only provides a dynamic definition for PAGE_SIZE, not for PAGESIZE.
* 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.
* riscv mcontext_t/sigcontext: use __aligned__ instead of alignedMichael Forney2024-05-062-2/+2
| | | | | aligned may be defined by the application for its own use before bits/signal.h is included.
* add missing STATX_ATTR_* macros omitted when statx was addedRich Felker2024-04-241-0/+10
| | | | | commit b817541f1cfd38e4b81257b3215e276ea9d0fc61 added statx and the mask constant macros, but not the stx_attributes[_mask] ones.
* 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.