Blame SOURCES/0004-lib-fs-resize-Prevent-crash-resizing-FAT16-file-syst.patch

0cb0b9
From 1e9e770f4bc7f3d80e09ecd1df58575fad064163 Mon Sep 17 00:00:00 2001
0cb0b9
From: Mike Fleetwood <mike.fleetwood@googlemail.com>
0cb0b9
Date: Sun, 28 Sep 2014 16:15:48 +0100
0cb0b9
Subject: [PATCH 4/6] lib-fs-resize: Prevent crash resizing FAT16 file systems
0cb0b9
0cb0b9
Resizing FAT16 file system crashes in libparted/fs/r/fat/resize.c
0cb0b9
create_resize_context() because it was dereferencing NULL pointer
0cb0b9
fs_info->info_sector to copy the info_sector.
0cb0b9
0cb0b9
Only FAT32 file systems have info_sector populated by fat_open() ->
0cb0b9
fat_info_sector_read().  FAT12 and FAT16 file systems don't have an
0cb0b9
info_sector so pointer fs_info->info_sector remains assigned NULL from
0cb0b9
fat_alloc().  When resizing a FAT file system create_resize_context()
0cb0b9
was always dereferencing fs_info->info_sector to memory copy the
0cb0b9
info_sector, hence it crashed for FAT12 and FAT16.
0cb0b9
0cb0b9
Make create_resize_context() only copy the info_sector for FAT32 file
0cb0b9
systems.
0cb0b9
0cb0b9
Reported by Christian Hesse in
0cb0b9
https://bugzilla.gnome.org/show_bug.cgi?id=735669
0cb0b9
---
0cb0b9
 NEWS                        |  4 ++++
0cb0b9
 libparted/fs/r/fat/resize.c | 12 +++++++++---
0cb0b9
 2 files changed, 13 insertions(+), 3 deletions(-)
0cb0b9
0cb0b9
diff --git a/NEWS b/NEWS
0cb0b9
index 297b0a5..da7db50 100644
0cb0b9
--- a/NEWS
0cb0b9
+++ b/NEWS
0cb0b9
@@ -2,6 +2,10 @@ GNU parted NEWS                                    -*- outline -*-
0cb0b9
 
0cb0b9
 * Noteworthy changes in release ?.? (????-??-??) [?]
0cb0b9
 
0cb0b9
+** Bug Fixes
0cb0b9
+
0cb0b9
+  libparted-fs-resize: Prevent crash resizing FAT16 file systems.
0cb0b9
+
0cb0b9
 
0cb0b9
 * Noteworthy changes in release 3.2 (2014-07-28) [stable]
0cb0b9
 
0cb0b9
diff --git a/libparted/fs/r/fat/resize.c b/libparted/fs/r/fat/resize.c
0cb0b9
index 919acf0..bfe60a0 100644
0cb0b9
--- a/libparted/fs/r/fat/resize.c
0cb0b9
+++ b/libparted/fs/r/fat/resize.c
0cb0b9
@@ -668,11 +668,17 @@ create_resize_context (PedFileSystem* fs, const PedGeometry* new_geom)
0cb0b9
 
0cb0b9
 /* preserve boot code, etc. */
0cb0b9
 	new_fs_info->boot_sector = ped_malloc (new_geom->dev->sector_size);
0cb0b9
-	new_fs_info->info_sector = ped_malloc (new_geom->dev->sector_size);
0cb0b9
 	memcpy (new_fs_info->boot_sector, fs_info->boot_sector,
0cb0b9
 		new_geom->dev->sector_size);
0cb0b9
-	memcpy (new_fs_info->info_sector, fs_info->info_sector,
0cb0b9
-		new_geom->dev->sector_size);
0cb0b9
+	new_fs_info->info_sector = NULL;
0cb0b9
+	if (fs_info->fat_type == FAT_TYPE_FAT32)
0cb0b9
+	{
0cb0b9
+		PED_ASSERT (fs_info->info_sector != NULL);
0cb0b9
+		new_fs_info->info_sector =
0cb0b9
+			ped_malloc (new_geom->dev->sector_size);
0cb0b9
+		memcpy (new_fs_info->info_sector, fs_info->info_sector,
0cb0b9
+			new_geom->dev->sector_size);
0cb0b9
+	}
0cb0b9
 
0cb0b9
 	new_fs_info->logical_sector_size = fs_info->logical_sector_size;
0cb0b9
 	new_fs_info->sector_count = new_geom->length;
0cb0b9
-- 
0cb0b9
1.9.3
0cb0b9