From: br0nzu Date: Wed, 13 May 2026 07:24:44 +0000 (+0900) Subject: Add XAR xattr fstype cleanup coverage X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=601e7d60871ea50fe7618ffdf46c787a76274560;p=thirdparty%2Flibarchive.git Add XAR xattr fstype cleanup coverage Add a focused XAR sample with xattr fstype metadata and exercise it through the public read/free path. This gives leak-checking builds coverage for the xattr cleanup ownership boundary. --- diff --git a/libarchive/test/test_read_format_xar.c b/libarchive/test/test_read_format_xar.c index 5c306e585..06d35b170 100644 --- a/libarchive/test/test_read_format_xar.c +++ b/libarchive/test/test_read_format_xar.c @@ -724,6 +724,24 @@ static unsigned char archive13[] = { 0xce,0xac,0xe0,0x02,0x00,0x20,0xfa,0x04,0xc5 }; +static unsigned char archive14_xattr_fstype[] = { +0x78,0x61,0x72,0x21,0x00,0x1c,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc2, +0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x22,0x00,0x00,0x00,0x00,0x78,0x9c,0x3d,0x8f, +0x41,0x8e,0xc2,0x30,0x0c,0x45,0xf7,0x3d,0x45,0x94,0x3d,0x75,0x47,0x42,0x68,0x16, +0xbf,0x61,0x37,0x27,0x18,0x0e,0x10,0xb5,0x4e,0x89,0x94,0x26,0x55,0xe3,0x41,0xc0, +0xe9,0x49,0x4a,0x99,0xd5,0x7f,0x96,0x6d,0xe9,0x7d,0x9c,0xef,0x73,0x50,0x37,0x5e, +0xb3,0x4f,0xb1,0xd7,0x5f,0x6d,0xa7,0x15,0xc7,0x21,0x8d,0x3e,0x4e,0xbd,0xbe,0xfc, +0xfe,0x1c,0xbe,0xf5,0xd9,0x34,0xb8,0xdb,0xd5,0x40,0xd2,0x50,0xd0,0xf9,0xc0,0xca, +0x8f,0xe5,0x58,0x1b,0x44,0x3b,0xb3,0x71,0xa0,0x2d,0x21,0x8f,0xa5,0x4c,0x65,0x0f, +0xda,0x10,0x73,0x1a,0xd9,0x74,0xa7,0xe3,0x11,0xb4,0x61,0xa3,0x14,0xd8,0xfe,0x7f, +0x07,0x8e,0x93,0x5c,0x4d,0xd9,0xee,0x84,0xe4,0x5c,0x66,0x31,0x1d,0x68,0x27,0x64, +0xff,0xe4,0x7a,0xb1,0x25,0x3e,0x6e,0x2a,0xcb,0x23,0x70,0xaf,0xed,0xb2,0x04,0x3f, +0x58,0x29,0xf6,0x94,0x06,0x61,0x39,0x64,0x59,0xd9,0xce,0x9a,0x76,0xb7,0xbf,0xcc, +0x6b,0xeb,0x72,0xd5,0xf9,0x58,0xbe,0x27,0x73,0x75,0x19,0xb4,0x33,0x88,0x6d,0xa9, +0x46,0xd5,0xbd,0x66,0x6d,0x0a,0xaa,0xa5,0x9b,0x17,0xc3,0xba,0x60,0xaa,0x44,0x41, +0x54,0x41 +}; + enum enc { GZIP, BZIP2 @@ -844,6 +862,30 @@ static void verifyB(unsigned char *d, size_t s) { assertEqualInt(ARCHIVE_OK, archive_read_free(a)); } +static void verify_xattr_fstype_cleanup(unsigned char *d, size_t s) +{ + struct archive_entry *ae; + struct archive *a; + int r; + + assert((a = archive_read_new()) != NULL); + assertA(0 == archive_read_support_filter_all(a)); + r = archive_read_support_format_xar(a); + if (r == ARCHIVE_WARN) { + skipping("xar reading not fully supported on this platform"); + assertEqualInt(ARCHIVE_OK, archive_read_free(a)); + return; + } + assertEqualIntA(a, ARCHIVE_OK, archive_read_open_memory(a, d, s)); + + assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); + assertEqualString("f", archive_entry_pathname(ae)); + assertEqualInt(ARCHIVE_EOF, archive_read_next_header(a, &ae)); + + assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a)); + assertEqualInt(ARCHIVE_OK, archive_read_free(a)); +} + DEFINE_TEST(test_read_format_xar) { verify(archive1, sizeof(archive1), verify0, verify1, GZIP); @@ -861,6 +903,12 @@ DEFINE_TEST(test_read_format_xar) verifyB(archive13, sizeof(archive13)); } +DEFINE_TEST(test_read_format_xar_xattr_fstype_cleanup) +{ + verify_xattr_fstype_cleanup(archive14_xattr_fstype, + sizeof(archive14_xattr_fstype)); +} + DEFINE_TEST(test_read_format_xar_duplicate_filename_node) { static const char *reffiles[] =