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:
Kirk McKusick 2019-03-02 21:30:01 +00:00
parent 886e9f061c
commit 72ef1cb896
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);
if (ret & STOP)
return (ret);
} else {
} else if (remsize > 0) {
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 */
getpathname(pathbuf, idesc->id_number,
idesc->id_number);

View File

@ -439,7 +439,7 @@ checkinode(ino_t inumber, struct inodesc *idesc, int rebuildcg)
* at its end.
*/
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);
pwarn("INODE %lu: FILE SIZE %ju BEYOND END OF ALLOCATED FILE, "
"SIZE SHOULD BE %ju", (u_long)inumber,