From: ewt Date: Sat, 6 Jan 1996 00:06:52 +0000 (+0000) Subject: fixed traversal over freed spaces X-Git-Tag: rpm-4.4-release~5589 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=e808a695a82ed94c6a3a4a20a23abfd6fc14a8e7;p=platform%2Fupstream%2Frpm.git fixed traversal over freed spaces CVS patchset: 146 CVS date: 1996/01/06 00:06:52 --- 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));