mirror of https://github.com/vitalif/e2fsprogs
libext2fs: zero block contents past EOF when setting size
When we set the file size, find the block containing EOF, and zero everything in that block past EOF so that we can't return stale data if we ever use fallocate or truncate to lengthen the file. Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com> Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>debian-1.42.9
parent
4b58df1a53
commit
299cc61755
|
@ -393,6 +393,52 @@ ext2_off_t ext2fs_file_get_size(ext2_file_t file)
|
||||||
return size;
|
return size;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Zero the parts of the last block that are past EOF. */
|
||||||
|
errcode_t ext2fs_file_zero_past_offset(ext2_file_t file, ext2_off64_t offset)
|
||||||
|
{
|
||||||
|
ext2_filsys fs = file->fs;
|
||||||
|
char *b = NULL;
|
||||||
|
ext2_off64_t off = offset % fs->blocksize;
|
||||||
|
blk64_t blk;
|
||||||
|
int ret_flags;
|
||||||
|
errcode_t retval;
|
||||||
|
|
||||||
|
if (off == 0)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
retval = sync_buffer_position(file);
|
||||||
|
if (retval)
|
||||||
|
return retval;
|
||||||
|
|
||||||
|
/* Is there an initialized block at the end? */
|
||||||
|
retval = ext2fs_bmap2(fs, file->ino, NULL, NULL, 0,
|
||||||
|
offset / fs->blocksize, &ret_flags, &blk);
|
||||||
|
if (retval)
|
||||||
|
return retval;
|
||||||
|
if ((blk == 0) || (ret_flags & BMAP_RET_UNINIT))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
/* Zero to the end of the block */
|
||||||
|
retval = ext2fs_get_mem(fs->blocksize, &b);
|
||||||
|
if (retval)
|
||||||
|
return retval;
|
||||||
|
|
||||||
|
/* Read/zero/write block */
|
||||||
|
retval = io_channel_read_blk64(fs->io, blk, 1, b);
|
||||||
|
if (retval)
|
||||||
|
goto out;
|
||||||
|
|
||||||
|
memset(b + off, 0, fs->blocksize - off);
|
||||||
|
|
||||||
|
retval = io_channel_write_blk64(fs->io, blk, 1, b);
|
||||||
|
if (retval)
|
||||||
|
goto out;
|
||||||
|
|
||||||
|
out:
|
||||||
|
ext2fs_free_mem(&b);
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This function sets the size of the file, truncating it if necessary
|
* This function sets the size of the file, truncating it if necessary
|
||||||
*
|
*
|
||||||
|
@ -434,6 +480,10 @@ errcode_t ext2fs_file_set_size2(ext2_file_t file, ext2_off64_t size)
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
retval = ext2fs_file_zero_past_offset(file, size);
|
||||||
|
if (retval)
|
||||||
|
return retval;
|
||||||
|
|
||||||
if (truncate_block >= old_truncate)
|
if (truncate_block >= old_truncate)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue