diff options
| author | Christian Walther <cwalther@gmx.ch> | 2023-07-30 14:48:22 +0200 |
|---|---|---|
| committer | Christian Walther <cwalther@gmx.ch> | 2023-10-19 16:21:09 +0200 |
| commit | be28829ae8d22e1a0373bda116022ee446fb2ed8 (patch) | |
| tree | 096b53d36c4d123e937cf8c6a9779ffd8a905aac /extmod/vfs_posix.c | |
| parent | 0c4fb1687193a6c6f5edbb9404ecb7e5d6f3bec3 (diff) | |
extmod/vfs_posix: Fix getcwd() on non-root VFS.
The unwritten API contract expected of a VFS.getcwd() by mp_vfs_getcwd()
is that its return value should be either "" or "/" when the CWD is at
the root of the VFS and otherwise start with a slash and not end with a
slash. This was not correctly implemented in VfsPosix for instances with
a non-empty root - the required leading slash, if any, was cut off
because the root length includes a trailing slash. This would result in
missing slashes in the middle of the return value of os.getcwd() or in
uninitialized garbage from beyond a string's null terminator when the
CWD was at the VFS root.
Signed-off-by: Christian Walther <cwalther@gmx.ch>
Diffstat (limited to 'extmod/vfs_posix.c')
| -rw-r--r-- | extmod/vfs_posix.c | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/extmod/vfs_posix.c b/extmod/vfs_posix.c index 6df91a273..e29b47ccc 100644 --- a/extmod/vfs_posix.c +++ b/extmod/vfs_posix.c @@ -186,7 +186,14 @@ STATIC mp_obj_t vfs_posix_getcwd(mp_obj_t self_in) { if (ret == NULL) { mp_raise_OSError(errno); } - ret += self->root_len; + if (self->root_len > 0) { + ret += self->root_len - 1; + #ifdef _WIN32 + if (*ret == '\\') { + *(char *)ret = '/'; + } + #endif + } return mp_obj_new_str(ret, strlen(ret)); } STATIC MP_DEFINE_CONST_FUN_OBJ_1(vfs_posix_getcwd_obj, vfs_posix_getcwd); |
