]> Zhao Yanbai Git Server - minix.git/commitdiff
libsffs, libvtreefs: fix getdents bug 40/2940/1
authorDavid van Moolenbroek <david@minix3.org>
Sun, 1 Feb 2015 15:29:13 +0000 (15:29 +0000)
committerDavid van Moolenbroek <david@minix3.org>
Tue, 10 Feb 2015 13:47:29 +0000 (13:47 +0000)
Bad logic introduced as part of the fsdriver changes could cause
getdents to terminate early in these libraries.

Issue reported by r0ller.

Change-Id: If450d5ea85e830584878d8a4ec0f00519355a353

minix/lib/libsffs/read.c
minix/lib/libvtreefs/file.c

index 58586102b12acd8898e9487a9c295d2a5f198542..bb922f9a12f0333bc6c0f1df046df17032d34ff8 100644 (file)
@@ -98,7 +98,7 @@ ssize_t do_getdents(ino_t ino_nr, struct fsdriver_data *data, size_t bytes,
    * the "." entry, the second position is for the ".." entry, and the next
    * position numbers each represent a file in the directory.
    */
-  do {
+  for (;;) {
        /* Determine which inode and name to use for this entry.
         * We have no idea whether the host will give us "." and/or "..",
         * so generate our own and skip those from the host.
@@ -165,7 +165,9 @@ ssize_t do_getdents(ino_t ino_nr, struct fsdriver_data *data, size_t bytes,
 
        if (r < 0)
                return r;
-  } while (r > 0);
+       if (r == 0)
+               break;
+  }
 
   return fsdriver_dentry_finish(&fsdentry);
 }
index 3d3b2c9feb9d2d1213087504d3a782073d7eddb6..2542ebc8ef5acc826071b9b60f9a5444666dce95 100644 (file)
@@ -223,7 +223,7 @@ fs_getdents(ino_t ino_nr, struct fsdriver_data * data, size_t bytes,
 
        fsdriver_dentry_init(&fsdentry, data, bytes, buf, bufsize);
 
-       do {
+       for (;;) {
                /* Determine which inode and name to use for this entry. */
                pos = (*posp)++;
 
@@ -287,7 +287,9 @@ fs_getdents(ino_t ino_nr, struct fsdriver_data * data, size_t bytes,
                    IFTODT(child->i_stat.mode));
                if (r < 0)
                        return r;
-       } while (r > 0);
+               if (r == 0)
+                       break;
+       }
 
        return fsdriver_dentry_finish(&fsdentry);
 }