From owner-svn-src-all@FreeBSD.ORG Sun Apr 26 18:57:50 2009 Return-Path: Delivered-To: svn-src-all@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id D3DEB106564A; Sun, 26 Apr 2009 18:57:50 +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 B89158FC1E; Sun, 26 Apr 2009 18:57:50 +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 n3QIvora091839; Sun, 26 Apr 2009 18:57:50 GMT (envelope-from kientzle@svn.freebsd.org) Received: (from kientzle@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n3QIvo5S091837; Sun, 26 Apr 2009 18:57:50 GMT (envelope-from kientzle@svn.freebsd.org) Message-Id: <200904261857.n3QIvo5S091837@svn.freebsd.org> From: Tim Kientzle Date: Sun, 26 Apr 2009 18:57:50 +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: r191527 - in head/lib/libarchive: . test X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 26 Apr 2009 18:57:51 -0000 Author: kientzle Date: Sun Apr 26 18:57:50 2009 New Revision: 191527 URL: http://svn.freebsd.org/changeset/base/191527 Log: Reading an mtree file is supposed to provide access to the file data (if the file exists on disk). This was broken for the first regular file; fix it and add a test so it won't break again. In particular, this fixes the following idiom for creating a tar archive in which every file is owned by root: tar cf - --format=mtree . \ | sed -e 's/uname=[a-z]*/uname=root/' -e 's/uid=[0-9]*/uid=0/' \ | tar cf - @- Modified: head/lib/libarchive/archive_read_support_format_mtree.c head/lib/libarchive/test/test_read_format_mtree.c Modified: head/lib/libarchive/archive_read_support_format_mtree.c ============================================================================== --- head/lib/libarchive/archive_read_support_format_mtree.c Sun Apr 26 18:46:40 2009 (r191526) +++ head/lib/libarchive/archive_read_support_format_mtree.c Sun Apr 26 18:57:50 2009 (r191527) @@ -990,8 +990,8 @@ read_data(struct archive_read *a, const if (mtree->buff == NULL) { archive_set_error(&a->archive, ENOMEM, "Can't allocate memory"); + return (ARCHIVE_FATAL); } - return (ARCHIVE_FATAL); } *buff = mtree->buff; Modified: head/lib/libarchive/test/test_read_format_mtree.c ============================================================================== --- head/lib/libarchive/test/test_read_format_mtree.c Sun Apr 26 18:46:40 2009 (r191526) +++ head/lib/libarchive/test/test_read_format_mtree.c Sun Apr 26 18:57:50 2009 (r191527) @@ -28,7 +28,7 @@ __FBSDID("$FreeBSD$"); /* Single entry with a hardlink. */ static unsigned char archive[] = { "#mtree\n" - "file type=file uid=18 mode=0123\n" + "file type=file uid=18 mode=0123 size=3\n" "dir type=dir\n" " file\\040with\\040space type=file uid=18\n" " ..\n" @@ -49,8 +49,10 @@ static unsigned char archive[] = { DEFINE_TEST(test_read_format_mtree) { + char buff[16]; struct archive_entry *ae; struct archive *a; + int fd; /* * An access error occurred on some platform when mtree @@ -68,12 +70,23 @@ DEFINE_TEST(test_read_format_mtree) archive_read_support_format_all(a)); assertEqualIntA(a, ARCHIVE_OK, archive_read_open_memory(a, archive, sizeof(archive))); + + /* + * Read "file", whose data is available on disk. + */ + fd = open("file", O_WRONLY | O_CREAT, 0777); + assert(fd >= 0); + assertEqualInt(3, write(fd, "hi\n", 3)); + close(fd); assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); assertEqualInt(archive_format(a), ARCHIVE_FORMAT_MTREE); assertEqualString(archive_entry_pathname(ae), "file"); assertEqualInt(archive_entry_uid(ae), 18); assert(S_ISREG(archive_entry_mode(ae))); assertEqualInt(archive_entry_mode(ae), AE_IFREG | 0123); + assertEqualInt(archive_entry_size(ae), 3); + assertEqualInt(3, archive_read_data(a, buff, 3)); + assertEqualMem(buff, "hi\n", 3); assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); assertEqualString(archive_entry_pathname(ae), "dir");