]> git.proxmox.com Git - wasi-libc.git/commitdiff
Fix logic errors in the zero-inode path. (#352)
authorDan Gohman <dev@sunfishcode.online>
Tue, 6 Dec 2022 17:16:45 +0000 (09:16 -0800)
committerGitHub <noreply@github.com>
Tue, 6 Dec 2022 17:16:45 +0000 (09:16 -0800)
I've now tested the zero-inode path on a Wasm engine specially-modified
to have `fd_readdir` set inode numbers to zero. Fix two bugs this turned up:
 - Increment `buffer_processed`, as noticed by @yamt
 - Don't do an `fstatat` on "..", because that references a path outside
   of the directory, which gets a permission-denied error.

libc-bottom-half/cloudlibc/src/libc/dirent/readdir.c

index 951587417947e610601d215e77ba49d52b84d066..bfd19213c6abae67dad9211f5d040f38063b72bb 100644 (file)
@@ -89,11 +89,12 @@ struct dirent *readdir(DIR *dirp) {
     // inode number.
     off_t d_ino = entry.d_ino;
     unsigned char d_type = entry.d_type;
-    if (d_ino == 0) {
+    if (d_ino == 0 && strcmp(dirent->d_name, "..") != 0) {
       struct stat statbuf;
       if (fstatat(dirp->fd, dirent->d_name, &statbuf, AT_SYMLINK_NOFOLLOW) != 0) {
        if (errno == ENOENT) {
          // The file disappeared before we could read it, so skip it.
+         dirp->buffer_processed += entry_size;
          continue;
        }
         return NULL;