8c43ba62('filesetup: align layout buffer') needs to use the same size
for fio_memalign() and fio_memfree().
If the size `bs' gets decreased while in the write(2) loop, the size
for freeing is smaller than it should be, and results in segfault
by dereferencing ->offset of the footer via irrelevant address somewhere
in user data.
Signed-off-by: Tomohiro Kusumi <tkusumi@tuxera.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
{
int new_layout = 0, unlink_file = 0, flags;
unsigned long long left;
{
int new_layout = 0, unlink_file = 0, flags;
unsigned long long left;
+ unsigned int bs, alloc_size = 0;
char *b = NULL;
if (read_only) {
char *b = NULL;
if (read_only) {
if (bs > left)
bs = left;
if (bs > left)
bs = left;
- b = fio_memalign(page_size, bs);
+ alloc_size = bs;
+ b = fio_memalign(page_size, alloc_size);
if (!b) {
td_verror(td, errno, "fio_memalign");
goto err;
if (!b) {
td_verror(td, errno, "fio_memalign");
goto err;
f->io_size = f->real_file_size;
}
f->io_size = f->real_file_size;
}
+ fio_memfree(b, alloc_size);
done:
return 0;
err:
close(f->fd);
f->fd = -1;
if (b)
done:
return 0;
err:
close(f->fd);
f->fd = -1;
if (b)
+ fio_memfree(b, alloc_size);