From b581507257543d3228a3cb8f4e08d4a67f2c3e64 Mon Sep 17 00:00:00 2001 From: "Richard W.M. Jones" Date: Mon, 16 Jul 2018 14:09:46 +0100 Subject: [PATCH] Fix for ntfsclone crash (RHBZ#1601146). --- ntfs-3g.spec | 10 ++- ntfsclone-full-clusters-bz1601146.patch | 81 +++++++++++++++++++++++++ 2 files changed, 90 insertions(+), 1 deletion(-) create mode 100644 ntfsclone-full-clusters-bz1601146.patch diff --git a/ntfs-3g.spec b/ntfs-3g.spec index 131601b..bc2367d 100644 --- a/ntfs-3g.spec +++ b/ntfs-3g.spec @@ -16,7 +16,7 @@ Name: ntfs-3g Summary: Linux NTFS userspace driver Version: 2017.3.23 -Release: 7%{?dist} +Release: 8%{?dist} License: GPLv2+ Group: System Environment/Base Source0: http://tuxera.com/opensource/%%{name}_ntfsprogs-%%{version}%%{?subver}.tgz @@ -38,6 +38,10 @@ Provides: fuse-ntfs-3g = %{epoch}:%{version}-%{release} Patch0: ntfs-3g_ntfsprogs-2011.10.9-RC-ntfsck-unsupported-return-0.patch Patch1: check-mftmirr.patch Patch2: ntfs-3g-big-sectors.patch +# Fix for ntfsclone crash. +# Discussed with upstream developer but not upstream yet, see: +# https://bugzilla.redhat.com/show_bug.cgi?id=1601146#c4 +Patch3: ntfsclone-full-clusters-bz1601146.patch %description NTFS-3G is a stable, open source, GPL licensed, POSIX, read/write NTFS @@ -85,6 +89,7 @@ included utilities see man 8 ntfsprogs after installation). %patch0 -p1 -b .unsupported %patch1 -p0 -b .check-mftmirr %patch2 -p0 -b .big-sectors +%patch3 -p0 -b .ntfsclone %build CFLAGS="$RPM_OPT_FLAGS -D_FILE_OFFSET_BITS=64" @@ -293,6 +298,9 @@ cp -a %{SOURCE1} %{buildroot}%{_datadir}/hal/fdi/policy/10osvendor/ %exclude %{_mandir}/man8/ntfs-3g* %changelog +* Mon Jul 16 2018 Richard W.M. Jones - 2:2017.3.23-8 +- Fix for ntfsclone crash (RHBZ#1601146). + * Fri Jul 13 2018 Fedora Release Engineering - 2:2017.3.23-7 - Rebuilt for https://fedoraproject.org/wiki/Fedora_29_Mass_Rebuild diff --git a/ntfsclone-full-clusters-bz1601146.patch b/ntfsclone-full-clusters-bz1601146.patch new file mode 100644 index 0000000..1161510 --- /dev/null +++ b/ntfsclone-full-clusters-bz1601146.patch @@ -0,0 +1,81 @@ +--- ntfsprogs/ntfsclone.c 2018-05-16 18:46:47.114964000 +0200 ++++ ntfsprogs/ntfsclone.c 2018-07-16 14:03:20.273809100 +0200 +@@ -776,6 +776,10 @@ + + /* possible partial cluster holding the backup boot sector */ + backup_bootsector = (lcn + 1)*csize >= full_device_size; ++ buff = (char*)ntfs_malloc(csize); ++ if (!buff) ++ err_exit("Not enough memory"); ++ + if (backup_bootsector) { + csize = full_device_size - lcn*csize; + if (csize < 0) { +@@ -783,10 +787,6 @@ + } + } + +- buff = (char*)ntfs_malloc(csize); +- if (!buff) +- err_exit("Not enough memory"); +- + // need reading when not about to write ? + if (read_all(fd, buff, csize) == -1) { + +@@ -1507,6 +1507,7 @@ + s64 mft_no; + u32 mft_record_size; + u32 csize; ++ u32 buff_size; + u32 bytes_per_sector; + u32 records_per_set; + u32 clusters_per_set; +@@ -1524,15 +1525,18 @@ + /* + * Depending on the sizes, there may be several records + * per cluster, or several clusters per record. ++ * Anyway, full clusters are needed for rescuing bad ones. + */ + if (csize >= mft_record_size) { + records_per_set = csize/mft_record_size; + clusters_per_set = 1; ++ buff_size = csize; + } else { + clusters_per_set = mft_record_size/csize; + records_per_set = 1; ++ buff_size = mft_record_size; + } +- buff = (char*)ntfs_malloc(mft_record_size); ++ buff = (char*)ntfs_malloc(buff_size); + if (!buff) + err_exit("Not enough memory"); + +@@ -1585,6 +1589,7 @@ + void *fd; + u32 indx_record_size; + u32 csize; ++ u32 buff_size; + u32 bytes_per_sector; + u32 records_per_set; + u32 clusters_per_set; +@@ -1601,16 +1606,19 @@ + /* + * Depending on the sizes, there may be several records + * per cluster, or several clusters per record. ++ * Anyway, full clusters are needed for rescuing bad ones. + */ + indx_record_size = image->ni->vol->indx_record_size; + if (csize >= indx_record_size) { + records_per_set = csize/indx_record_size; + clusters_per_set = 1; ++ buff_size = csize; + } else { + clusters_per_set = indx_record_size/csize; + records_per_set = 1; ++ buff_size = indx_record_size; + } +- buff = (char*)ntfs_malloc(indx_record_size); ++ buff = (char*)ntfs_malloc(buff_size); + if (!buff) + err_exit("Not enough memory"); +