summaryrefslogtreecommitdiff
AgeCommit message (Collapse)AuthorLines
2024-08-09fix missing make dependency for Scrt1.o due to typoRich Felker-1/+1
commit 2f853dd6b9a95d5b13ee8f9df762125e0588df5d inadvertently changed Scrt1.o to scrt1.o in the Makefile rule for dependency on crt_arch.h.
2024-07-24timer_create: replace pthread barrier with semaphores for thread startRich Felker-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.
2024-07-24atexit: fail rather than deadlocking after last handler is calledRich Felker-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.
2024-07-23exit: add back lock to make concurrent calls to exit safeRich Felker-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.
2024-07-23move __utc string object to its own translation unitRich Felker-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.
2024-07-05syslog: revert LOG_FAC/LOG_FACMASK changesRich Felker-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.
2024-06-23siglongjmp: document why this function just calls longjmpRich Felker-0/+5
2024-06-22inet_ntop: fix the IPv6 leading zero sequence compressionJakub Stasiak-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.
2024-06-22dynlink: avoid copying to temp buffer in get_lfs64Rich Felker-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.
2024-06-22sys/epoll.h: add epoll ioctlsJoe Damato-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).
2024-06-21getusershell: skip blank lines and commentsRich Felker-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.
2024-06-20dynlink: fix get_lfs64() with posix_fallocate64Florian Ziesche-1/+1
"posix_fallocate64" is 17 characters long, so 16 is one too short.
2024-06-13syslog: fix incorrect LOG_MAKEPRI and LOG_FAC[MASK] macrosRich Felker-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.
2024-05-23add renameat2 linux syscall wrapperTony Ambardar-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.
2024-05-12fix mismatched type in posix_getdents definitionRich Felker-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.
2024-05-12aarch64 crti.o: fix alignment of _init/_finimojyack-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.
2024-05-11fix typo that broke sys/reg.h and sys/user.hGonzalo Alvarez-2/+2
commit 7019fbe103165b9b26a9391d5ecd4c7fcb6f3ec9 and commit e709a6f07ade208ba513f9225222336f30c304b0 misspelled bits/alltypes.h.
2024-05-08implement posix_getdents adopted for next issue of POSIXRich Felker-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.
2024-05-07stdint.h: derive limits from __LONG_MAX, use common fast16 typesRich Felker-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.
2024-05-07sys/user.h: derive __WORDSIZE from __LONG_MAXRich Felker-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.
2024-05-07sys/reg.h: derive __WORDSIZE from __LONG_MAXRich Felker-42/+9
this removes an otherwise-unnecessary bits header from most archs, replacing it with an empty generic version.
2024-05-07unistd.h: derive ILP32/LP64 macros from __LONG_MAX instead of arch bitsRich Felker-37/+7
2024-05-07unify bits/stat.h for all archs sharing a common definitionRich Felker-54/+0
future archs should not define their own bits/stat.h but use this generic one.
2024-05-07align aarch64, riscv64, loongarch64 stat structure padding typeRich Felker-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.
2024-05-07ldso: fix non-functional fix to early dynamic PAGE_SIZE accessRich Felker-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.
2024-05-06strptime: implement conversion specifiers adopted for next POSIX issueRich Felker-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.
2024-05-06printf decimal integer formatting: shave off one divisionRich Felker-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.
2024-05-06riscv mcontext_t/sigcontext: use __aligned__ instead of alignedMichael Forney-2/+2
aligned may be defined by the application for its own use before bits/signal.h is included.
2024-04-24add missing STATX_ATTR_* macros omitted when statx was addedRich Felker-0/+10
commit b817541f1cfd38e4b81257b3215e276ea9d0fc61 added statx and the mask constant macros, but not the stx_attributes[_mask] ones.
2024-04-13initgroups: do not artificially limit number of supplementary groupsRich Felker-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.
2024-04-12printf: fix edge case where hex float precision was not honoredRich Felker-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.
2024-03-14complex: fix comment in cacoshSzabolcs Nagy-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.
2024-03-14math: fix fma(x,y,0) when x*y rounds to -0Szabolcs Nagy-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.
2024-03-14fix pwrite/pwritev handling of O_APPEND filesRich Felker-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.
2024-03-13uio.h: add RWF_NOAPPEND flag for pwritev2Rich Felker-0/+1
added in linux kernel commit 73fa7547c70b32cc69685f79be31135797734eb6. this is added now as a prerequisite for fixing pwrite/pwritev behavior for O_APPEND files.
2024-03-02iconv: fix missing bounds checking for shift_jis decodingRich Felker-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.
2024-03-02add missing inline keyword on default a_barrier definitionRich Felker-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).
2024-03-01iconv: add aliases for GBKRich Felker-1/+1
these are taken from the IANA registry, restricted to those that match the forms already used for other supported character encodings.
2024-03-01iconv: add euro symbol to GBK as single byte 0x80Rich Felker-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.
2024-02-29release 1.2.5v1.2.5Rich Felker-1/+43
2024-02-29iconv: add cp932 as an alias for shift_jisRich Felker-1/+1
2024-02-29update INSTALL file archs list with riscv32, loongarch64 additionsRich Felker-1/+6
2024-02-29loongarch64: add new syscall numberswanghongliang-0/+15
2024-02-29loongarch64: remove getrlimit/setrlimit syscall numbersRich Felker-2/+0
these are not supported by the kernel for new archs; prlimit64 replaces them.
2024-02-29loongarch64: remove ptrace.h macroswanghongliang-4/+0
2024-02-29configure: enable riscv32 portStefan O'Rear-1/+2
2024-02-29riscv: define REG_S1 and REG_S2Khem Raj-0/+4
These are used by applications to access members of mcontext, and are also defined by other libcs on linux.
2024-02-29riscv32: add new syscall numbersKhem Raj-1/+15
- add mount_setattr from linux v5.12 - add epoll_pwait2 from linux v5.11 - add process_madvise from linux v5.10 - add __NR_faccessat2 from linux v5.8 - add pidfd_getfd and openat2 syscall numbers from linux v5.6 - add clone3 syscall number from linux v5.3 - add process_mrelease from linux v5.15 - add futex_waitv from linux v5.16 - add set_mempolicy_home_node from linux v5.17 - add cachestat from linux v6.4 - add __NR_fchmodat2 from linux v6.6
2024-02-29riscv32: add sysvipc msg/sem/shm bitsRich Felker-0/+68
despite riscv32 being natively time64, the IPC_TIME64 bit (0x100) is set in IPC_STAT and derived command macros, differentiating their values from the raw command values used to interface with the kernel. this reflects that the kernel ipc structure types are not natively time64, but have broken-down hi/lo fields that cannot be used in-place and require translation, and that the userspace struct types differ from the kernel types (relevant to things like strace).
2024-02-29riscv32: add thread supportStefan O'Rear-0/+76
Identical to riscv64 except for stack offsets in clone.