From owner-svn-src-head@FreeBSD.ORG Sat Dec 6 06:57:45 2008 Return-Path: Delivered-To: svn-src-head@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id E3B8F1065676; Sat, 6 Dec 2008 06:57:45 +0000 (UTC) (envelope-from kientzle@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id B89F58FC08; Sat, 6 Dec 2008 06:57:45 +0000 (UTC) (envelope-from kientzle@FreeBSD.org) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id mB66vj6x086177; Sat, 6 Dec 2008 06:57:45 GMT (envelope-from kientzle@svn.freebsd.org) Received: (from kientzle@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id mB66vjXM086176; Sat, 6 Dec 2008 06:57:45 GMT (envelope-from kientzle@svn.freebsd.org) Message-Id: <200812060657.mB66vjXM086176@svn.freebsd.org> From: Tim Kientzle Date: Sat, 6 Dec 2008 06:57:45 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r185682 - head/lib/libarchive X-BeenThere: svn-src-head@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for the src tree for head/-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 06 Dec 2008 06:57:46 -0000 Author: kientzle Date: Sat Dec 6 06:57:45 2008 New Revision: 185682 URL: http://svn.freebsd.org/changeset/base/185682 Log: Strip ";1" and trailing "." from ISO9660 entries. This seems a better match for people's expectations. Modified: head/lib/libarchive/archive_read_support_format_iso9660.c Modified: head/lib/libarchive/archive_read_support_format_iso9660.c ============================================================================== --- head/lib/libarchive/archive_read_support_format_iso9660.c Sat Dec 6 06:55:07 2008 (r185681) +++ head/lib/libarchive/archive_read_support_format_iso9660.c Sat Dec 6 06:57:45 2008 (r185682) @@ -593,6 +593,8 @@ parse_file_info(struct iso9660 *iso9660, { 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. */ @@ -610,8 +612,23 @@ parse_file_info(struct iso9660 *iso9660, file->size = toi(isodirrec + DR_size_offset, DR_size_size); 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); - archive_strncpy(&file->name, isodirrec + DR_name_offset, name_len); + 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; + archive_strncpy(&file->name, p, name_len); + flags = *(isodirrec + DR_flags_offset); if (flags & 0x02) file->mode = AE_IFDIR | 0700; @@ -619,17 +636,7 @@ parse_file_info(struct iso9660 *iso9660, 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); #if DEBUG /* DEBUGGING: Warn about attributes I don't yet fully support. */ @@ -690,6 +697,8 @@ parse_rockridge(struct iso9660 *iso9660, const unsigned char *p, const unsigned char *end) { (void)iso9660; /* UNUSED */ + file->name_continues = 0; + file->symlink_continues = 0; while (p + 4 < end /* Enough space for another entry. */ && p[0] >= 'A' && p[0] <= 'Z' /* Sanity-check 1st char of name. */