bin/153154: [patch][libarchive] fix error handling in mtree parsing
code
Mark Johnston
markjdb at gmail.com
Tue Dec 14 19:40:09 UTC 2010
>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 at 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:
More information about the freebsd-bugs
mailing list