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