Properly calculate the last used logical block of a file when checking

inodes that reference directories. While here tighten the check for
comparing the last logical block with the end of the file.

Reported by:  Peter Holm
Tested by:    Peter Holm
Sponsored by: Netflix
This commit is contained in:
mckusick 2019-03-02 21:30:01 +00:00
parent 778bf100cf
commit 40fbe3a922
2 changed files with 3 additions and 3 deletions

View File

@ -127,9 +127,9 @@ ckinode(union dinode *dp, struct inodesc *idesc)
ret = iblock(idesc, i + 1, remsize, BT_LEVEL1 + i); ret = iblock(idesc, i + 1, remsize, BT_LEVEL1 + i);
if (ret & STOP) if (ret & STOP)
return (ret); return (ret);
} else { } else if (remsize > 0) {
idesc->id_lbn += sizepb / sblock.fs_bsize; idesc->id_lbn += sizepb / sblock.fs_bsize;
if (idesc->id_type == DATA && remsize > 0) { if (idesc->id_type == DATA) {
/* An empty block in a directory XXX */ /* An empty block in a directory XXX */
getpathname(pathbuf, idesc->id_number, getpathname(pathbuf, idesc->id_number,
idesc->id_number); idesc->id_number);

View File

@ -439,7 +439,7 @@ checkinode(ino_t inumber, struct inodesc *idesc, int rebuildcg)
* at its end. * at its end.
*/ */
if (DIP(dp, di_size) > UFS_NDADDR * sblock.fs_bsize && if (DIP(dp, di_size) > UFS_NDADDR * sblock.fs_bsize &&
idesc->id_lballoc != lblkno(&sblock, DIP(dp, di_size) - 1)) { idesc->id_lballoc < lblkno(&sblock, DIP(dp, di_size) - 1)) {
fixsize = lblktosize(&sblock, idesc->id_lballoc + 1); fixsize = lblktosize(&sblock, idesc->id_lballoc + 1);
pwarn("INODE %lu: FILE SIZE %ju BEYOND END OF ALLOCATED FILE, " pwarn("INODE %lu: FILE SIZE %ju BEYOND END OF ALLOCATED FILE, "
"SIZE SHOULD BE %ju", (u_long)inumber, "SIZE SHOULD BE %ju", (u_long)inumber,