diff options
author | Mike Fleetwood <mike.fleetwood@googlemail.com> | 2014-09-28 16:15:48 +0100 |
---|---|---|
committer | Phillip Susi <psusi@ubuntu.com> | 2014-10-27 20:24:08 -0400 |
commit | 1e9e770f4bc7f3d80e09ecd1df58575fad064163 (patch) | |
tree | 54ce648cacdb914d33d3882bdc39c03cc2fd621a | |
parent | 507d8e8d4c60fa6175d327c4f2dac307dc11ccd6 (diff) | |
download | parted-1e9e770f4bc7f3d80e09ecd1df58575fad064163.tar.gz |
lib-fs-resize: Prevent crash resizing FAT16 file systems
Resizing FAT16 file system crashes in libparted/fs/r/fat/resize.c
create_resize_context() because it was dereferencing NULL pointer
fs_info->info_sector to copy the info_sector.
Only FAT32 file systems have info_sector populated by fat_open() ->
fat_info_sector_read(). FAT12 and FAT16 file systems don't have an
info_sector so pointer fs_info->info_sector remains assigned NULL from
fat_alloc(). When resizing a FAT file system create_resize_context()
was always dereferencing fs_info->info_sector to memory copy the
info_sector, hence it crashed for FAT12 and FAT16.
Make create_resize_context() only copy the info_sector for FAT32 file
systems.
Reported by Christian Hesse in
https://bugzilla.gnome.org/show_bug.cgi?id=735669
-rw-r--r-- | NEWS | 4 | ||||
-rw-r--r-- | libparted/fs/r/fat/resize.c | 12 |
2 files changed, 13 insertions, 3 deletions
@@ -2,6 +2,10 @@ GNU parted NEWS -*- outline -*- * Noteworthy changes in release ?.? (????-??-??) [?] +** Bug Fixes + + libparted-fs-resize: Prevent crash resizing FAT16 file systems. + * Noteworthy changes in release 3.2 (2014-07-28) [stable] diff --git a/libparted/fs/r/fat/resize.c b/libparted/fs/r/fat/resize.c index 919acf0..bfe60a0 100644 --- a/libparted/fs/r/fat/resize.c +++ b/libparted/fs/r/fat/resize.c @@ -668,11 +668,17 @@ create_resize_context (PedFileSystem* fs, const PedGeometry* new_geom) /* preserve boot code, etc. */ new_fs_info->boot_sector = ped_malloc (new_geom->dev->sector_size); - new_fs_info->info_sector = ped_malloc (new_geom->dev->sector_size); memcpy (new_fs_info->boot_sector, fs_info->boot_sector, new_geom->dev->sector_size); - memcpy (new_fs_info->info_sector, fs_info->info_sector, - new_geom->dev->sector_size); + new_fs_info->info_sector = NULL; + if (fs_info->fat_type == FAT_TYPE_FAT32) + { + PED_ASSERT (fs_info->info_sector != NULL); + new_fs_info->info_sector = + ped_malloc (new_geom->dev->sector_size); + memcpy (new_fs_info->info_sector, fs_info->info_sector, + new_geom->dev->sector_size); + } new_fs_info->logical_sector_size = fs_info->logical_sector_size; new_fs_info->sector_count = new_geom->length; |