fixed traversal over freed spaces
authorewt <devnull@localhost>
Sat, 6 Jan 1996 00:06:52 +0000 (00:06 +0000)
committerewt <devnull@localhost>
Sat, 6 Jan 1996 00:06:52 +0000 (00:06 +0000)
CVS patchset: 146
CVS date: 1996/01/06 00:06:52

lib/falloc.c

index 119641e..ca6134b 100644 (file)
@@ -233,28 +233,31 @@ unsigned int faFirstOffset(faFile fa) {
 unsigned int faNextOffset(faFile fa, unsigned int lastOffset) {
     struct faBlock block;
     int offset;
-    int useBlock;
 
     if (lastOffset) {
        offset = lastOffset - sizeof(block);
-       useBlock = 0;
     } else {
        offset = sizeof(struct faFileHeader);
-       useBlock = 1;
     }
 
-    block.isFree = 1;
-    while (offset < fa->fileSize && block.isFree) {
+    if (offset >= fa->fileSize) return 0;
+
+    lseek(fa->fd, offset, SEEK_SET);
+    if (read(fa->fd, &block, sizeof(block)) != sizeof(block)) {
+       return 0;
+    }
+    if (!lastOffset && !block.isFree) return (offset + sizeof(block));
+
+    do {
+       offset += sizeof(block) + block.size;
+
        lseek(fa->fd, offset, SEEK_SET);
        if (read(fa->fd, &block, sizeof(block)) != sizeof(block)) {
            return 0;
        }
 
-       if (useBlock && !block.isFree) break;
-       useBlock = 1;
-
-       offset += sizeof(block) + block.size;
-    }
+       if (!block.isFree) break;
+    } while (offset < fa->fileSize && block.isFree);
 
     if (offset < fa->fileSize)
        return (offset + sizeof(block));