diff --git a/libarchive-2.5.5-ISO9660-filenames.patch b/libarchive-2.5.5-ISO9660-filenames.patch new file mode 100644 index 0000000..f643b32 --- /dev/null +++ b/libarchive-2.5.5-ISO9660-filenames.patch @@ -0,0 +1,61 @@ +diff --git a/libarchive/libarchive-2.5.5/libarchive/archive_read_support_format_iso9660.c b/libarchive/libarchive-2.5.5/libarchive/archive_read_support_format_iso9660.c +index 481220d..4cdf710 100644 +--- a/libarchive/libarchive-2.5.5/libarchive/archive_read_support_format_iso9660.c ++++ b/libarchive/libarchive-2.5.5/libarchive/archive_read_support_format_iso9660.c +@@ -517,6 +517,8 @@ parse_file_info(struct iso9660 *iso9660, struct file_info *parent, + { + struct file_info *file; + size_t name_len; ++ const unsigned char *rr_start, *rr_end; ++ const char *p; + int flags; + + /* TODO: Sanity check that name_len doesn't exceed length, etc. */ +@@ -535,13 +537,27 @@ parse_file_info(struct iso9660 *iso9660, struct file_info *parent, + file->mtime = isodate7(isodirrec + DR_date_offset); + file->ctime = file->atime = file->mtime; + name_len = (size_t)*(const unsigned char *)(isodirrec + DR_name_len_offset); ++ p = isodirrec + DR_name_offset; ++ /* Rockridge extensions (if any) follow name. Compute this ++ * before fidgeting the name_len below. */ ++ rr_start = p + name_len + (name_len & 1 ? 0 : 1) + iso9660->suspOffset; ++ rr_end = (const unsigned char *)isodirrec + *(isodirrec + DR_length_offset); ++ ++ /* Chop off trailing ';1' from files. */ ++ if (name_len > 2 && p[name_len - 1] == '1' && p[name_len - 2] == ';') ++ name_len -= 2; ++ /* Chop off trailing '.' from filenames. */ ++ if (name_len > 1 && p[name_len - 1] == '.') ++ --name_len; ++ + file->name = (char *)malloc(name_len + 1); + if (file->name == NULL) { + free(file); + return (NULL); + } +- memcpy(file->name, isodirrec + DR_name_offset, name_len); ++ memcpy(file->name, p, name_len); + file->name[name_len] = '\0'; ++ + flags = *(isodirrec + DR_flags_offset); + if (flags & 0x02) + file->mode = AE_IFDIR | 0700; +@@ -549,17 +565,7 @@ parse_file_info(struct iso9660 *iso9660, struct file_info *parent, + file->mode = AE_IFREG | 0400; + + /* Rockridge extensions overwrite information from above. */ +- { +- const unsigned char *rr_start, *rr_end; +- rr_end = (const unsigned char *)isodirrec +- + *(isodirrec + DR_length_offset); +- rr_start = (const unsigned char *)(isodirrec + DR_name_offset +- + name_len); +- if ((name_len & 1) == 0) +- rr_start++; +- rr_start += iso9660->suspOffset; +- parse_rockridge(iso9660, file, rr_start, rr_end); +- } ++ parse_rockridge(iso9660, file, rr_start, rr_end); + + /* DEBUGGING: Warn about attributes I don't yet fully support. */ + if ((flags & ~0x02) != 0) { diff --git a/libarchive.spec b/libarchive.spec index a57e72a..6a3df73 100644 --- a/libarchive.spec +++ b/libarchive.spec @@ -1,6 +1,6 @@ Name: libarchive Version: 2.5.5 -Release: 1%{?dist} +Release: 2%{?dist} Summary: A library for handling streaming archive formats Group: System Environment/Libraries @@ -9,6 +9,9 @@ URL: http://people.freebsd.org/~kientzle/libarchive/ Source0: http://people.freebsd.org/~kientzle/libarchive/src/libarchive-%{version}.tar.gz BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) +# https://bugzilla.redhat.com/show_bug.cgi?id=469512 +Patch0: libarchive-2.5.5-ISO9660-filenames.patch + BuildRequires: zlib-devel BuildRequires: bzip2-devel BuildRequires: sharutils @@ -31,6 +34,7 @@ developing applications that use %{name}. %prep %setup -q +%patch0 -p3 -b .iso9660-filenames %build @@ -72,6 +76,9 @@ rm -rf $RPM_BUILD_ROOT %changelog +* Mon Dec 8 2008 Tomas Bzatek 2.5.5-2 +- Fix ";1" filenames appearing in ISO9660 images (#469512) + * Tue Jul 22 2008 Tomas Bzatek 2.5.5-1 - Update to 2.5.5