fix: make getcwd report truncated buffers as ERANGE

This commit is contained in:
2026-08-09 12:16:57 +02:00
parent 1c498ffa6a
commit 0b7fd37694
4 changed files with 15 additions and 7 deletions
+9 -4
View File
@@ -165,10 +165,15 @@ namespace montauk::abi {
if (proc == nullptr || buf == nullptr || maxLen == 0) return -1; if (proc == nullptr || buf == nullptr || maxLen == 0) return -1;
const char* cwd = proc->cwd[0] ? proc->cwd : "0:/"; const char* cwd = proc->cwd[0] ? proc->cwd : "0:/";
int i = 0; uint64_t cwdLen = 0;
for (; i < (int)maxLen - 1 && cwd[i]; i++) buf[i] = cwd[i]; while (cwd[cwdLen] != '\0') cwdLen++;
buf[i] = '\0';
return i; // Reserve -1 for non-size failures so libc can distinguish them
// from a buffer that can be retried with a larger allocation.
if (maxLen <= cwdLen) return -2;
for (uint64_t i = 0; i <= cwdLen; i++) buf[i] = cwd[i];
return (int)cwdLen;
} }
// ==================================================================== // ====================================================================
+3 -2
View File
@@ -2286,8 +2286,9 @@ char *getcwd(char *buf, size_t size) {
errno = EINVAL; errno = EINVAL;
return NULL; return NULL;
} }
if ((int)_zos_syscall2(SYS_GETCWD, (long)buf, (long)size) < 0) { int result = (int)_zos_syscall2(SYS_GETCWD, (long)buf, (long)size);
errno = ERANGE; if (result < 0) {
errno = result == -2 ? ERANGE : EIO;
return NULL; return NULL;
} }
return buf; return buf;
Binary file not shown.
+3 -1
View File
@@ -64,7 +64,9 @@
int montauk::chdir(const char* path); int montauk::chdir(const char* path);
.B SYS_GETCWD (95) .B SYS_GETCWD (95)
Get the calling process's current working directory. Get the calling process's current working directory. Returns the path
length on success, -2 if maxLen cannot hold the path and terminating NUL,
or -1 for another failure. The buffer is not modified when it is too small.
int montauk::getcwd(char* buf, uint64_t maxLen); int montauk::getcwd(char* buf, uint64_t maxLen);
.B SYS_SETUSER (92) .B SYS_SETUSER (92)