From 4d35fa8c430adf43ad1370b749efcfe1a39067c5 Mon Sep 17 00:00:00 2001 From: "Brian C. Lane" Date: Mon, 7 Mar 2016 11:55:00 -0800 Subject: [PATCH] - lib-fs-resize: Prevent crash resizing FAT with very deep directories - Add libparted/fs/.libs/ to LD_LIBRARY_PATH during make check --- ...event-crash-resizing-FAT-with-very-d.patch | 33 +++++++++++++ ...resize-fs.sh-Add-very-deep-directory.patch | 49 +++++++++++++++++++ parted.spec | 10 +++- 3 files changed, 90 insertions(+), 2 deletions(-) create mode 100644 0029-lib-fs-resize-Prevent-crash-resizing-FAT-with-very-d.patch create mode 100644 0030-tests-t3000-resize-fs.sh-Add-very-deep-directory.patch diff --git a/0029-lib-fs-resize-Prevent-crash-resizing-FAT-with-very-d.patch b/0029-lib-fs-resize-Prevent-crash-resizing-FAT-with-very-d.patch new file mode 100644 index 0000000..3624c8a --- /dev/null +++ b/0029-lib-fs-resize-Prevent-crash-resizing-FAT-with-very-d.patch @@ -0,0 +1,33 @@ +From 9a95ca5da96846f3edea48ab18c6365001805e70 Mon Sep 17 00:00:00 2001 +From: Mike Fleetwood +Date: Sun, 28 Feb 2016 15:36:10 +0000 +Subject: [PATCH 29/30] lib-fs-resize: Prevent crash resizing FAT with very + deep directories + +Resizing a FAT file system crashes in libparted/fs/r/fat/count.c +flag_traverse_dir() if the length of any path name in the file system +overflows the 512 byte file_name local buffer. Increase buffer to 4096, +PATH_MAX on Linux. + +Reported in +https://bugzilla.gnome.org/show_bug.cgi?id=762448 +--- + libparted/fs/r/fat/count.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/libparted/fs/r/fat/count.c b/libparted/fs/r/fat/count.c +index 7949e47..a5837c0 100644 +--- a/libparted/fs/r/fat/count.c ++++ b/libparted/fs/r/fat/count.c +@@ -219,7 +219,7 @@ flag_traverse_dir (FatTraverseInfo* trav_info) { + PedFileSystem* fs = trav_info->fs; + FatDirEntry* this_entry; + FatTraverseInfo* subdir_trav_info; +- char file_name [512]; ++ char file_name [4096]; + char* file_name_start; + FatCluster first_cluster; + PedSector size; +-- +2.5.0 + diff --git a/0030-tests-t3000-resize-fs.sh-Add-very-deep-directory.patch b/0030-tests-t3000-resize-fs.sh-Add-very-deep-directory.patch new file mode 100644 index 0000000..a16e10e --- /dev/null +++ b/0030-tests-t3000-resize-fs.sh-Add-very-deep-directory.patch @@ -0,0 +1,49 @@ +From 599ce25c802fc1154ed619fde4249bb381430407 Mon Sep 17 00:00:00 2001 +From: Mike Fleetwood +Date: Sun, 28 Feb 2016 15:36:11 +0000 +Subject: [PATCH 30/30] tests: t3000-resize-fs.sh: Add very deep directory + +Create 500 deep directory tree, with longest name of 4000 characters, to +the file system being resized to test the fix to prevent crash when +resizing a FAT file system with such a long path. +--- + tests/t3000-resize-fs.sh | 16 ++++++++++++++++ + 1 file changed, 16 insertions(+) + +diff --git a/tests/t3000-resize-fs.sh b/tests/t3000-resize-fs.sh +index a79a307..608871c 100755 +--- a/tests/t3000-resize-fs.sh ++++ b/tests/t3000-resize-fs.sh +@@ -46,6 +46,13 @@ device_sectors_required=$(echo $default_end | sed 's/s$//') + # Ensure that $dev is large enough for this test + test $device_sectors_required -le $dev_n_sectors || fail=1 + ++# create mount point dir ++mount_point="`pwd`/mnt" ++mkdir "$mount_point" || fail=1 ++ ++# be sure to unmount upon interrupt, failure, etc. ++cleanup_fn_() { umount "${dev}1" > /dev/null 2>&1; } ++ + for fs_type in hfs+ fat32 fat16; do + echo "fs_type=$fs_type" + +@@ -69,6 +76,15 @@ for fs_type in hfs+ fat32 fat16; do + # create the file system + $mkfs_cmd ${dev}1 || fail=1 + ++ # create 500 deep directory tree with longest name 4000 characters ++ # to catch core dump in libparted/fs/r/fat/count.c flag_traverse_dir() ++ # overflowing 512 byte file_name local buffer. ++ mount "${dev}1" "$mount_point" || fail=1 ++ cat /dev/null > exp ++ ( cd "$mount_point"; for d in `seq 500`; do mkdir TESTDIR; cd TESTDIR; done ) > out ++ compare exp out || fail=1 # Ensure no errors creating directory tree ++ umount "${dev}1" || fail=1 ++ + # NOTE: shrinking is the only type of resizing that works. + # resize that file system to be one cylinder (8MiB) smaller + fs-resize ${dev}1 0 $new_end > out 2>&1 || fail=1 +-- +2.5.0 + diff --git a/parted.spec b/parted.spec index e454833..f1e9e5d 100644 --- a/parted.spec +++ b/parted.spec @@ -4,7 +4,7 @@ Summary: The GNU disk partition manipulation program Name: parted Version: 3.2 -Release: 16%{?dist} +Release: 17%{?dist} License: GPLv3+ Group: Applications/System URL: http://www.gnu.org/software/parted @@ -42,6 +42,8 @@ Patch0025: 0025-Add-libparted-fs-resize.pc.patch Patch0026: 0026-tests-Add-udevadm-settle-to-wait_for_-loop-1260664.patch Patch0027: 0027-tests-Add-wait-to-t9042-1257415.patch Patch0028: 0028-tests-Fix-t1700-failing-on-a-host-with-a-4k-xfs-file.patch +Patch0029: 0029-lib-fs-resize-Prevent-crash-resizing-FAT-with-very-d.patch +Patch0030: 0030-tests-t3000-resize-fs.sh-Add-very-deep-directory.patch Buildroot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) @@ -131,7 +133,7 @@ V=1 %{__make} %{?_smp_mflags} %check -export LD_LIBRARY_PATH=$(pwd)/libparted/.libs +export LD_LIBRARY_PATH=$(pwd)/libparted/.libs:$(pwd)/libparted/fs/.libs make check @@ -179,6 +181,10 @@ fi %changelog +* Mon Mar 07 2016 Brian C. Lane 3.2-17 +- lib-fs-resize: Prevent crash resizing FAT with very deep directories +- Add libparted/fs/.libs/ to LD_LIBRARY_PATH during make check + * Mon Feb 29 2016 Brian C. Lane 3.2-16 - Cleanup library path usage in specfile pkgconfig wasn't finding libparted.pc because it was under /usr/lib64/