fix: make getcwd report truncated buffers as ERANGE
This commit is contained in:
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
// ====================================================================
|
// ====================================================================
|
||||||
|
|||||||
@@ -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.
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user