Fix handling of paths with dirfd on Windows

This change fixes an issue with all system calls ending with *at(), when
the caller passes `dirfd != AT_FDCWD` and an absolute path. It's because
the old code was turning paths like C:\bin\ls into \\C:\bin\ls\C:\bin\ls
after being converted from paths like /C/bin/ls. I noticed this when the
Emacs dired mode stopped working. It's unclear if it's a regression with
Cosmopolitan Libc or if this was introduced by the Emacs v29 upgrade. It
also impacted posix_spawn() for which a newly minted example now exists.
This commit is contained in:
Justine Tunney 2024-09-01 16:35:48 -07:00
parent a089c07ddc
commit 39e7f24947
No known key found for this signature in database
GPG key ID: BE714B4575D6E328
10 changed files with 373 additions and 46 deletions

View file

@ -25,6 +25,8 @@
*
* @param attr was initialized by posix_spawnattr_init()
* @param flags may have any of the following
* - `POSIX_SPAWN_USEFORK`
* - `POSIX_SPAWN_USEVFORK`
* - `POSIX_SPAWN_RESETIDS`
* - `POSIX_SPAWN_SETPGROUP`
* - `POSIX_SPAWN_SETSIGDEF`
@ -32,12 +34,13 @@
* - `POSIX_SPAWN_SETSCHEDPARAM`
* - `POSIX_SPAWN_SETSCHEDULER`
* - `POSIX_SPAWN_SETSID`
* - `POSIX_SPAWN_SETRLIMIT`
* - `POSIX_SPAWN_SETRLIMIT_NP`
* @return 0 on success, or errno on error
* @raise EINVAL if `flags` has invalid bits
*/
int posix_spawnattr_setflags(posix_spawnattr_t *attr, short flags) {
if (flags & ~(POSIX_SPAWN_USEVFORK | //
if (flags & ~(POSIX_SPAWN_USEFORK | //
POSIX_SPAWN_USEVFORK | //
POSIX_SPAWN_RESETIDS | //
POSIX_SPAWN_SETPGROUP | //
POSIX_SPAWN_SETSIGDEF | //
@ -45,7 +48,7 @@ int posix_spawnattr_setflags(posix_spawnattr_t *attr, short flags) {
POSIX_SPAWN_SETSCHEDPARAM | //
POSIX_SPAWN_SETSCHEDULER | //
POSIX_SPAWN_SETSID | //
POSIX_SPAWN_SETRLIMIT)) {
POSIX_SPAWN_SETRLIMIT_NP)) {
return EINVAL;
}
(*attr)->flags = flags;