]> git.ipfire.org Git - thirdparty/libarchive.git/commitdiff
Add XAR xattr fstype cleanup coverage
authorbr0nzu <dongpago2@gamil.com>
Wed, 13 May 2026 07:24:44 +0000 (16:24 +0900)
committerbr0nzu <dongpago2@gamil.com>
Wed, 13 May 2026 07:24:44 +0000 (16:24 +0900)
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.

libarchive/test/test_read_format_xar.c

index 5c306e58522e5c689c1c76f417584ae694c5640e..06d35b170783abdfd6772b08103daf717cb61a12 100644 (file)
@@ -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[] =