From: Martin Matuska Date: Thu, 16 Apr 2020 02:10:30 +0000 (+0200) Subject: tar reader: update handling of RHT.security.selinux xattr X-Git-Tag: v3.4.3~7 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=874882977cc47e1caf54233ab9270b3c15b1998c;p=thirdparty%2Flibarchive.git tar reader: update handling of RHT.security.selinux xattr Add test for PR #1348 Rename test_read_pax_schily_xattr to test_read_pax_xattr_schily --- diff --git a/Makefile.am b/Makefile.am index 78d674d5d..bcf6c1248 100644 --- a/Makefile.am +++ b/Makefile.am @@ -539,7 +539,8 @@ libarchive_test_SOURCES= \ libarchive/test/test_read_format_zip_zip64.c \ libarchive/test/test_read_format_zip_with_invalid_traditional_eocd.c \ libarchive/test/test_read_large.c \ - libarchive/test/test_read_pax_schily_xattr.c \ + libarchive/test/test_read_pax_xattr_rht_security_selinux.c \ + libarchive/test/test_read_pax_xattr_schily.c \ libarchive/test/test_read_pax_truncated.c \ libarchive/test/test_read_position.c \ libarchive/test/test_read_set_format.c \ @@ -946,7 +947,8 @@ libarchive_test_EXTRA_DIST=\ libarchive/test/test_read_large_splitted_rar_ac.uu \ libarchive/test/test_read_large_splitted_rar_ad.uu \ libarchive/test/test_read_large_splitted_rar_ae.uu \ - libarchive/test/test_read_pax_schily_xattr.tar.uu \ + libarchive/test/test_read_pax_xattr_rht_security_selinux.tar.uu \ + libarchive/test/test_read_pax_xattr_schily.tar.uu \ libarchive/test/test_read_splitted_rar_aa.uu \ libarchive/test/test_read_splitted_rar_ab.uu \ libarchive/test/test_read_splitted_rar_ac.uu \ diff --git a/libarchive/archive_read_support_format_tar.c b/libarchive/archive_read_support_format_tar.c index a9f755906..96d810184 100644 --- a/libarchive/archive_read_support_format_tar.c +++ b/libarchive/archive_read_support_format_tar.c @@ -1797,16 +1797,11 @@ pax_attribute_schily_xattr(struct archive_entry *entry, } static int -pax_attribute_rh_selinux(struct archive_entry *entry, - const char *name, const char *value, size_t value_length) +pax_attribute_rht_security_selinux(struct archive_entry *entry, + const char *value, size_t value_length) { - // RHT.security.selinux -> xattr security.selinux - if (strlen(name) < 5 || (memcmp(name, "RHT.", 4)) != 0) - return 1; - - name += 4; - - archive_entry_xattr_add_entry(entry, name, value, value_length); + archive_entry_xattr_add_entry(entry, "security.selinux", + value, value_length); return 0; } @@ -1982,10 +1977,10 @@ pax_attribute(struct archive_read *a, struct tar *tar, pax_attribute_xattr(entry, key, value); break; case 'R': - /* Upstream GNU tar uses RHT.security header to store SELinux xattrs + /* GNU tar uses RHT.security header to store SELinux xattrs * SCHILY.xattr.security.selinux == RHT.security.selinux */ if (strcmp(key, "RHT.security.selinux") == 0) { - pax_attribute_rh_selinux(entry, key, value, + pax_attribute_rht_security_selinux(entry, value, value_length); } break; diff --git a/libarchive/test/CMakeLists.txt b/libarchive/test/CMakeLists.txt index df34d3e32..4be5bf4cd 100644 --- a/libarchive/test/CMakeLists.txt +++ b/libarchive/test/CMakeLists.txt @@ -191,7 +191,8 @@ IF(ENABLE_TEST) test_read_format_zip_zip64.c test_read_format_zip_with_invalid_traditional_eocd.c test_read_large.c - test_read_pax_schily_xattr.c + test_read_pax_xattr_rht_security_selinux.c + test_read_pax_xattr_schily.c test_read_pax_truncated.c test_read_position.c test_read_set_format.c diff --git a/libarchive/test/test_read_pax_xattr_rht_security_selinux.c b/libarchive/test/test_read_pax_xattr_rht_security_selinux.c new file mode 100644 index 000000000..609e8d03b --- /dev/null +++ b/libarchive/test/test_read_pax_xattr_rht_security_selinux.c @@ -0,0 +1,62 @@ +/*- + * Copyright (c) 2016 IBM Corporation + * Copyright (c) 2003-2007 Tim Kientzle + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * This test case's code has been derived from test_entry.c + */ +#include "test.h" + +DEFINE_TEST(test_read_pax_xattr_rht_security_selinux) +{ + struct archive *a; + struct archive_entry *ae; + const char *refname = "test_read_pax_xattr_rht_security_selinux.tar"; + const char *xname; /* For xattr tests. */ + const void *xval; /* For xattr tests. */ + size_t xsize; /* For xattr tests. */ + const char *string; + + assert((a = archive_read_new()) != NULL); + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); + + extract_reference_file(refname); + assertEqualIntA(a, ARCHIVE_OK, + archive_read_open_filename(a, refname, 10240)); + + assertEqualInt(ARCHIVE_OK, archive_read_next_header(a, &ae)); + assertEqualInt(1, archive_entry_xattr_count(ae)); + assertEqualInt(1, archive_entry_xattr_reset(ae)); + + assertEqualInt(0, archive_entry_xattr_next(ae, &xname, &xval, &xsize)); + assertEqualString(xname, "security.selinux"); + string = "system_u:object_r:admin_home_t:s0"; + assertEqualMem(xval, string, xsize); + assertEqualInt((int)xsize, strlen(string)); + + /* Close the archive. */ + assertEqualInt(ARCHIVE_OK, archive_read_close(a)); + assertEqualInt(ARCHIVE_OK, archive_read_free(a)); +} diff --git a/libarchive/test/test_read_pax_xattr_rht_security_selinux.tar.uu b/libarchive/test/test_read_pax_xattr_rht_security_selinux.tar.uu new file mode 100644 index 000000000..495efbcf1 --- /dev/null +++ b/libarchive/test/test_read_pax_xattr_rht_security_selinux.tar.uu @@ -0,0 +1,231 @@ +begin 664 test_read_pax_xattr_rht_security_selinux.tar +M+B]087A(96%D97)S+C$V-C0O=&5S="YT>'0````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````#`P,#`V-#0`,#`P,#`P,``P,#`P,#`P`#`P,#`P,#`P,C(R +M`#$S-#8T-S``````````````````````````````` +M```````````````````````````````````````````````````````````` +M``````````````````````````````````````````!U