Date: Tue, 14 Dec 2010 19:31:10 GMT From: Mark Johnston <markjdb@gmail.com> To: freebsd-gnats-submit@FreeBSD.org Subject: bin/153154: [patch][libarchive] fix error handling in mtree parsing code Message-ID: <201012141931.oBEJVAr5034165@red.freebsd.org> Resent-Message-ID: <201012141940.oBEJe4Lj019288@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
>Number: 153154
>Category: bin
>Synopsis: [patch][libarchive] fix error handling in mtree parsing code
>Confidential: no
>Severity: non-critical
>Priority: low
>Responsible: freebsd-bugs
>State: open
>Quarter:
>Keywords:
>Date-Required:
>Class: sw-bug
>Submitter-Id: current-users
>Arrival-Date: Tue Dec 14 19:40:04 UTC 2010
>Closed-Date:
>Last-Modified:
>Originator: Mark Johnston
>Release: STABLE-8
>Organization:
>Environment:
FreeBSD mark-laptop-bsd.mark-home 8.2-PRERELEASE FreeBSD 8.2-PRERELEASE #7 r+46c51f0-dirty: Tue Dec 7 11:17:13 EST 2010 mark@mark-laptop-bsd.mark-home:/usr/obj/usr/home/mark/src/freebsd_git/src/sys/IPFW_GENERIC i386
>Description:
When parsing an mtree file, libarchive expects to find a type for each file it encounters. If the type is not set, libarchive complains that the type keyword is missing _and_ that the mtree specification and the actual file type don't match. In the case that the type specification is omitted, I think that libarchive should only report the first error.
>How-To-Repeat:
$ ls
bar.c foo.c tar.mtree
$ cat tar.mtree
#mtree
foo.c
bar.c
$ tar -cvf out.tar @tar.mtree
tar: Error reading archive tar.mtree: Missing type keyword in mtree specificationmtree specification has different type for foo.c
tar: Error exit delayed from previous errors.
$ echo $?
1
>Fix:
I attached a patch which has libarchive verify that MTREE_HAS_TYPE is set before potentially reporting that "mtree specification has a different type for ...".
After the patch:
$ tar -cvf out.tar @tar.mtree
tar: Error reading archive tar.mtree: Missing type keyword in mtree specification
tar: Error exit delayed from previous errors.
Patch attached with submission follows:
diff --git a/lib/libarchive/archive_read_support_format_mtree.c b/lib/libarchive/archive_read_support_format_mtree.c
index 8643bb8..c98b04d 100644
--- a/lib/libarchive/archive_read_support_format_mtree.c
+++ b/lib/libarchive/archive_read_support_format_mtree.c
@@ -641,7 +641,7 @@ parse_file(struct archive_read *a, struct archive_entry *entry,
archive_entry_filetype(entry) != AE_IFIFO)
mismatched_type = 1;
- if (mismatched_type) {
+ if (mismatched_type && (parsed_kws & MTREE_HAS_TYPE)) {
if ((parsed_kws & MTREE_HAS_OPTIONAL) == 0) {
archive_set_error(&a->archive,
ARCHIVE_ERRNO_MISC,
>Release-Note:
>Audit-Trail:
>Unformatted:
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201012141931.oBEJVAr5034165>
