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:
parent
778bf100cf
commit
40fbe3a922
@ -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);
|
||||||
|
@ -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,
|
||||||
|
Loading…
Reference in New Issue
Block a user