From e808a695a82ed94c6a3a4a20a23abfd6fc14a8e7 Mon Sep 17 00:00:00 2001 From: ewt Date: Sat, 6 Jan 1996 00:06:52 +0000 Subject: [PATCH] fixed traversal over freed spaces CVS patchset: 146 CVS date: 1996/01/06 00:06:52 --- lib/falloc.c | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/lib/falloc.c b/lib/falloc.c index 119641e..ca6134b 100644 --- a/lib/falloc.c +++ b/lib/falloc.c @@ -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)); -- 2.7.4