aboutsummaryrefslogtreecommitdiffstats
path: root/contrib/libarchive/libarchive/test
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/libarchive/libarchive/test')
-rw-r--r--contrib/libarchive/libarchive/test/main.c767
-rw-r--r--contrib/libarchive/libarchive/test/read_open_memory.c98
-rw-r--r--contrib/libarchive/libarchive/test/test.h96
-rw-r--r--contrib/libarchive/libarchive/test/test_acl_freebsd.c4
-rw-r--r--contrib/libarchive/libarchive/test/test_acl_nfs4.c291
-rw-r--r--contrib/libarchive/libarchive/test/test_acl_pax.c265
-rw-r--r--contrib/libarchive/libarchive/test/test_acl_pax.tar.uu117
-rw-r--r--contrib/libarchive/libarchive/test/test_acl_posix1e.c (renamed from contrib/libarchive/libarchive/test/test_acl_basic.c)66
-rw-r--r--contrib/libarchive/libarchive/test/test_archive_api_feature.c28
-rw-r--r--contrib/libarchive/libarchive/test/test_archive_clear_error.c42
-rw-r--r--contrib/libarchive/libarchive/test/test_archive_crypto.c145
-rw-r--r--contrib/libarchive/libarchive/test/test_archive_read_close_twice.c43
-rw-r--r--contrib/libarchive/libarchive/test/test_archive_read_close_twice_open_fd.c47
-rw-r--r--contrib/libarchive/libarchive/test/test_archive_read_close_twice_open_filename.c47
-rw-r--r--contrib/libarchive/libarchive/test/test_archive_read_next_header_empty.c111
-rw-r--r--contrib/libarchive/libarchive/test/test_archive_read_next_header_raw.c65
-rw-r--r--contrib/libarchive/libarchive/test/test_archive_read_open2.c109
-rw-r--r--contrib/libarchive/libarchive/test/test_archive_read_set_filter_option.c55
-rw-r--r--contrib/libarchive/libarchive/test/test_archive_read_set_format_option.c67
-rw-r--r--contrib/libarchive/libarchive/test/test_archive_read_set_option.c69
-rw-r--r--contrib/libarchive/libarchive/test/test_archive_read_set_options.c126
-rw-r--r--contrib/libarchive/libarchive/test/test_archive_read_support.c98
-rw-r--r--contrib/libarchive/libarchive/test/test_archive_set_error.c51
-rw-r--r--contrib/libarchive/libarchive/test/test_archive_string.c344
-rw-r--r--contrib/libarchive/libarchive/test/test_archive_string_conversion.c629
-rw-r--r--contrib/libarchive/libarchive/test/test_archive_string_conversion.txt.Z.uu2605
-rw-r--r--contrib/libarchive/libarchive/test/test_archive_write_set_filter_option.c55
-rw-r--r--contrib/libarchive/libarchive/test/test_archive_write_set_format_option.c67
-rw-r--r--contrib/libarchive/libarchive/test/test_archive_write_set_option.c69
-rw-r--r--contrib/libarchive/libarchive/test/test_archive_write_set_options.c126
-rw-r--r--contrib/libarchive/libarchive/test/test_bad_fd.c10
-rw-r--r--contrib/libarchive/libarchive/test/test_compat_bzip2.c10
-rw-r--r--contrib/libarchive/libarchive/test/test_compat_cpio.c4
-rw-r--r--contrib/libarchive/libarchive/test/test_compat_gtar.c12
-rw-r--r--contrib/libarchive/libarchive/test/test_compat_gzip.c8
-rw-r--r--contrib/libarchive/libarchive/test/test_compat_lzip.c141
-rw-r--r--contrib/libarchive/libarchive/test/test_compat_lzip_1.tlz.uu10
-rw-r--r--contrib/libarchive/libarchive/test/test_compat_lzip_2.tlz.uu9
-rw-r--r--contrib/libarchive/libarchive/test/test_compat_lzma.c8
-rw-r--r--contrib/libarchive/libarchive/test/test_compat_mac-1.tar.Z.uu38
-rw-r--r--contrib/libarchive/libarchive/test/test_compat_mac-2.tar.Z.uu19
-rw-r--r--contrib/libarchive/libarchive/test/test_compat_mac.c212
-rw-r--r--contrib/libarchive/libarchive/test/test_compat_pax_libarchive_2x.c146
-rw-r--r--contrib/libarchive/libarchive/test/test_compat_pax_libarchive_2x.tar.Z.uu15
-rw-r--r--contrib/libarchive/libarchive/test/test_compat_solaris_pax_sparse.c188
-rw-r--r--contrib/libarchive/libarchive/test/test_compat_solaris_pax_sparse_1.pax.Z.uu53
-rw-r--r--contrib/libarchive/libarchive/test/test_compat_solaris_pax_sparse_2.pax.Z.uu53
-rw-r--r--contrib/libarchive/libarchive/test/test_compat_solaris_tar_acl.c4
-rw-r--r--contrib/libarchive/libarchive/test/test_compat_tar_hardlink.c8
-rw-r--r--contrib/libarchive/libarchive/test/test_compat_xz.c8
-rw-r--r--contrib/libarchive/libarchive/test/test_compat_zip.c367
-rw-r--r--contrib/libarchive/libarchive/test/test_compat_zip_2.zip.uu2
-rw-r--r--contrib/libarchive/libarchive/test/test_compat_zip_3.zip.uu18
-rw-r--r--contrib/libarchive/libarchive/test/test_compat_zip_4.zip.uu25
-rw-r--r--contrib/libarchive/libarchive/test/test_compat_zip_5.zip.uu242
-rw-r--r--contrib/libarchive/libarchive/test/test_compat_zip_6.zip.uu10
-rw-r--r--contrib/libarchive/libarchive/test/test_compat_zip_7.xps.uu357
-rw-r--r--contrib/libarchive/libarchive/test/test_empty_write.c12
-rw-r--r--contrib/libarchive/libarchive/test/test_entry.c157
-rw-r--r--contrib/libarchive/libarchive/test/test_extattr_freebsd.c5
-rw-r--r--contrib/libarchive/libarchive/test/test_filter_count.c75
-rw-r--r--contrib/libarchive/libarchive/test/test_fuzz.c67
-rw-r--r--contrib/libarchive/libarchive/test/test_fuzz.cab.uu49
-rw-r--r--contrib/libarchive/libarchive/test/test_fuzz.lzh.uu152
-rw-r--r--contrib/libarchive/libarchive/test/test_gnutar_filename_encoding.c414
-rw-r--r--contrib/libarchive/libarchive/test/test_open_failure.c38
-rw-r--r--contrib/libarchive/libarchive/test/test_open_fd.c10
-rw-r--r--contrib/libarchive/libarchive/test/test_open_file.c6
-rw-r--r--contrib/libarchive/libarchive/test/test_open_filename.c103
-rw-r--r--contrib/libarchive/libarchive/test/test_pax_filename_encoding.c296
-rw-r--r--contrib/libarchive/libarchive/test/test_read_compress_program.c12
-rw-r--r--contrib/libarchive/libarchive/test/test_read_data_large.c32
-rw-r--r--contrib/libarchive/libarchive/test/test_read_disk.c6
-rw-r--r--contrib/libarchive/libarchive/test/test_read_disk_directory_traversals.c1060
-rw-r--r--contrib/libarchive/libarchive/test/test_read_disk_entry_from_file.c8
-rw-r--r--contrib/libarchive/libarchive/test/test_read_extract.c10
-rw-r--r--contrib/libarchive/libarchive/test/test_read_file_nonexistent.c2
-rw-r--r--contrib/libarchive/libarchive/test/test_read_format_7zip.c703
-rw-r--r--contrib/libarchive/libarchive/test/test_read_format_7zip_bcj2_bzip2.7z.uu319
-rw-r--r--contrib/libarchive/libarchive/test/test_read_format_7zip_bcj2_copy_1.7z.uu614
-rw-r--r--contrib/libarchive/libarchive/test/test_read_format_7zip_bcj2_copy_2.7z.uu615
-rw-r--r--contrib/libarchive/libarchive/test/test_read_format_7zip_bcj2_copy_lzma.7z.uu568
-rw-r--r--contrib/libarchive/libarchive/test/test_read_format_7zip_bcj2_deflate.7z.uu313
-rw-r--r--contrib/libarchive/libarchive/test/test_read_format_7zip_bcj2_lzma1_1.7z.uu287
-rw-r--r--contrib/libarchive/libarchive/test/test_read_format_7zip_bcj2_lzma1_2.7z.uu240
-rw-r--r--contrib/libarchive/libarchive/test/test_read_format_7zip_bcj2_lzma2_1.7z.uu287
-rw-r--r--contrib/libarchive/libarchive/test/test_read_format_7zip_bcj2_lzma2_2.7z.uu240
-rw-r--r--contrib/libarchive/libarchive/test/test_read_format_7zip_bcj_bzip2.7z.uu281
-rw-r--r--contrib/libarchive/libarchive/test/test_read_format_7zip_bcj_copy.7z.uu613
-rw-r--r--contrib/libarchive/libarchive/test/test_read_format_7zip_bcj_deflate.7z.uu275
-rw-r--r--contrib/libarchive/libarchive/test/test_read_format_7zip_bcj_lzma1.7z.uu245
-rw-r--r--contrib/libarchive/libarchive/test/test_read_format_7zip_bcj_lzma2.7z.uu245
-rw-r--r--contrib/libarchive/libarchive/test/test_read_format_7zip_bzip2.7z.uu37
-rw-r--r--contrib/libarchive/libarchive/test/test_read_format_7zip_copy.7z.uu7
-rw-r--r--contrib/libarchive/libarchive/test/test_read_format_7zip_copy_2.7z.uu11
-rw-r--r--contrib/libarchive/libarchive/test/test_read_format_7zip_deflate.7z.uu36
-rw-r--r--contrib/libarchive/libarchive/test/test_read_format_7zip_delta_lzma1.7z.uu280
-rw-r--r--contrib/libarchive/libarchive/test/test_read_format_7zip_delta_lzma2.7z.uu280
-rw-r--r--contrib/libarchive/libarchive/test/test_read_format_7zip_empty_archive.7z.uu4
-rw-r--r--contrib/libarchive/libarchive/test/test_read_format_7zip_empty_file.7z.uu5
-rw-r--r--contrib/libarchive/libarchive/test/test_read_format_7zip_lzma1.7z.uu37
-rw-r--r--contrib/libarchive/libarchive/test/test_read_format_7zip_lzma1_2.7z.uu8
-rw-r--r--contrib/libarchive/libarchive/test/test_read_format_7zip_lzma1_lzma2.7z.uu10
-rw-r--r--contrib/libarchive/libarchive/test/test_read_format_7zip_lzma2.7z.uu37
-rw-r--r--contrib/libarchive/libarchive/test/test_read_format_7zip_ppmd.7z.uu235
-rw-r--r--contrib/libarchive/libarchive/test/test_read_format_7zip_symbolic_name.7z.uu8
-rw-r--r--contrib/libarchive/libarchive/test/test_read_format_ar.c13
-rw-r--r--contrib/libarchive/libarchive/test/test_read_format_cab.c281
-rw-r--r--contrib/libarchive/libarchive/test/test_read_format_cab_1.cab.uu9
-rw-r--r--contrib/libarchive/libarchive/test/test_read_format_cab_2.cab.uu9
-rw-r--r--contrib/libarchive/libarchive/test/test_read_format_cab_3.cab.uu10
-rw-r--r--contrib/libarchive/libarchive/test/test_read_format_cab_filename.c164
-rw-r--r--contrib/libarchive/libarchive/test/test_read_format_cab_filename_cp932.cab.uu7
-rw-r--r--contrib/libarchive/libarchive/test/test_read_format_cpio_afio.c115
-rw-r--r--contrib/libarchive/libarchive/test/test_read_format_cpio_bin.c21
-rw-r--r--contrib/libarchive/libarchive/test/test_read_format_cpio_bin_Z.c9
-rw-r--r--contrib/libarchive/libarchive/test/test_read_format_cpio_bin_be.c4
-rw-r--r--contrib/libarchive/libarchive/test/test_read_format_cpio_bin_bz2.c6
-rw-r--r--contrib/libarchive/libarchive/test/test_read_format_cpio_bin_gz.c10
-rw-r--r--contrib/libarchive/libarchive/test/test_read_format_cpio_bin_lzip.c61
-rw-r--r--contrib/libarchive/libarchive/test/test_read_format_cpio_bin_lzma.c8
-rw-r--r--contrib/libarchive/libarchive/test/test_read_format_cpio_bin_xz.c8
-rw-r--r--contrib/libarchive/libarchive/test/test_read_format_cpio_filename.c874
-rw-r--r--contrib/libarchive/libarchive/test/test_read_format_cpio_filename_cp866.cpio.uu15
-rw-r--r--contrib/libarchive/libarchive/test/test_read_format_cpio_filename_eucjp.cpio.uu15
-rw-r--r--contrib/libarchive/libarchive/test/test_read_format_cpio_filename_koi8r.cpio.uu15
-rw-r--r--contrib/libarchive/libarchive/test/test_read_format_cpio_filename_utf8_jp.cpio.uu15
-rw-r--r--contrib/libarchive/libarchive/test/test_read_format_cpio_filename_utf8_ru.cpio.uu15
-rw-r--r--contrib/libarchive/libarchive/test/test_read_format_cpio_odc.c10
-rw-r--r--contrib/libarchive/libarchive/test/test_read_format_cpio_svr4_bzip2_rpm.c8
-rw-r--r--contrib/libarchive/libarchive/test/test_read_format_cpio_svr4_gzip.c8
-rw-r--r--contrib/libarchive/libarchive/test/test_read_format_cpio_svr4_gzip_rpm.c8
-rw-r--r--contrib/libarchive/libarchive/test/test_read_format_cpio_svr4c_Z.c8
-rw-r--r--contrib/libarchive/libarchive/test/test_read_format_empty.c10
-rw-r--r--contrib/libarchive/libarchive/test/test_read_format_gtar_filename.c512
-rw-r--r--contrib/libarchive/libarchive/test/test_read_format_gtar_filename_cp866.tar.Z.uu10
-rw-r--r--contrib/libarchive/libarchive/test/test_read_format_gtar_filename_eucjp.tar.Z.uu10
-rw-r--r--contrib/libarchive/libarchive/test/test_read_format_gtar_filename_koi8r.tar.Z.uu10
-rw-r--r--contrib/libarchive/libarchive/test/test_read_format_gtar_gz.c9
-rw-r--r--contrib/libarchive/libarchive/test/test_read_format_gtar_lzma.c12
-rw-r--r--contrib/libarchive/libarchive/test/test_read_format_gtar_sparse.c26
-rw-r--r--contrib/libarchive/libarchive/test/test_read_format_iso_Z.c16
-rw-r--r--contrib/libarchive/libarchive/test/test_read_format_iso_joliet_by_nero.iso.Z.uu64
-rw-r--r--contrib/libarchive/libarchive/test/test_read_format_iso_multi_extent.c8
-rw-r--r--contrib/libarchive/libarchive/test/test_read_format_iso_xorriso.c213
-rw-r--r--contrib/libarchive/libarchive/test/test_read_format_iso_xorriso.iso.Z.uu61
-rw-r--r--contrib/libarchive/libarchive/test/test_read_format_isojoliet_bz2.c12
-rw-r--r--contrib/libarchive/libarchive/test/test_read_format_isojoliet_long.c10
-rw-r--r--contrib/libarchive/libarchive/test/test_read_format_isojoliet_rr.c10
-rw-r--r--contrib/libarchive/libarchive/test/test_read_format_isojoliet_versioned.c83
-rw-r--r--contrib/libarchive/libarchive/test/test_read_format_isorr_bz2.c8
-rw-r--r--contrib/libarchive/libarchive/test/test_read_format_isorr_ce.c8
-rw-r--r--contrib/libarchive/libarchive/test/test_read_format_isorr_new_bz2.c8
-rw-r--r--contrib/libarchive/libarchive/test/test_read_format_isorr_rr_moved.c8
-rw-r--r--contrib/libarchive/libarchive/test/test_read_format_isozisofs_bz2.c8
-rw-r--r--contrib/libarchive/libarchive/test/test_read_format_lha.c278
-rw-r--r--contrib/libarchive/libarchive/test/test_read_format_lha_filename.c218
-rw-r--r--contrib/libarchive/libarchive/test/test_read_format_lha_filename_cp932.lzh.uu7
-rw-r--r--contrib/libarchive/libarchive/test/test_read_format_lha_header0.lzh.uu11
-rw-r--r--contrib/libarchive/libarchive/test/test_read_format_lha_header1.lzh.uu13
-rw-r--r--contrib/libarchive/libarchive/test/test_read_format_lha_header2.lzh.uu13
-rw-r--r--contrib/libarchive/libarchive/test/test_read_format_lha_header3.lzh.uu16
-rw-r--r--contrib/libarchive/libarchive/test/test_read_format_lha_lh0.lzh.uu13
-rw-r--r--contrib/libarchive/libarchive/test/test_read_format_lha_lh6.lzh.uu13
-rw-r--r--contrib/libarchive/libarchive/test/test_read_format_lha_lh7.lzh.uu13
-rw-r--r--contrib/libarchive/libarchive/test/test_read_format_lha_withjunk.lzh.uu13
-rw-r--r--contrib/libarchive/libarchive/test/test_read_format_mtree.c175
-rw-r--r--contrib/libarchive/libarchive/test/test_read_format_mtree.mtree.uu10
-rw-r--r--contrib/libarchive/libarchive/test/test_read_format_mtree_nomagic.mtree.uu11
-rw-r--r--contrib/libarchive/libarchive/test/test_read_format_pax_bz2.c5
-rw-r--r--contrib/libarchive/libarchive/test/test_read_format_rar.c867
-rw-r--r--contrib/libarchive/libarchive/test/test_read_format_rar.rar.uu11
-rw-r--r--contrib/libarchive/libarchive/test/test_read_format_rar_binary_data.rar.uu24041
-rw-r--r--contrib/libarchive/libarchive/test/test_read_format_rar_compress_best.rar.uu274
-rw-r--r--contrib/libarchive/libarchive/test/test_read_format_rar_compress_normal.rar.uu328
-rw-r--r--contrib/libarchive/libarchive/test/test_read_format_rar_multi_lzss_blocks.rar.uu444
-rw-r--r--contrib/libarchive/libarchive/test/test_read_format_rar_noeof.rar.uu5
-rw-r--r--contrib/libarchive/libarchive/test/test_read_format_rar_ppmd_lzss_conversion.rar.uu3930
-rw-r--r--contrib/libarchive/libarchive/test/test_read_format_rar_sfx.exe.uu2215
-rw-r--r--contrib/libarchive/libarchive/test/test_read_format_rar_subblock.rar.uu7
-rw-r--r--contrib/libarchive/libarchive/test/test_read_format_rar_unicode.rar.uu17
-rw-r--r--contrib/libarchive/libarchive/test/test_read_format_rar_windows.rar.uu22
-rw-r--r--contrib/libarchive/libarchive/test/test_read_format_raw.c12
-rw-r--r--contrib/libarchive/libarchive/test/test_read_format_tar.c20
-rw-r--r--contrib/libarchive/libarchive/test/test_read_format_tar_empty_filename.c8
-rw-r--r--contrib/libarchive/libarchive/test/test_read_format_tar_filename.c363
-rw-r--r--contrib/libarchive/libarchive/test/test_read_format_tar_filename_koi8r.tar.Z.uu14
-rw-r--r--contrib/libarchive/libarchive/test/test_read_format_tbz.c7
-rw-r--r--contrib/libarchive/libarchive/test/test_read_format_tgz.c9
-rw-r--r--contrib/libarchive/libarchive/test/test_read_format_tlz.c9
-rw-r--r--contrib/libarchive/libarchive/test/test_read_format_txz.c9
-rw-r--r--contrib/libarchive/libarchive/test/test_read_format_tz.c9
-rw-r--r--contrib/libarchive/libarchive/test/test_read_format_ustar_filename.c512
-rw-r--r--contrib/libarchive/libarchive/test/test_read_format_ustar_filename_cp866.tar.Z.uu8
-rw-r--r--contrib/libarchive/libarchive/test/test_read_format_ustar_filename_eucjp.tar.Z.uu9
-rw-r--r--contrib/libarchive/libarchive/test/test_read_format_ustar_filename_koi8r.tar.Z.uu8
-rw-r--r--contrib/libarchive/libarchive/test/test_read_format_xar.c19
-rw-r--r--contrib/libarchive/libarchive/test/test_read_format_zip.c283
-rw-r--r--contrib/libarchive/libarchive/test/test_read_format_zip.zip.uu2
-rw-r--r--contrib/libarchive/libarchive/test/test_read_format_zip_filename.c1162
-rw-r--r--contrib/libarchive/libarchive/test/test_read_format_zip_filename_cp866.zip.uu10
-rw-r--r--contrib/libarchive/libarchive/test/test_read_format_zip_filename_cp932.zip.uu9
-rw-r--r--contrib/libarchive/libarchive/test/test_read_format_zip_filename_koi8r.zip.uu10
-rw-r--r--contrib/libarchive/libarchive/test/test_read_format_zip_filename_utf8_jp.zip.uu15
-rw-r--r--contrib/libarchive/libarchive/test/test_read_format_zip_filename_utf8_ru.zip.uu11
-rw-r--r--contrib/libarchive/libarchive/test/test_read_format_zip_filename_utf8_ru2.zip.uu11
-rw-r--r--contrib/libarchive/libarchive/test/test_read_format_zip_length_at_end.zip.uu8
-rw-r--r--contrib/libarchive/libarchive/test/test_read_format_zip_symlink.zip.uu10
-rw-r--r--contrib/libarchive/libarchive/test/test_read_format_zip_ux.zip.uu7
-rw-r--r--contrib/libarchive/libarchive/test/test_read_large.c17
-rw-r--r--contrib/libarchive/libarchive/test/test_read_pax_truncated.c166
-rw-r--r--contrib/libarchive/libarchive/test/test_read_position.c84
-rw-r--r--contrib/libarchive/libarchive/test/test_read_truncated.c72
-rw-r--r--contrib/libarchive/libarchive/test/test_read_truncated_filter.c132
-rw-r--r--contrib/libarchive/libarchive/test/test_read_uu.c71
-rw-r--r--contrib/libarchive/libarchive/test/test_sparse_basic.c464
-rw-r--r--contrib/libarchive/libarchive/test/test_tar_filenames.c30
-rw-r--r--contrib/libarchive/libarchive/test/test_tar_large.c37
-rw-r--r--contrib/libarchive/libarchive/test/test_ustar_filename_encoding.c414
-rw-r--r--contrib/libarchive/libarchive/test/test_ustar_filenames.c18
-rw-r--r--contrib/libarchive/libarchive/test/test_write_compress.c37
-rw-r--r--contrib/libarchive/libarchive/test/test_write_compress_bzip2.c92
-rw-r--r--contrib/libarchive/libarchive/test/test_write_compress_gzip.c90
-rw-r--r--contrib/libarchive/libarchive/test/test_write_compress_lzip.c247
-rw-r--r--contrib/libarchive/libarchive/test/test_write_compress_lzma.c85
-rw-r--r--contrib/libarchive/libarchive/test/test_write_compress_program.c29
-rw-r--r--contrib/libarchive/libarchive/test/test_write_compress_xz.c84
-rw-r--r--contrib/libarchive/libarchive/test/test_write_disk.c107
-rw-r--r--contrib/libarchive/libarchive/test/test_write_disk_failures.c13
-rw-r--r--contrib/libarchive/libarchive/test/test_write_disk_hardlink.c12
-rw-r--r--contrib/libarchive/libarchive/test/test_write_disk_lookup.c156
-rw-r--r--contrib/libarchive/libarchive/test/test_write_disk_perms.c10
-rw-r--r--contrib/libarchive/libarchive/test/test_write_disk_secure.c8
-rw-r--r--contrib/libarchive/libarchive/test/test_write_disk_sparse.c4
-rw-r--r--contrib/libarchive/libarchive/test/test_write_disk_symlink.c2
-rw-r--r--contrib/libarchive/libarchive/test/test_write_disk_times.c2
-rw-r--r--contrib/libarchive/libarchive/test/test_write_format_7zip.c816
-rw-r--r--contrib/libarchive/libarchive/test/test_write_format_ar.c51
-rw-r--r--contrib/libarchive/libarchive/test/test_write_format_cpio.c122
-rw-r--r--contrib/libarchive/libarchive/test/test_write_format_cpio_empty.c8
-rw-r--r--contrib/libarchive/libarchive/test/test_write_format_cpio_newc.c7
-rw-r--r--contrib/libarchive/libarchive/test/test_write_format_cpio_odc.c6
-rw-r--r--contrib/libarchive/libarchive/test/test_write_format_gnutar.c236
-rw-r--r--contrib/libarchive/libarchive/test/test_write_format_iso9660.c937
-rw-r--r--contrib/libarchive/libarchive/test/test_write_format_iso9660_boot.c276
-rw-r--r--contrib/libarchive/libarchive/test/test_write_format_iso9660_empty.c202
-rw-r--r--contrib/libarchive/libarchive/test/test_write_format_iso9660_filename.c468
-rw-r--r--contrib/libarchive/libarchive/test/test_write_format_iso9660_zisofs.c819
-rw-r--r--contrib/libarchive/libarchive/test/test_write_format_mtree.c32
-rw-r--r--contrib/libarchive/libarchive/test/test_write_format_mtree_fflags.c134
-rw-r--r--contrib/libarchive/libarchive/test/test_write_format_pax.c59
-rw-r--r--contrib/libarchive/libarchive/test/test_write_format_shar_empty.c8
-rw-r--r--contrib/libarchive/libarchive/test/test_write_format_tar.c87
-rw-r--r--contrib/libarchive/libarchive/test/test_write_format_tar_empty.c26
-rw-r--r--contrib/libarchive/libarchive/test/test_write_format_tar_sparse.c305
-rw-r--r--contrib/libarchive/libarchive/test/test_write_format_tar_ustar.c37
-rw-r--r--contrib/libarchive/libarchive/test/test_write_format_xar.c312
-rw-r--r--contrib/libarchive/libarchive/test/test_write_format_xar_empty.c120
-rw-r--r--contrib/libarchive/libarchive/test/test_write_format_zip.c189
-rw-r--r--contrib/libarchive/libarchive/test/test_write_format_zip_empty.c36
-rw-r--r--contrib/libarchive/libarchive/test/test_write_format_zip_no_compression.c48
-rw-r--r--contrib/libarchive/libarchive/test/test_write_open_memory.c42
-rw-r--r--contrib/libarchive/libarchive/test/test_zip_filename_encoding.c543
263 files changed, 62956 insertions, 1852 deletions
diff --git a/contrib/libarchive/libarchive/test/main.c b/contrib/libarchive/libarchive/test/main.c
index 0cd16a0e0d0a..35e48a845acf 100644
--- a/contrib/libarchive/libarchive/test/main.c
+++ b/contrib/libarchive/libarchive/test/main.c
@@ -24,8 +24,18 @@
*/
#include "test.h"
+#ifdef HAVE_SYS_TIME_H
+#include <sys/time.h>
+#endif
#include <errno.h>
+#ifdef HAVE_ICONV_H
+#include <iconv.h>
+#endif
+#include <limits.h>
#include <locale.h>
+#ifdef HAVE_SIGNAL_H
+#include <signal.h>
+#endif
#include <stdarg.h>
#include <time.h>
@@ -42,7 +52,8 @@ __FBSDID("$FreeBSD$");
#undef PROGRAM /* Testing a library, not a program. */
#define LIBRARY "libarchive"
#define EXTRA_DUMP(x) archive_error_string((struct archive *)(x))
-#define EXTRA_VERSION archive_version()
+#define EXTRA_ERRNO(x) archive_errno((struct archive *)(x))
+#define EXTRA_VERSION archive_version_string()
/*
*
@@ -77,6 +88,7 @@ __FBSDID("$FreeBSD$");
#endif
#if !defined(__BORLANDC__)
#define access _access
+#undef chdir
#define chdir _chdir
#endif
#ifndef fileno
@@ -149,7 +161,7 @@ my_GetFileInformationByName(const char *path, BY_HANDLE_FILE_INFORMATION *bhfi)
memset(bhfi, 0, sizeof(*bhfi));
h = CreateFile(path, FILE_READ_ATTRIBUTES, 0, NULL,
- OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
+ OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL);
if (h == INVALID_HANDLE_VALUE)
return (0);
r = GetFileInformationByHandle(h, bhfi);
@@ -178,6 +190,8 @@ invalid_parameter_handler(const wchar_t * expression,
static int dump_on_failure = 0;
/* Default is to remove temp dirs and log data for successful tests. */
static int keep_temp_files = 0;
+/* Default is to run the specified tests once and report errors. */
+static int until_failure = 0;
/* Default is to just report pass/fail for each test. */
static int verbosity = 0;
#define VERBOSITY_SUMMARY_ONLY -1 /* -q */
@@ -235,10 +249,14 @@ void
failure(const char *fmt, ...)
{
va_list ap;
- va_start(ap, fmt);
- vsprintf(msgbuff, fmt, ap);
- va_end(ap);
- nextmsg = msgbuff;
+ if (fmt == NULL) {
+ nextmsg = NULL;
+ } else {
+ va_start(ap, fmt);
+ vsprintf(msgbuff, fmt, ap);
+ va_end(ap);
+ nextmsg = msgbuff;
+ }
}
/*
@@ -250,15 +268,14 @@ failure(const char *fmt, ...)
* pass __FILE__, __LINE__ directly into the function instead of using
* this hook. I suspect this machinery is used so rarely that we
* would be better off just removing it entirely. That would simplify
- * the code here noticably.
+ * the code here noticeably.
*/
-static const char *test_filename;
-static int test_line;
-static void *test_extra;
-void assertion_setup(const char *filename, int line)
+static const char *skipping_filename;
+static int skipping_line;
+void skipping_setup(const char *filename, int line)
{
- test_filename = filename;
- test_line = line;
+ skipping_filename = filename;
+ skipping_line = line;
}
/* Called at the beginning of each assert() function. */
@@ -285,6 +302,7 @@ static struct line {
int count;
int skip;
} failed_lines[10000];
+const char *failed_filename;
/* Count this failure, setup up log destination and handle initial report. */
static void
@@ -294,7 +312,7 @@ failure_start(const char *filename, int line, const char *fmt, ...)
/* Record another failure for this line. */
++failures;
- /* test_filename = filename; */
+ failed_filename = filename;
failed_lines[line].count++;
/* Determine whether to log header to console. */
@@ -339,8 +357,10 @@ failure_finish(void *extra)
{
(void)extra; /* UNUSED (maybe) */
#ifdef EXTRA_DUMP
- if (extra != NULL)
+ if (extra != NULL) {
+ logprintf(" errno: %d\n", EXTRA_ERRNO(extra));
logprintf(" detail: %s\n", EXTRA_DUMP(extra));
+ }
#endif
if (dump_on_failure) {
@@ -361,12 +381,15 @@ test_skipping(const char *fmt, ...)
va_start(ap, fmt);
vsprintf(buff, fmt, ap);
va_end(ap);
+ /* Use failure() message if set. */
+ msg = nextmsg;
+ nextmsg = NULL;
/* failure_start() isn't quite right, but is awfully convenient. */
- failure_start(test_filename, test_line, "SKIPPING: %s", buff);
+ failure_start(skipping_filename, skipping_line, "SKIPPING: %s", buff);
--failures; /* Undo failures++ in failure_start() */
/* Don't failure_finish() here. */
/* Mark as skip, so doesn't count as failed test. */
- failed_lines[test_line].skip = 1;
+ failed_lines[skipping_line].skip = 1;
++skips;
}
@@ -417,13 +440,102 @@ assertion_equal_int(const char *file, int line,
return (0);
}
-static void strdump(const char *e, const char *p)
+/*
+ * Utility to convert a single UTF-8 sequence.
+ */
+static int
+_utf8_to_unicode(uint32_t *pwc, const char *s, size_t n)
+{
+ static const char utf8_count[256] = {
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,/* 00 - 0F */
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,/* 10 - 1F */
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,/* 20 - 2F */
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,/* 30 - 3F */
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,/* 40 - 4F */
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,/* 50 - 5F */
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,/* 60 - 6F */
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,/* 70 - 7F */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,/* 80 - 8F */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,/* 90 - 9F */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,/* A0 - AF */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,/* B0 - BF */
+ 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,/* C0 - CF */
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,/* D0 - DF */
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,/* E0 - EF */
+ 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 /* F0 - FF */
+ };
+ int ch;
+ int cnt;
+ uint32_t wc;
+
+ *pwc = 0;
+
+ /* Sanity check. */
+ if (n == 0)
+ return (0);
+ /*
+ * Decode 1-4 bytes depending on the value of the first byte.
+ */
+ ch = (unsigned char)*s;
+ if (ch == 0)
+ return (0); /* Standard: return 0 for end-of-string. */
+ cnt = utf8_count[ch];
+
+ /* Invalide sequence or there are not plenty bytes. */
+ if (n < (size_t)cnt)
+ return (-1);
+
+ /* Make a Unicode code point from a single UTF-8 sequence. */
+ switch (cnt) {
+ case 1: /* 1 byte sequence. */
+ *pwc = ch & 0x7f;
+ return (cnt);
+ case 2: /* 2 bytes sequence. */
+ if ((s[1] & 0xc0) != 0x80) return (-1);
+ *pwc = ((ch & 0x1f) << 6) | (s[1] & 0x3f);
+ return (cnt);
+ case 3: /* 3 bytes sequence. */
+ if ((s[1] & 0xc0) != 0x80) return (-1);
+ if ((s[2] & 0xc0) != 0x80) return (-1);
+ wc = ((ch & 0x0f) << 12)
+ | ((s[1] & 0x3f) << 6)
+ | (s[2] & 0x3f);
+ if (wc < 0x800)
+ return (-1);/* Overlong sequence. */
+ break;
+ case 4: /* 4 bytes sequence. */
+ if (n < 4)
+ return (-1);
+ if ((s[1] & 0xc0) != 0x80) return (-1);
+ if ((s[2] & 0xc0) != 0x80) return (-1);
+ if ((s[3] & 0xc0) != 0x80) return (-1);
+ wc = ((ch & 0x07) << 18)
+ | ((s[1] & 0x3f) << 12)
+ | ((s[2] & 0x3f) << 6)
+ | (s[3] & 0x3f);
+ if (wc < 0x10000)
+ return (-1);/* Overlong sequence. */
+ break;
+ default:
+ return (-1);
+ }
+
+ /* The code point larger than 0x10FFFF is not leagal
+ * Unicode values. */
+ if (wc > 0x10FFFF)
+ return (-1);
+ /* Correctly gets a Unicode, returns used bytes. */
+ *pwc = wc;
+ return (cnt);
+}
+
+static void strdump(const char *e, const char *p, int ewidth, int utf8)
{
const char *q = p;
- logprintf(" %s = ", e);
+ logprintf(" %*s = ", ewidth, e);
if (p == NULL) {
- logprintf("NULL");
+ logprintf("NULL\n");
return;
}
logprintf("\"");
@@ -442,7 +554,37 @@ static void strdump(const char *e, const char *p)
}
}
logprintf("\"");
- logprintf(" (length %d)\n", q == NULL ? -1 : (int)strlen(q));
+ logprintf(" (length %d)", q == NULL ? -1 : (int)strlen(q));
+
+ /*
+ * If the current string is UTF-8, dump its code points.
+ */
+ if (utf8) {
+ size_t len;
+ uint32_t uc;
+ int n;
+ int cnt = 0;
+
+ p = q;
+ len = strlen(p);
+ logprintf(" [");
+ while ((n = _utf8_to_unicode(&uc, p, len)) > 0) {
+ if (p != q)
+ logprintf(" ");
+ logprintf("%04X", uc);
+ p += n;
+ len -= n;
+ cnt++;
+ }
+ logprintf("]");
+ logprintf(" (count %d", cnt);
+ if (n < 0) {
+ logprintf(",unknown %d bytes", len);
+ }
+ logprintf(")");
+
+ }
+ logprintf("\n");
}
/* Verify two strings are equal, dump them if not. */
@@ -450,14 +592,20 @@ int
assertion_equal_string(const char *file, int line,
const char *v1, const char *e1,
const char *v2, const char *e2,
- void *extra)
+ void *extra, int utf8)
{
+ int l1, l2;
+
assertion_count(file, line);
if (v1 == v2 || (v1 != NULL && v2 != NULL && strcmp(v1, v2) == 0))
return (1);
failure_start(file, line, "%s != %s", e1, e2);
- strdump(e1, v1);
- strdump(e2, v2);
+ l1 = strlen(e1);
+ l2 = strlen(e2);
+ if (l1 < l2)
+ l1 = l2;
+ strdump(e1, v1, l1, utf8);
+ strdump(e2, v2, l1, utf8);
failure_finish(extra);
return (0);
}
@@ -509,7 +657,9 @@ assertion_equal_wstring(const char *file, int line,
void *extra)
{
assertion_count(file, line);
- if (v1 == v2 || wcscmp(v1, v2) == 0)
+ if (v1 == v2)
+ return (1);
+ if (v1 != NULL && v2 != NULL && wcscmp(v1, v2) == 0)
return (1);
failure_start(file, line, "%s != %s", e1, e2);
wcsdump(e1, v1);
@@ -588,9 +738,9 @@ assertion_equal_mem(const char *file, int line,
offset += 16;
}
logprintf(" Dump of %s\n", e1);
- hexdump(v1, v2, l < 64 ? l : 64, offset);
+ hexdump(v1, v2, l < 128 ? l : 128, offset);
logprintf(" Dump of %s\n", e2);
- hexdump(v2, v1, l < 64 ? l : 64, offset);
+ hexdump(v2, v1, l < 128 ? l : 128, offset);
logprintf("\n");
failure_finish(extra);
return (0);
@@ -598,29 +748,24 @@ assertion_equal_mem(const char *file, int line,
/* Verify that the named file exists and is empty. */
int
-assertion_empty_file(const char *f1fmt, ...)
+assertion_empty_file(const char *filename, int line, const char *f1)
{
char buff[1024];
- char f1[1024];
struct stat st;
- va_list ap;
ssize_t s;
FILE *f;
- assertion_count(test_filename, test_line);
- va_start(ap, f1fmt);
- vsprintf(f1, f1fmt, ap);
- va_end(ap);
+ assertion_count(filename, line);
if (stat(f1, &st) != 0) {
- failure_start(test_filename, test_line, "Stat failed: %s", f1);
+ failure_start(filename, line, "Stat failed: %s", f1);
failure_finish(NULL);
return (0);
}
if (st.st_size == 0)
return (1);
- failure_start(test_filename, test_line, "File should be empty: %s", f1);
+ failure_start(filename, line, "File should be empty: %s", f1);
logprintf(" File size: %d\n", (int)st.st_size);
logprintf(" Contents:\n");
f = fopen(f1, "rb");
@@ -639,24 +784,19 @@ assertion_empty_file(const char *f1fmt, ...)
/* Verify that the named file exists and is not empty. */
int
-assertion_non_empty_file(const char *f1fmt, ...)
+assertion_non_empty_file(const char *filename, int line, const char *f1)
{
- char f1[1024];
struct stat st;
- va_list ap;
- assertion_count(test_filename, test_line);
- va_start(ap, f1fmt);
- vsprintf(f1, f1fmt, ap);
- va_end(ap);
+ assertion_count(filename, line);
if (stat(f1, &st) != 0) {
- failure_start(test_filename, test_line, "Stat failed: %s", f1);
+ failure_start(filename, line, "Stat failed: %s", f1);
failure_finish(NULL);
return (0);
}
if (st.st_size == 0) {
- failure_start(test_filename, test_line, "File empty: %s", f1);
+ failure_start(filename, line, "File empty: %s", f1);
failure_finish(NULL);
return (0);
}
@@ -666,19 +806,14 @@ assertion_non_empty_file(const char *f1fmt, ...)
/* Verify that two files have the same contents. */
/* TODO: hexdump the first bytes that actually differ. */
int
-assertion_equal_file(const char *fn1, const char *f2pattern, ...)
+assertion_equal_file(const char *filename, int line, const char *fn1, const char *fn2)
{
- char fn2[1024];
- va_list ap;
char buff1[1024];
char buff2[1024];
FILE *f1, *f2;
int n1, n2;
- assertion_count(test_filename, test_line);
- va_start(ap, f2pattern);
- vsprintf(fn2, f2pattern, ap);
- va_end(ap);
+ assertion_count(filename, line);
f1 = fopen(fn1, "rb");
f2 = fopen(fn2, "rb");
@@ -697,24 +832,18 @@ assertion_equal_file(const char *fn1, const char *f2pattern, ...)
}
fclose(f1);
fclose(f2);
- failure_start(test_filename, test_line, "Files not identical");
+ failure_start(filename, line, "Files not identical");
logprintf(" file1=\"%s\"\n", fn1);
logprintf(" file2=\"%s\"\n", fn2);
- failure_finish(test_extra);
+ failure_finish(NULL);
return (0);
}
/* Verify that the named file does exist. */
int
-assertion_file_exists(const char *fpattern, ...)
+assertion_file_exists(const char *filename, int line, const char *f)
{
- char f[1024];
- va_list ap;
-
- assertion_count(test_filename, test_line);
- va_start(ap, fpattern);
- vsprintf(f, fpattern, ap);
- va_end(ap);
+ assertion_count(filename, line);
#if defined(_WIN32) && !defined(__CYGWIN__)
if (!_access(f, 0))
@@ -723,22 +852,16 @@ assertion_file_exists(const char *fpattern, ...)
if (!access(f, F_OK))
return (1);
#endif
- failure_start(test_filename, test_line, "File should exist: %s", f);
- failure_finish(test_extra);
+ failure_start(filename, line, "File should exist: %s", f);
+ failure_finish(NULL);
return (0);
}
/* Verify that the named file doesn't exist. */
int
-assertion_file_not_exists(const char *fpattern, ...)
+assertion_file_not_exists(const char *filename, int line, const char *f)
{
- char f[1024];
- va_list ap;
-
- assertion_count(test_filename, test_line);
- va_start(ap, fpattern);
- vsprintf(f, fpattern, ap);
- va_end(ap);
+ assertion_count(filename, line);
#if defined(_WIN32) && !defined(__CYGWIN__)
if (_access(f, 0))
@@ -747,31 +870,26 @@ assertion_file_not_exists(const char *fpattern, ...)
if (access(f, F_OK))
return (1);
#endif
- failure_start(test_filename, test_line, "File should not exist: %s", f);
- failure_finish(test_extra);
+ failure_start(filename, line, "File should not exist: %s", f);
+ failure_finish(NULL);
return (0);
}
/* Compare the contents of a file to a block of memory. */
int
-assertion_file_contents(const void *buff, int s, const char *fpattern, ...)
+assertion_file_contents(const char *filename, int line, const void *buff, int s, const char *fn)
{
- char fn[1024];
- va_list ap;
char *contents;
FILE *f;
int n;
- assertion_count(test_filename, test_line);
- va_start(ap, fpattern);
- vsprintf(fn, fpattern, ap);
- va_end(ap);
+ assertion_count(filename, line);
f = fopen(fn, "rb");
if (f == NULL) {
- failure_start(test_filename, test_line,
+ failure_start(filename, line,
"File should exist: %s", fn);
- failure_finish(test_extra);
+ failure_finish(NULL);
return (0);
}
contents = malloc(s * 2);
@@ -781,30 +899,36 @@ assertion_file_contents(const void *buff, int s, const char *fpattern, ...)
free(contents);
return (1);
}
- failure_start(test_filename, test_line, "File contents don't match");
+ failure_start(filename, line, "File contents don't match");
logprintf(" file=\"%s\"\n", fn);
if (n > 0)
hexdump(contents, buff, n > 512 ? 512 : n, 0);
else {
logprintf(" File empty, contents should be:\n");
- hexdump(buff, NULL, s > 512 ? 512 : n, 0);
+ hexdump(buff, NULL, s > 512 ? 512 : s, 0);
}
- failure_finish(test_extra);
+ failure_finish(NULL);
free(contents);
return (0);
}
/* Check the contents of a text file, being tolerant of line endings. */
int
-assertion_text_file_contents(const char *buff, const char *fn)
+assertion_text_file_contents(const char *filename, int line, const char *buff, const char *fn)
{
char *contents;
const char *btxt, *ftxt;
FILE *f;
int n, s;
- assertion_count(test_filename, test_line);
+ assertion_count(filename, line);
f = fopen(fn, "r");
+ if (f == NULL) {
+ failure_start(filename, line,
+ "File doesn't exist: %s", fn);
+ failure_finish(NULL);
+ return (0);
+ }
s = strlen(buff);
contents = malloc(s * 2 + 128);
n = fread(contents, 1, s * 2 + 128 - 1, f);
@@ -832,19 +956,122 @@ assertion_text_file_contents(const char *buff, const char *fn)
free(contents);
return (1);
}
- failure_start(test_filename, test_line, "Contents don't match");
+ failure_start(filename, line, "Contents don't match");
logprintf(" file=\"%s\"\n", fn);
- if (n > 0)
+ if (n > 0) {
hexdump(contents, buff, n, 0);
- else {
+ logprintf(" expected\n", fn);
+ hexdump(buff, contents, s, 0);
+ } else {
logprintf(" File empty, contents should be:\n");
hexdump(buff, NULL, s, 0);
}
- failure_finish(test_extra);
+ failure_finish(NULL);
free(contents);
return (0);
}
+/* Verify that a text file contains the specified lines, regardless of order */
+/* This could be more efficient if we sorted both sets of lines, etc, but
+ * since this is used only for testing and only ever deals with a dozen or so
+ * lines at a time, this relatively crude approach is just fine. */
+int
+assertion_file_contains_lines_any_order(const char *file, int line,
+ const char *pathname, const char *lines[])
+{
+ char *buff;
+ size_t buff_size;
+ size_t expected_count, actual_count, i, j;
+ char **expected;
+ char *p, **actual;
+ char c;
+ int expected_failure = 0, actual_failure = 0;
+
+ assertion_count(file, line);
+
+ buff = slurpfile(&buff_size, "%s", pathname);
+ if (buff == NULL) {
+ failure_start(pathname, line, "Can't read file: %s", pathname);
+ failure_finish(NULL);
+ return (0);
+ }
+
+ /* Make a copy of the provided lines and count up the expected file size. */
+ expected_count = 0;
+ for (i = 0; lines[i] != NULL; ++i) {
+ }
+ expected_count = i;
+ expected = malloc(sizeof(char *) * expected_count);
+ for (i = 0; lines[i] != NULL; ++i) {
+ expected[i] = strdup(lines[i]);
+ }
+
+ /* Break the file into lines */
+ actual_count = 0;
+ for (c = '\0', p = buff; p < buff + buff_size; ++p) {
+ if (*p == '\x0d' || *p == '\x0a')
+ *p = '\0';
+ if (c == '\0' && *p != '\0')
+ ++actual_count;
+ c = *p;
+ }
+ actual = malloc(sizeof(char *) * actual_count);
+ for (j = 0, p = buff; p < buff + buff_size; p += 1 + strlen(p)) {
+ if (*p != '\0') {
+ actual[j] = p;
+ ++j;
+ }
+ }
+
+ /* Erase matching lines from both lists */
+ for (i = 0; i < expected_count; ++i) {
+ if (expected[i] == NULL)
+ continue;
+ for (j = 0; j < actual_count; ++j) {
+ if (actual[j] == NULL)
+ continue;
+ if (strcmp(expected[i], actual[j]) == 0) {
+ free(expected[i]);
+ expected[i] = NULL;
+ actual[j] = NULL;
+ break;
+ }
+ }
+ }
+
+ /* If there's anything left, it's a failure */
+ for (i = 0; i < expected_count; ++i) {
+ if (expected[i] != NULL)
+ ++expected_failure;
+ }
+ for (j = 0; j < actual_count; ++j) {
+ if (actual[j] != NULL)
+ ++actual_failure;
+ }
+ if (expected_failure == 0 && actual_failure == 0) {
+ free(buff);
+ free(expected);
+ free(actual);
+ return (1);
+ }
+ failure_start(file, line, "File doesn't match: %s", pathname);
+ for (i = 0; i < expected_count; ++i) {
+ if (expected[i] != NULL) {
+ logprintf(" Expected but not present: %s\n", expected[i]);
+ free(expected[i]);
+ }
+ }
+ for (j = 0; j < actual_count; ++j) {
+ if (actual[j] != NULL)
+ logprintf(" Present but not expected: %s\n", actual[j]);
+ }
+ failure_finish(NULL);
+ free(buff);
+ free(expected);
+ free(actual);
+ return (0);
+}
+
/* Test that two paths point to the same file. */
/* As a side-effect, asserts that both files exist. */
static int
@@ -934,8 +1161,11 @@ assertion_file_time(const char *file, int line,
ftime.dwHighDateTime = 0;
assertion_count(file, line);
+ /* Note: FILE_FLAG_BACKUP_SEMANTICS applies to open
+ * a directory file. If not, CreateFile() will fail when
+ * the pathname is a directory. */
h = CreateFile(pathname, FILE_READ_ATTRIBUTES, 0, NULL,
- OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
+ OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL);
if (h == INVALID_HANDLE_VALUE) {
failure_start(file, line, "Can't access %s\n", pathname);
failure_finish(NULL);
@@ -1000,14 +1230,14 @@ assertion_file_time(const char *file, int line,
time_t now = time(NULL);
if (filet < now - 10 || filet > now + 1) {
failure_start(file, line,
- "File %s has %ctime %ld, %ld seconds ago\n",
+ "File %s has %ctime %lld, %lld seconds ago\n",
pathname, type, filet, now - filet);
failure_finish(NULL);
return (0);
}
} else if (filet != t || filet_nsec != nsec) {
failure_start(file, line,
- "File %s has %ctime %ld.%09ld, expected %ld.%09ld",
+ "File %s has %ctime %lld.%09lld, expected %lld.%09lld",
pathname, type, filet, filet_nsec, t, nsec);
failure_finish(NULL);
return (0);
@@ -1084,7 +1314,7 @@ assertion_file_nlinks(const char *file, int line,
assertion_count(file, line);
r = lstat(pathname, &st);
- if (r == 0 && st.st_nlink == nlinks)
+ if (r == 0 && (int)st.st_nlink == nlinks)
return (1);
failure_start(file, line, "File %s has %d links, expected %d",
pathname, st.st_nlink, nlinks);
@@ -1148,7 +1378,7 @@ assertion_is_dir(const char *file, int line, const char *pathname, int mode)
/* Windows doesn't handle permissions the same way as POSIX,
* so just ignore the mode tests. */
/* TODO: Can we do better here? */
- if (mode >= 0 && mode != (st.st_mode & 07777)) {
+ if (mode >= 0 && (mode_t)mode != (st.st_mode & 07777)) {
failure_start(file, line, "Dir %s has wrong mode", pathname);
logprintf(" Expected: 0%3o\n", mode);
logprintf(" Found: 0%3o\n", st.st_mode & 07777);
@@ -1181,7 +1411,7 @@ assertion_is_reg(const char *file, int line, const char *pathname, int mode)
/* Windows doesn't handle permissions the same way as POSIX,
* so just ignore the mode tests. */
/* TODO: Can we do better here? */
- if (mode >= 0 && mode != (st.st_mode & 07777)) {
+ if (mode >= 0 && (mode_t)mode != (st.st_mode & 07777)) {
failure_start(file, line, "File %s has wrong mode", pathname);
logprintf(" Expected: 0%3o\n", mode);
logprintf(" Found: 0%3o\n", st.st_mode & 07777);
@@ -1380,6 +1610,110 @@ assertion_umask(const char *file, int line, int mask)
return (1);
}
+/* Set times, report failures. */
+int
+assertion_utimes(const char *file, int line,
+ const char *pathname, long at, long at_nsec, long mt, long mt_nsec)
+{
+ int r;
+
+#if defined(_WIN32) && !defined(__CYGWIN__)
+#define WINTIME(sec, nsec) ((Int32x32To64(sec, 10000000) + EPOC_TIME)\
+ + (((nsec)/1000)*10))
+ HANDLE h;
+ ULARGE_INTEGER wintm;
+ FILETIME fatime, fmtime;
+ FILETIME *pat, *pmt;
+
+ assertion_count(file, line);
+ h = CreateFileA(pathname,GENERIC_READ | GENERIC_WRITE,
+ FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING,
+ FILE_FLAG_BACKUP_SEMANTICS, NULL);
+ if (h == INVALID_HANDLE_VALUE) {
+ failure_start(file, line, "Can't access %s\n", pathname);
+ failure_finish(NULL);
+ return (0);
+ }
+
+ if (at > 0 || at_nsec > 0) {
+ wintm.QuadPart = WINTIME(at, at_nsec);
+ fatime.dwLowDateTime = wintm.LowPart;
+ fatime.dwHighDateTime = wintm.HighPart;
+ pat = &fatime;
+ } else
+ pat = NULL;
+ if (mt > 0 || mt_nsec > 0) {
+ wintm.QuadPart = WINTIME(mt, mt_nsec);
+ fmtime.dwLowDateTime = wintm.LowPart;
+ fmtime.dwHighDateTime = wintm.HighPart;
+ pmt = &fmtime;
+ } else
+ pmt = NULL;
+ if (pat != NULL || pmt != NULL)
+ r = SetFileTime(h, NULL, pat, pmt);
+ else
+ r = 1;
+ CloseHandle(h);
+ if (r == 0) {
+ failure_start(file, line, "Can't SetFileTime %s\n", pathname);
+ failure_finish(NULL);
+ return (0);
+ }
+ return (1);
+#else /* defined(_WIN32) && !defined(__CYGWIN__) */
+ struct stat st;
+ struct timeval times[2];
+
+#if !defined(__FreeBSD__)
+ mt_nsec = at_nsec = 0; /* Generic POSIX only has whole seconds. */
+#endif
+ if (mt == 0 && mt_nsec == 0 && at == 0 && at_nsec == 0)
+ return (1);
+
+ r = lstat(pathname, &st);
+ if (r < 0) {
+ failure_start(file, line, "Can't stat %s\n", pathname);
+ failure_finish(NULL);
+ return (0);
+ }
+
+ if (mt == 0 && mt_nsec == 0) {
+ mt = st.st_mtime;
+#if defined(__FreeBSD__)
+ mt_nsec = st.st_mtimespec.tv_nsec;
+ /* FreeBSD generally only stores to microsecond res, so round. */
+ mt_nsec = (mt_nsec / 1000) * 1000;
+#endif
+ }
+ if (at == 0 && at_nsec == 0) {
+ at = st.st_atime;
+#if defined(__FreeBSD__)
+ at_nsec = st.st_atimespec.tv_nsec;
+ /* FreeBSD generally only stores to microsecond res, so round. */
+ at_nsec = (at_nsec / 1000) * 1000;
+#endif
+ }
+
+ times[1].tv_sec = mt;
+ times[1].tv_usec = mt_nsec / 1000;
+
+ times[0].tv_sec = at;
+ times[0].tv_usec = at_nsec / 1000;
+
+#ifdef HAVE_LUTIMES
+ r = lutimes(pathname, times);
+#else
+ r = utimes(pathname, times);
+#endif
+ if (r < 0) {
+ failure_start(file, line, "Can't utimes %s\n", pathname);
+ failure_finish(NULL);
+ return (0);
+ }
+ return (1);
+#endif /* defined(_WIN32) && !defined(__CYGWIN__) */
+}
+
/*
*
* UTILITIES for use by tests.
@@ -1605,6 +1939,27 @@ extract_reference_file(const char *name)
fclose(in);
}
+int
+is_LargeInode(const char *file)
+{
+#if defined(_WIN32) && !defined(__CYGWIN__)
+ BY_HANDLE_FILE_INFORMATION bhfi;
+ int r;
+
+ r = my_GetFileInformationByName(file, &bhfi);
+ if (r != 0)
+ return (0);
+ return (bhfi.nFileIndexHigh & 0x0000FFFFUL);
+#else
+ struct stat st;
+ int64_t ino;
+
+ if (stat(file, &st) < 0)
+ return (0);
+ ino = (int64_t)st.st_ino;
+ return (ino > 0xffffffff);
+#endif
+}
/*
*
* TEST management
@@ -1634,7 +1989,7 @@ struct { void (*func)(void); const char *name; int failures; } tests[] = {
* Summarize repeated failures in the just-completed test.
*/
static void
-test_summarize(const char *filename, int failed)
+test_summarize(int failed)
{
unsigned int i;
@@ -1653,9 +2008,10 @@ test_summarize(const char *filename, int failed)
for (i = 0; i < sizeof(failed_lines)/sizeof(failed_lines[0]); i++) {
if (failed_lines[i].count > 1 && !failed_lines[i].skip)
logprintf("%s:%d: Summary: Failed %d times\n",
- filename, i, failed_lines[i].count);
+ failed_filename, i, failed_lines[i].count);
}
/* Clear the failure history for the next file. */
+ failed_filename = NULL;
memset(failed_lines, 0, sizeof(failed_lines));
}
@@ -1665,6 +2021,7 @@ test_summarize(const char *filename, int failed)
static int
test_run(int i, const char *tmpdir)
{
+ char workdir[1024];
char logfilename[64];
int failures_before = failures;
int oldumask;
@@ -1691,11 +2048,12 @@ test_run(int i, const char *tmpdir)
logfile = fopen(logfilename, "w");
fprintf(logfile, "%s\n\n", tests[i].name);
/* Chdir() to a work dir for this specific test. */
- if (!assertMakeDir(tests[i].name, 0755)
- || !assertChdir(tests[i].name)) {
+ snprintf(workdir, sizeof(workdir), "%s/%s", tmpdir, tests[i].name);
+ testworkdir = workdir;
+ if (!assertMakeDir(testworkdir, 0755)
+ || !assertChdir(testworkdir)) {
fprintf(stderr,
- "ERROR: Can't chdir to work dir %s/%s\n",
- tmpdir, tests[i].name);
+ "ERROR: Can't chdir to work dir %s\n", testworkdir);
exit(1);
}
/* Explicitly reset the locale before each test. */
@@ -1709,6 +2067,7 @@ test_run(int i, const char *tmpdir)
/*
* Clean up and report afterwards.
*/
+ testworkdir = NULL;
/* Restore umask */
umask(oldumask);
/* Reset locale. */
@@ -1721,7 +2080,7 @@ test_run(int i, const char *tmpdir)
}
/* Report per-test summaries. */
tests[i].failures = failures - failures_before;
- test_summarize(test_filename, tests[i].failures);
+ test_summarize(tests[i].failures);
/* Close the per-test log file. */
fclose(logfile);
logfile = NULL;
@@ -1781,6 +2140,7 @@ usage(const char *program)
printf(" -q Quiet.\n");
printf(" -r <dir> Path to dir containing reference files.\n");
printf(" Default: Current directory.\n");
+ printf(" -u Keep running specifies tests until one fails.\n");
printf(" -v Verbose.\n");
printf("Available tests:\n");
for (i = 0; i < limit; i++)
@@ -1807,7 +2167,11 @@ get_refdir(const char *d)
}
/* Get the current dir. */
+#ifdef PATH_MAX
+ pwd = getcwd(NULL, PATH_MAX);/* Solaris getcwd needs the size. */
+#else
pwd = getcwd(NULL, 0);
+#endif
while (pwd[strlen(pwd) - 1] == '\n')
pwd[strlen(pwd) - 1] = '\0';
@@ -1834,6 +2198,14 @@ get_refdir(const char *d)
strncat(tried, buff, sizeof(tried) - strlen(tried) - 1);
strncat(tried, "\n", sizeof(tried) - strlen(tried) - 1);
+#if defined(PROGRAM_ALIAS)
+ snprintf(buff, sizeof(buff), "%s/%s/test", pwd, PROGRAM_ALIAS);
+ p = slurpfile(NULL, "%s/%s", buff, KNOWNREF);
+ if (p != NULL) goto success;
+ strncat(tried, buff, sizeof(tried) - strlen(tried) - 1);
+ strncat(tried, "\n", sizeof(tried) - strlen(tried) - 1);
+#endif
+
if (memcmp(pwd, "/usr/obj", 8) == 0) {
snprintf(buff, sizeof(buff), "%s", pwd + 8);
p = slurpfile(NULL, "%s/%s", buff, KNOWNREF);
@@ -1866,16 +2238,26 @@ int
main(int argc, char **argv)
{
static const int limit = sizeof(tests) / sizeof(tests[0]);
- int i, tests_run = 0, tests_failed = 0, option;
+ int i = 0, j = 0, start, end, tests_run = 0, tests_failed = 0, option;
time_t now;
char *refdir_alloc = NULL;
const char *progname;
+ char **saved_argv;
const char *tmp, *option_arg, *p;
- char tmpdir[256];
+ char tmpdir[256], *pwd, *testprogdir, *tmp2 = NULL;
char tmpdir_timestamp[256];
(void)argc; /* UNUSED */
+ /* Get the current dir. */
+#ifdef PATH_MAX
+ pwd = getcwd(NULL, PATH_MAX);/* Solaris getcwd needs the size. */
+#else
+ pwd = getcwd(NULL, 0);
+#endif
+ while (pwd[strlen(pwd) - 1] == '\n')
+ pwd[strlen(pwd) - 1] = '\0';
+
#if defined(HAVE__CrtSetReportMode)
/* To stop to run the default invalid parameter handler. */
_set_invalid_parameter_handler(invalid_parameter_handler);
@@ -1888,11 +2270,44 @@ main(int argc, char **argv)
* tree.
*/
progname = p = argv[0];
+ if ((testprogdir = (char *)malloc(strlen(progname) + 1)) == NULL)
+ {
+ fprintf(stderr, "ERROR: Out of memory.");
+ exit(1);
+ }
+ strcpy(testprogdir, progname);
while (*p != '\0') {
/* Support \ or / dir separators for Windows compat. */
if (*p == '/' || *p == '\\')
+ {
progname = p + 1;
+ i = j;
+ }
++p;
+ j++;
+ }
+ testprogdir[i] = '\0';
+#if defined(_WIN32) && !defined(__CYGWIN__)
+ if (testprogdir[0] != '/' && testprogdir[0] != '\\' &&
+ !(((testprogdir[0] >= 'a' && testprogdir[0] <= 'z') ||
+ (testprogdir[0] >= 'A' && testprogdir[0] <= 'Z')) &&
+ testprogdir[1] == ':' &&
+ (testprogdir[2] == '/' || testprogdir[2] == '\\')))
+#else
+ if (testprogdir[0] != '/')
+#endif
+ {
+ /* Fixup path for relative directories. */
+ if ((testprogdir = (char *)realloc(testprogdir,
+ strlen(pwd) + 1 + strlen(testprogdir) + 1)) == NULL)
+ {
+ fprintf(stderr, "ERROR: Out of memory.");
+ exit(1);
+ }
+ memmove(testprogdir + strlen(pwd) + 1, testprogdir,
+ strlen(testprogdir));
+ memcpy(testprogdir, pwd, strlen(pwd));
+ testprogdir[strlen(pwd)] = '/';
}
#ifdef PROGRAM
@@ -1957,6 +2372,7 @@ main(int argc, char **argv)
#ifdef PROGRAM
testprogfile = option_arg;
#else
+ fprintf(stderr, "-p option not permitted\n");
usage(progname);
#endif
break;
@@ -1966,10 +2382,15 @@ main(int argc, char **argv)
case 'r':
refdir = option_arg;
break;
+ case 'u':
+ until_failure++;
+ break;
case 'v':
verbosity++;
break;
default:
+ fprintf(stderr, "Unrecognized option '%c'\n",
+ option);
usage(progname);
}
}
@@ -1980,7 +2401,19 @@ main(int argc, char **argv)
*/
#ifdef PROGRAM
if (testprogfile == NULL)
- usage(progname);
+ {
+ if ((tmp2 = (char *)malloc(strlen(testprogdir) + 1 +
+ strlen(PROGRAM) + 1)) == NULL)
+ {
+ fprintf(stderr, "ERROR: Out of memory.");
+ exit(1);
+ }
+ strcpy(tmp2, testprogdir);
+ strcat(tmp2, "/");
+ strcat(tmp2, PROGRAM);
+ testprogfile = tmp2;
+ }
+
{
char *testprg;
#if defined(_WIN32) && !defined(__CYGWIN__)
@@ -2001,6 +2434,16 @@ main(int argc, char **argv)
}
#endif
+#if !defined(_WIN32) && defined(SIGPIPE)
+ { /* Ignore SIGPIPE signals */
+ struct sigaction sa;
+ sa.sa_handler = SIG_IGN;
+ sigemptyset(&sa.sa_mask);
+ sa.sa_flags = 0;
+ sigaction(SIGPIPE, &sa, NULL);
+ }
+#endif
+
/*
* Create a temp directory for the following tests.
* Include the time the tests started as part of the name,
@@ -2053,42 +2496,88 @@ main(int argc, char **argv)
/*
* Run some or all of the individual tests.
*/
- if (*argv == NULL) {
- /* Default: Run all tests. */
- for (i = 0; i < limit; i++) {
- if (test_run(i, tmpdir))
- tests_failed++;
- tests_run++;
- }
- } else {
- while (*(argv) != NULL) {
- if (**argv >= '0' && **argv <= '9') {
- i = atoi(*argv);
- if (i < 0 || i >= limit) {
- printf("*** INVALID Test %s\n", *argv);
- free(refdir_alloc);
- usage(progname);
- /* usage() never returns */
+ saved_argv = argv;
+ do {
+ argv = saved_argv;
+ if (*argv == NULL) {
+ /* Default: Run all tests. */
+ for (i = 0; i < limit; i++) {
+ tests_run++;
+ if (test_run(i, tmpdir)) {
+ tests_failed++;
+ if (until_failure)
+ goto finish;
}
- } else {
- for (i = 0; i < limit; ++i) {
- if (strcmp(*argv, tests[i].name) == 0)
- break;
+ }
+ } else {
+ while (*(argv) != NULL) {
+ if (**argv >= '0' && **argv <= '9') {
+ char *vp = *argv;
+ start = 0;
+ while (*vp >= '0' && *vp <= '9') {
+ start *= 10;
+ start += *vp - '0';
+ ++vp;
+ }
+ if (*vp == '\0') {
+ end = start;
+ } else if (*vp == '-') {
+ ++vp;
+ if (*vp == '\0') {
+ end = limit - 1;
+ } else {
+ end = 0;
+ while (*vp >= '0' && *vp <= '9') {
+ end *= 10;
+ end += *vp - '0';
+ ++vp;
+ }
+ }
+ } else {
+ printf("*** INVALID Test %s\n", *argv);
+ free(refdir_alloc);
+ usage(progname);
+ return (1);
+ }
+ if (start < 0 || end >= limit || start > end) {
+ printf("*** INVALID Test %s\n", *argv);
+ free(refdir_alloc);
+ usage(progname);
+ return (1);
+ }
+ } else {
+ for (start = 0; start < limit; ++start) {
+ if (strcmp(*argv, tests[start].name) == 0)
+ break;
+ }
+ end = start;
+ if (start >= limit) {
+ printf("*** INVALID Test ``%s''\n",
+ *argv);
+ free(refdir_alloc);
+ usage(progname);
+ /* usage() never returns */
+ }
}
- if (i >= limit) {
- printf("*** INVALID Test ``%s''\n",
- *argv);
- free(refdir_alloc);
- usage(progname);
- /* usage() never returns */
+ while (start <= end) {
+ tests_run++;
+ if (test_run(start, tmpdir)) {
+ tests_failed++;
+ if (until_failure)
+ goto finish;
+ }
+ ++start;
}
+ argv++;
}
- if (test_run(i, tmpdir))
- tests_failed++;
- tests_run++;
- argv++;
}
- }
+ } while (until_failure);
+
+finish:
+ /* Must be freed after all tests run */
+ free(tmp2);
+ free(testprogdir);
+ free(pwd);
/*
* Report summary statistics.
diff --git a/contrib/libarchive/libarchive/test/read_open_memory.c b/contrib/libarchive/libarchive/test/read_open_memory.c
index db0de8555a62..0d88df5f4f83 100644
--- a/contrib/libarchive/libarchive/test/read_open_memory.c
+++ b/contrib/libarchive/libarchive/test/read_open_memory.c
@@ -39,7 +39,8 @@ __FBSDID("$FreeBSD$");
*/
struct read_memory_data {
- unsigned char *buffer;
+ unsigned char *start;
+ unsigned char *p;
unsigned char *end;
size_t read_size;
size_t copy_buff_size;
@@ -49,7 +50,8 @@ struct read_memory_data {
static int memory_read_close(struct archive *, void *);
static int memory_read_open(struct archive *, void *);
-static off_t memory_read_skip(struct archive *, void *, off_t request);
+static int64_t memory_read_seek(struct archive *, void *, int64_t request, int whence);
+static int64_t memory_read_skip(struct archive *, void *, int64_t request);
static ssize_t memory_read(struct archive *, void *, const void **buff);
static int read_open_memory_internal(struct archive *a, void *buff,
size_t size, size_t read_size, int fullapi);
@@ -58,7 +60,7 @@ static int read_open_memory_internal(struct archive *a, void *buff,
int
read_open_memory(struct archive *a, void *buff, size_t size, size_t read_size)
{
- return read_open_memory_internal(a, buff, size, read_size, 1);
+ return read_open_memory_internal(a, buff, size, read_size, 2);
}
/*
@@ -68,12 +70,21 @@ read_open_memory(struct archive *a, void *buff, size_t size, size_t read_size)
int
read_open_memory2(struct archive *a, void *buff, size_t size, size_t read_size)
{
- return read_open_memory_internal(a, buff, size, read_size, 0);
+ return read_open_memory_internal(a, buff, size, read_size, 1);
+}
+
+/*
+ * Include a seek callback as well.
+ */
+int
+read_open_memory_seek(struct archive *a, void *buff, size_t size, size_t read_size)
+{
+ return read_open_memory_internal(a, buff, size, read_size, 3);
}
static int
read_open_memory_internal(struct archive *a, void *buff,
- size_t size, size_t read_size, int fullapi)
+ size_t size, size_t read_size, int level)
{
struct read_memory_data *mine;
@@ -83,19 +94,26 @@ read_open_memory_internal(struct archive *a, void *buff,
return (ARCHIVE_FATAL);
}
memset(mine, 0, sizeof(*mine));
- mine->buffer = (unsigned char *)buff;
- mine->end = mine->buffer + size;
+ mine->start = mine->p = (unsigned char *)buff;
+ mine->end = mine->start + size;
mine->read_size = read_size;
mine->copy_buff_offset = 32;
mine->copy_buff_size = read_size + mine->copy_buff_offset * 2;
mine->copy_buff = malloc(mine->copy_buff_size);
memset(mine->copy_buff, 0xA5, mine->copy_buff_size);
- if (fullapi)
- return (archive_read_open2(a, mine, memory_read_open,
- memory_read, memory_read_skip, memory_read_close));
- else
- return (archive_read_open2(a, mine, NULL,
- memory_read, NULL, memory_read_close));
+
+ switch (level) {
+ case 3:
+ archive_read_set_seek_callback(a, memory_read_seek);
+ case 2:
+ archive_read_set_open_callback(a, memory_read_open);
+ archive_read_set_skip_callback(a, memory_read_skip);
+ case 1:
+ archive_read_set_read_callback(a, memory_read);
+ archive_read_set_close_callback(a, memory_read_close);
+ archive_read_set_callback_data(a, mine);
+ }
+ return archive_read_open1(a);
}
/*
@@ -119,41 +137,75 @@ static ssize_t
memory_read(struct archive *a, void *client_data, const void **buff)
{
struct read_memory_data *mine = (struct read_memory_data *)client_data;
- size_t size;
+ ssize_t size;
(void)a; /* UNUSED */
- size = mine->end - mine->buffer;
- if (size > mine->read_size)
+ size = mine->end - mine->p;
+ if (size < 0) {
+ buff = NULL;
+ return 0;
+ }
+ if ((size_t)size > mine->read_size)
size = mine->read_size;
else
memset(mine->copy_buff, 0xA5, mine->copy_buff_size);
- memcpy(mine->copy_buff + mine->copy_buff_offset, mine->buffer, size);
+ memcpy(mine->copy_buff + mine->copy_buff_offset, mine->p, size);
*buff = mine->copy_buff + mine->copy_buff_offset;
- mine->buffer += size;
+ mine->p += size;
return ((ssize_t)size);
}
/*
* How mean can a skip() routine be? Let's try to find out.
*/
-static off_t
-memory_read_skip(struct archive *a, void *client_data, off_t skip)
+static int64_t
+memory_read_skip(struct archive *a, void *client_data, int64_t skip)
{
struct read_memory_data *mine = (struct read_memory_data *)client_data;
(void)a; /* UNUSED */
/* We can't skip by more than is available. */
- if ((off_t)skip > (off_t)(mine->end - mine->buffer))
- skip = mine->end - mine->buffer;
+ if ((off_t)skip > (off_t)(mine->end - mine->p))
+ skip = mine->end - mine->p;
/* Always do small skips by prime amounts. */
if (skip > 71)
skip = 71;
- mine->buffer += skip;
+ mine->p += skip;
return (skip);
}
/*
+ */
+static int64_t
+memory_read_seek(struct archive *a, void *client_data, int64_t offset, int whence)
+{
+ struct read_memory_data *mine = (struct read_memory_data *)client_data;
+
+ (void)a; /* UNUSED */
+ switch (whence) {
+ case SEEK_SET:
+ mine->p = mine->start + offset;
+ break;
+ case SEEK_END:
+ mine->p = mine->end + offset;
+ break;
+ case SEEK_CUR:
+ mine->p += offset;
+ break;
+ }
+ if (mine->p < mine->start) {
+ mine->p = mine->start;
+ return ARCHIVE_FAILED;
+ }
+ if (mine->p > mine->end) {
+ mine->p = mine->end;
+ return ARCHIVE_FAILED;
+ }
+ return (mine->p - mine->start);
+}
+
+/*
* Close is just cleaning up our one small bit of data.
*/
static int
diff --git a/contrib/libarchive/libarchive/test/test.h b/contrib/libarchive/libarchive/test/test.h
index 725c8991474e..eb78f79861e6 100644
--- a/contrib/libarchive/libarchive/test/test.h
+++ b/contrib/libarchive/libarchive/test/test.h
@@ -86,9 +86,6 @@
#if !defined(__BORLANDC__)
#define strdup _strdup
#endif
-#define LOCALE_UTF8 NULL
-#else
-#define LOCALE_UTF8 "de_DE.UTF-8"
#endif
/* Visual Studio */
@@ -100,16 +97,9 @@
#pragma warn -8068 /* Constant out of range in comparison. */
#endif
-/* Cygwin */
-#if defined(__CYGWIN__)
-/* Cygwin-1.7.x is lazy about populating nlinks, so don't
- * expect it to be accurate. */
-# define NLINKS_INACCURATE_FOR_DIRS
-#endif
-
-/* Haiku OS */
-#if defined(__HAIKU__)
-/* Haiku has typedefs in stdint.h (needed for int64_t) */
+/* Haiku OS and QNX */
+#if defined(__HAIKU__) || defined(__QNXNTO__)
+/* Haiku and QNX have typedefs in stdint.h (needed for int64_t) */
#include <stdint.h>
#endif
@@ -143,24 +133,24 @@
assertion_equal_int(__FILE__, __LINE__, (v1), #v1, (v2), #v2, NULL)
/* Assert two strings are the same. Reports value of each one if not. */
#define assertEqualString(v1,v2) \
- assertion_equal_string(__FILE__, __LINE__, (v1), #v1, (v2), #v2, NULL)
+ assertion_equal_string(__FILE__, __LINE__, (v1), #v1, (v2), #v2, NULL, 0)
+#define assertEqualUTF8String(v1,v2) \
+ assertion_equal_string(__FILE__, __LINE__, (v1), #v1, (v2), #v2, NULL, 1)
/* As above, but v1 and v2 are wchar_t * */
#define assertEqualWString(v1,v2) \
assertion_equal_wstring(__FILE__, __LINE__, (v1), #v1, (v2), #v2, NULL)
/* As above, but raw blocks of bytes. */
#define assertEqualMem(v1, v2, l) \
assertion_equal_mem(__FILE__, __LINE__, (v1), #v1, (v2), #v2, (l), #l, NULL)
-/* Assert two files are the same; allow printf-style expansion of second name.
- * See below for comments about variable arguments here...
- */
-#define assertEqualFile \
- assertion_setup(__FILE__, __LINE__);assertion_equal_file
-/* Assert that a file is empty; supports printf-style arguments. */
-#define assertEmptyFile \
- assertion_setup(__FILE__, __LINE__);assertion_empty_file
-/* Assert that a file is not empty; supports printf-style arguments. */
-#define assertNonEmptyFile \
- assertion_setup(__FILE__, __LINE__);assertion_non_empty_file
+/* Assert two files are the same. */
+#define assertEqualFile(f1, f2) \
+ assertion_equal_file(__FILE__, __LINE__, (f1), (f2))
+/* Assert that a file is empty. */
+#define assertEmptyFile(pathname) \
+ assertion_empty_file(__FILE__, __LINE__, (pathname))
+/* Assert that a file is not empty. */
+#define assertNonEmptyFile(pathname) \
+ assertion_non_empty_file(__FILE__, __LINE__, (pathname))
#define assertFileAtime(pathname, sec, nsec) \
assertion_file_atime(__FILE__, __LINE__, pathname, sec, nsec)
#define assertFileAtimeRecent(pathname) \
@@ -170,14 +160,14 @@
#define assertFileBirthtimeRecent(pathname) \
assertion_file_birthtime_recent(__FILE__, __LINE__, pathname)
/* Assert that a file exists; supports printf-style arguments. */
-#define assertFileExists \
- assertion_setup(__FILE__, __LINE__);assertion_file_exists
-/* Assert that a file exists; supports printf-style arguments. */
-#define assertFileNotExists \
- assertion_setup(__FILE__, __LINE__);assertion_file_not_exists
-/* Assert that file contents match a string; supports printf-style arguments. */
-#define assertFileContents \
- assertion_setup(__FILE__, __LINE__);assertion_file_contents
+#define assertFileExists(pathname) \
+ assertion_file_exists(__FILE__, __LINE__, pathname)
+/* Assert that a file exists. */
+#define assertFileNotExists(pathname) \
+ assertion_file_not_exists(__FILE__, __LINE__, pathname)
+/* Assert that file contents match a string. */
+#define assertFileContents(data, data_size, pathname) \
+ assertion_file_contents(__FILE__, __LINE__, data, data_size, pathname)
#define assertFileMtime(pathname, sec, nsec) \
assertion_file_mtime(__FILE__, __LINE__, pathname, sec, nsec)
#define assertFileMtimeRecent(pathname) \
@@ -186,8 +176,10 @@
assertion_file_nlinks(__FILE__, __LINE__, pathname, nlinks)
#define assertFileSize(pathname, size) \
assertion_file_size(__FILE__, __LINE__, pathname, size)
-#define assertTextFileContents \
- assertion_setup(__FILE__, __LINE__);assertion_text_file_contents
+#define assertTextFileContents(text, pathname) \
+ assertion_text_file_contents(__FILE__, __LINE__, text, pathname)
+#define assertFileContainsLinesAnyOrder(pathname, lines) \
+ assertion_file_contains_lines_any_order(__FILE__, __LINE__, pathname, lines)
#define assertIsDir(pathname, mode) \
assertion_is_dir(__FILE__, __LINE__, pathname, mode)
#define assertIsHardlink(path1, path2) \
@@ -209,6 +201,8 @@
assertion_make_symlink(__FILE__, __LINE__, newfile, linkto)
#define assertUmask(mask) \
assertion_umask(__FILE__, __LINE__, mask)
+#define assertUtimes(pathname, atime, atime_nsec, mtime, mtime_nsec) \
+ assertion_utimes(__FILE__, __LINE__, pathname, atime, atime_nsec, mtime, mtime_nsec)
/*
* This would be simple with C99 variadic macros, but I don't want to
@@ -217,28 +211,29 @@
* but effective.
*/
#define skipping \
- assertion_setup(__FILE__, __LINE__);test_skipping
+ skipping_setup(__FILE__, __LINE__);test_skipping
/* Function declarations. These are defined in test_utility.c. */
void failure(const char *fmt, ...);
int assertion_assert(const char *, int, int, const char *, void *);
int assertion_chdir(const char *, int, const char *);
-int assertion_empty_file(const char *, ...);
-int assertion_equal_file(const char *, const char *, ...);
+int assertion_empty_file(const char *, int, const char *);
+int assertion_equal_file(const char *, int, const char *, const char *);
int assertion_equal_int(const char *, int, long long, const char *, long long, const char *, void *);
int assertion_equal_mem(const char *, int, const void *, const char *, const void *, const char *, size_t, const char *, void *);
-int assertion_equal_string(const char *, int, const char *v1, const char *, const char *v2, const char *, void *);
+int assertion_equal_string(const char *, int, const char *v1, const char *, const char *v2, const char *, void *, int);
int assertion_equal_wstring(const char *, int, const wchar_t *v1, const char *, const wchar_t *v2, const char *, void *);
int assertion_file_atime(const char *, int, const char *, long, long);
int assertion_file_atime_recent(const char *, int, const char *);
int assertion_file_birthtime(const char *, int, const char *, long, long);
int assertion_file_birthtime_recent(const char *, int, const char *);
-int assertion_file_contents(const void *, int, const char *, ...);
-int assertion_file_exists(const char *, ...);
+int assertion_file_contains_lines_any_order(const char *, int, const char *, const char **);
+int assertion_file_contents(const char *, int, const void *, int, const char *);
+int assertion_file_exists(const char *, int, const char *);
int assertion_file_mtime(const char *, int, const char *, long, long);
int assertion_file_mtime_recent(const char *, int, const char *);
int assertion_file_nlinks(const char *, int, const char *, int);
-int assertion_file_not_exists(const char *, ...);
+int assertion_file_not_exists(const char *, int, const char *);
int assertion_file_size(const char *, int, const char *, long);
int assertion_is_dir(const char *, int, const char *, int);
int assertion_is_hardlink(const char *, int, const char *, const char *);
@@ -249,11 +244,12 @@ int assertion_make_dir(const char *, int, const char *, int);
int assertion_make_file(const char *, int, const char *, int, const char *);
int assertion_make_hardlink(const char *, int, const char *newpath, const char *);
int assertion_make_symlink(const char *, int, const char *newpath, const char *);
-int assertion_non_empty_file(const char *, ...);
-int assertion_text_file_contents(const char *buff, const char *f);
+int assertion_non_empty_file(const char *, int, const char *);
+int assertion_text_file_contents(const char *, int, const char *buff, const char *f);
int assertion_umask(const char *, int, int);
-void assertion_setup(const char *, int);
+int assertion_utimes(const char *, int, const char *, long, long, long, long );
+void skipping_setup(const char *, int);
void test_skipping(const char *fmt, ...);
/* Like sprintf, then system() */
@@ -271,6 +267,9 @@ int canGzip(void);
/* Return true if this platform can run the "gunzip" program. */
int canGunzip(void);
+/* Return true if the file has large i-node number(>0xffffffff). */
+int is_LargeInode(const char *);
+
/* Suck file into string allocated via malloc(). Call free() when done. */
/* Supports printf-style args: slurpfile(NULL, "%s/myfile", refdir); */
char *slurpfile(size_t *, const char *fmt, ...);
@@ -278,6 +277,9 @@ char *slurpfile(size_t *, const char *fmt, ...);
/* Extracts named reference file to the current directory. */
void extract_reference_file(const char *);
+/* Path to working directory for current test */
+const char *testworkdir;
+
/*
* Special interfaces for libarchive test harness.
*/
@@ -289,13 +291,15 @@ void extract_reference_file(const char *);
int read_open_memory(struct archive *, void *, size_t, size_t);
/* "2" version exercises a slightly different set of libarchive APIs. */
int read_open_memory2(struct archive *, void *, size_t, size_t);
+/* _seek version produces a seekable file. */
+int read_open_memory_seek(struct archive *, void *, size_t, size_t);
/* Versions of above that accept an archive argument for additional info. */
#define assertA(e) assertion_assert(__FILE__, __LINE__, (e), #e, (a))
#define assertEqualIntA(a,v1,v2) \
assertion_equal_int(__FILE__, __LINE__, (v1), #v1, (v2), #v2, (a))
#define assertEqualStringA(a,v1,v2) \
- assertion_equal_string(__FILE__, __LINE__, (v1), #v1, (v2), #v2, (a))
+ assertion_equal_string(__FILE__, __LINE__, (v1), #v1, (v2), #v2, (a), 0)
#ifdef USE_DMALLOC
#include <dmalloc.h>
diff --git a/contrib/libarchive/libarchive/test/test_acl_freebsd.c b/contrib/libarchive/libarchive/test/test_acl_freebsd.c
index fbb744d3939f..bd5aae11f9ac 100644
--- a/contrib/libarchive/libarchive/test/test_acl_freebsd.c
+++ b/contrib/libarchive/libarchive/test/test_acl_freebsd.c
@@ -222,7 +222,7 @@ DEFINE_TEST(test_acl_freebsd)
}
if (n != 0 && errno == EINVAL) {
close(fd);
- skipping("POSIX.1e ACL tests require that POSIX.1e ACL support be enabled on the filesystem");
+ skipping("This filesystem does not support POSIX.1e ACLs");
return;
}
failure("acl_set_fd(): errno = %d (%s)",
@@ -247,7 +247,7 @@ DEFINE_TEST(test_acl_freebsd)
/* Close the archive. */
assertEqualIntA(a, ARCHIVE_OK, archive_write_close(a));
- assertEqualInt(ARCHIVE_OK, archive_write_finish(a));
+ assertEqualInt(ARCHIVE_OK, archive_write_free(a));
/* Verify the data on disk. */
assertEqualInt(0, stat("test0", &st));
diff --git a/contrib/libarchive/libarchive/test/test_acl_nfs4.c b/contrib/libarchive/libarchive/test/test_acl_nfs4.c
new file mode 100644
index 000000000000..ebf9a4656ba5
--- /dev/null
+++ b/contrib/libarchive/libarchive/test/test_acl_nfs4.c
@@ -0,0 +1,291 @@
+/*-
+ * Copyright (c) 2003-2010 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.
+ */
+#include "test.h"
+__FBSDID("$FreeBSD$");
+
+/*
+ * Exercise the system-independent portion of the ACL support.
+ * Check that archive_entry objects can save and restore NFS4 ACL data.
+ *
+ * This should work on all systems, regardless of whether local
+ * filesystems support ACLs or not.
+ */
+
+struct acl_t {
+ int type; /* Type of entry: "allow" or "deny" */
+ int permset; /* Permissions for this class of users. */
+ int tag; /* Owner, User, Owning group, group, everyone, etc. */
+ int qual; /* GID or UID of user/group, depending on tag. */
+ const char *name; /* Name of user/group, depending on tag. */
+};
+
+static struct acl_t acls1[] = {
+ { ARCHIVE_ENTRY_ACL_TYPE_ALLOW, ARCHIVE_ENTRY_ACL_EXECUTE,
+ ARCHIVE_ENTRY_ACL_USER_OBJ, -1, "" },
+ { ARCHIVE_ENTRY_ACL_TYPE_DENY, ARCHIVE_ENTRY_ACL_READ_DATA,
+ ARCHIVE_ENTRY_ACL_USER, 77, "user77" },
+ { ARCHIVE_ENTRY_ACL_TYPE_ALLOW, ARCHIVE_ENTRY_ACL_READ_DATA,
+ ARCHIVE_ENTRY_ACL_GROUP_OBJ, -1, "" },
+ { ARCHIVE_ENTRY_ACL_TYPE_DENY, ARCHIVE_ENTRY_ACL_WRITE_DATA,
+ ARCHIVE_ENTRY_ACL_EVERYONE, -1, "" },
+};
+
+static struct acl_t acls2[] = {
+ /* An entry for each type. */
+ { ARCHIVE_ENTRY_ACL_TYPE_ALLOW, 0,
+ ARCHIVE_ENTRY_ACL_USER, 108, "user108" },
+ { ARCHIVE_ENTRY_ACL_TYPE_DENY, 0,
+ ARCHIVE_ENTRY_ACL_USER, 109, "user109" },
+ { ARCHIVE_ENTRY_ACL_TYPE_AUDIT, 0,
+ ARCHIVE_ENTRY_ACL_USER, 110, "user110" },
+ { ARCHIVE_ENTRY_ACL_TYPE_ALARM, 0,
+ ARCHIVE_ENTRY_ACL_USER, 111, "user111" },
+
+ /* An entry for each permission. */
+ { ARCHIVE_ENTRY_ACL_TYPE_ALLOW, ARCHIVE_ENTRY_ACL_EXECUTE,
+ ARCHIVE_ENTRY_ACL_USER, 112, "user112" },
+ { ARCHIVE_ENTRY_ACL_TYPE_ALLOW, ARCHIVE_ENTRY_ACL_READ_DATA,
+ ARCHIVE_ENTRY_ACL_USER, 113, "user113" },
+ { ARCHIVE_ENTRY_ACL_TYPE_ALLOW, ARCHIVE_ENTRY_ACL_LIST_DIRECTORY,
+ ARCHIVE_ENTRY_ACL_USER, 114, "user114" },
+ { ARCHIVE_ENTRY_ACL_TYPE_ALLOW, ARCHIVE_ENTRY_ACL_WRITE_DATA,
+ ARCHIVE_ENTRY_ACL_USER, 115, "user115" },
+ { ARCHIVE_ENTRY_ACL_TYPE_ALLOW, ARCHIVE_ENTRY_ACL_ADD_FILE,
+ ARCHIVE_ENTRY_ACL_USER, 116, "user116" },
+ { ARCHIVE_ENTRY_ACL_TYPE_ALLOW, ARCHIVE_ENTRY_ACL_APPEND_DATA,
+ ARCHIVE_ENTRY_ACL_USER, 117, "user117" },
+ { ARCHIVE_ENTRY_ACL_TYPE_ALLOW, ARCHIVE_ENTRY_ACL_ADD_SUBDIRECTORY,
+ ARCHIVE_ENTRY_ACL_USER, 118, "user118" },
+ { ARCHIVE_ENTRY_ACL_TYPE_ALLOW, ARCHIVE_ENTRY_ACL_READ_NAMED_ATTRS,
+ ARCHIVE_ENTRY_ACL_USER, 119, "user119" },
+ { ARCHIVE_ENTRY_ACL_TYPE_ALLOW, ARCHIVE_ENTRY_ACL_WRITE_NAMED_ATTRS,
+ ARCHIVE_ENTRY_ACL_USER, 120, "user120" },
+ { ARCHIVE_ENTRY_ACL_TYPE_ALLOW, ARCHIVE_ENTRY_ACL_DELETE_CHILD,
+ ARCHIVE_ENTRY_ACL_USER, 121, "user121" },
+ { ARCHIVE_ENTRY_ACL_TYPE_ALLOW, ARCHIVE_ENTRY_ACL_READ_ATTRIBUTES,
+ ARCHIVE_ENTRY_ACL_USER, 122, "user122" },
+ { ARCHIVE_ENTRY_ACL_TYPE_ALLOW, ARCHIVE_ENTRY_ACL_WRITE_ATTRIBUTES,
+ ARCHIVE_ENTRY_ACL_USER, 123, "user123" },
+ { ARCHIVE_ENTRY_ACL_TYPE_ALLOW, ARCHIVE_ENTRY_ACL_DELETE,
+ ARCHIVE_ENTRY_ACL_USER, 124, "user124" },
+ { ARCHIVE_ENTRY_ACL_TYPE_ALLOW, ARCHIVE_ENTRY_ACL_READ_ACL,
+ ARCHIVE_ENTRY_ACL_USER, 125, "user125" },
+ { ARCHIVE_ENTRY_ACL_TYPE_ALLOW, ARCHIVE_ENTRY_ACL_WRITE_ACL,
+ ARCHIVE_ENTRY_ACL_USER, 126, "user126" },
+ { ARCHIVE_ENTRY_ACL_TYPE_ALLOW, ARCHIVE_ENTRY_ACL_WRITE_OWNER,
+ ARCHIVE_ENTRY_ACL_USER, 127, "user127" },
+ { ARCHIVE_ENTRY_ACL_TYPE_ALLOW, ARCHIVE_ENTRY_ACL_SYNCHRONIZE,
+ ARCHIVE_ENTRY_ACL_USER, 128, "user128" },
+
+ /* One entry with each inheritance value. */
+ { ARCHIVE_ENTRY_ACL_TYPE_ALLOW,
+ ARCHIVE_ENTRY_ACL_READ_DATA | ARCHIVE_ENTRY_ACL_ENTRY_FILE_INHERIT,
+ ARCHIVE_ENTRY_ACL_USER, 129, "user129" },
+ { ARCHIVE_ENTRY_ACL_TYPE_ALLOW,
+ ARCHIVE_ENTRY_ACL_READ_DATA | ARCHIVE_ENTRY_ACL_ENTRY_DIRECTORY_INHERIT,
+ ARCHIVE_ENTRY_ACL_USER, 130, "user130" },
+ { ARCHIVE_ENTRY_ACL_TYPE_ALLOW,
+ ARCHIVE_ENTRY_ACL_READ_DATA | ARCHIVE_ENTRY_ACL_ENTRY_NO_PROPAGATE_INHERIT,
+ ARCHIVE_ENTRY_ACL_USER, 131, "user131" },
+ { ARCHIVE_ENTRY_ACL_TYPE_ALLOW,
+ ARCHIVE_ENTRY_ACL_READ_DATA | ARCHIVE_ENTRY_ACL_ENTRY_INHERIT_ONLY,
+ ARCHIVE_ENTRY_ACL_USER, 132, "user132" },
+ { ARCHIVE_ENTRY_ACL_TYPE_AUDIT,
+ ARCHIVE_ENTRY_ACL_READ_DATA | ARCHIVE_ENTRY_ACL_ENTRY_SUCCESSFUL_ACCESS,
+ ARCHIVE_ENTRY_ACL_USER, 133, "user133" },
+ { ARCHIVE_ENTRY_ACL_TYPE_AUDIT,
+ ARCHIVE_ENTRY_ACL_READ_DATA | ARCHIVE_ENTRY_ACL_ENTRY_FAILED_ACCESS,
+ ARCHIVE_ENTRY_ACL_USER, 134, "user134" },
+
+ /* One entry for each qualifier. */
+ { ARCHIVE_ENTRY_ACL_TYPE_ALLOW, ARCHIVE_ENTRY_ACL_EXECUTE,
+ ARCHIVE_ENTRY_ACL_USER, 135, "user135" },
+ { ARCHIVE_ENTRY_ACL_TYPE_ALLOW, ARCHIVE_ENTRY_ACL_EXECUTE,
+ ARCHIVE_ENTRY_ACL_USER_OBJ, -1, "" },
+ { ARCHIVE_ENTRY_ACL_TYPE_ALLOW, ARCHIVE_ENTRY_ACL_EXECUTE,
+ ARCHIVE_ENTRY_ACL_GROUP, 136, "group136" },
+ { ARCHIVE_ENTRY_ACL_TYPE_ALLOW, ARCHIVE_ENTRY_ACL_EXECUTE,
+ ARCHIVE_ENTRY_ACL_GROUP_OBJ, -1, "" },
+ { ARCHIVE_ENTRY_ACL_TYPE_ALLOW, ARCHIVE_ENTRY_ACL_EXECUTE,
+ ARCHIVE_ENTRY_ACL_EVERYONE, -1, "" },
+};
+
+/*
+ * Entries that should be rejected when we attempt to set them
+ * on an ACL that already has NFS4 entries.
+ */
+static struct acl_t acls_bad[] = {
+ /* POSIX.1e ACL types */
+ { ARCHIVE_ENTRY_ACL_TYPE_ACCESS, ARCHIVE_ENTRY_ACL_EXECUTE,
+ ARCHIVE_ENTRY_ACL_USER, 78, "" },
+ { ARCHIVE_ENTRY_ACL_TYPE_DEFAULT, ARCHIVE_ENTRY_ACL_EXECUTE,
+ ARCHIVE_ENTRY_ACL_USER, 78, "" },
+
+ /* POSIX.1e tags */
+ { ARCHIVE_ENTRY_ACL_TYPE_ALLOW, ARCHIVE_ENTRY_ACL_EXECUTE,
+ ARCHIVE_ENTRY_ACL_OTHER, -1, "" },
+ { ARCHIVE_ENTRY_ACL_TYPE_ALLOW, ARCHIVE_ENTRY_ACL_EXECUTE,
+ ARCHIVE_ENTRY_ACL_MASK, -1, "" },
+
+ /* POSIX.1e permissions */
+ { ARCHIVE_ENTRY_ACL_TYPE_ALLOW, ARCHIVE_ENTRY_ACL_READ,
+ ARCHIVE_ENTRY_ACL_EVERYONE, -1, "" },
+ { ARCHIVE_ENTRY_ACL_TYPE_ALLOW, ARCHIVE_ENTRY_ACL_WRITE,
+ ARCHIVE_ENTRY_ACL_EVERYONE, -1, "" },
+};
+
+static void
+set_acls(struct archive_entry *ae, struct acl_t *acls, int n)
+{
+ int i;
+
+ archive_entry_acl_clear(ae);
+ for (i = 0; i < n; i++) {
+ failure("type=%d, permset=%d, tag=%d, qual=%d name=%s",
+ acls[i].type, acls[i].permset, acls[i].tag,
+ acls[i].qual, acls[i].name);
+ assertEqualInt(ARCHIVE_OK,
+ archive_entry_acl_add_entry(ae,
+ acls[i].type, acls[i].permset, acls[i].tag,
+ acls[i].qual, acls[i].name));
+ }
+}
+
+static int
+acl_match(struct acl_t *acl, int type, int permset, int tag, int qual, const char *name)
+{
+ if (type != acl->type)
+ return (0);
+ if (permset != acl->permset)
+ return (0);
+ if (tag != acl->tag)
+ return (0);
+ if (tag == ARCHIVE_ENTRY_ACL_USER_OBJ)
+ return (1);
+ if (tag == ARCHIVE_ENTRY_ACL_GROUP_OBJ)
+ return (1);
+ if (tag == ARCHIVE_ENTRY_ACL_EVERYONE)
+ return (1);
+ if (qual != acl->qual)
+ return (0);
+ if (name == NULL) {
+ if (acl->name == NULL || acl->name[0] == '\0')
+ return (1);
+ }
+ if (acl->name == NULL) {
+ if (name[0] == '\0')
+ return (1);
+ }
+ return (0 == strcmp(name, acl->name));
+}
+
+static void
+compare_acls(struct archive_entry *ae, struct acl_t *acls, int n)
+{
+ int *marker = malloc(sizeof(marker[0]) * n);
+ int i;
+ int r;
+ int type, permset, tag, qual;
+ int matched;
+ const char *name;
+
+ for (i = 0; i < n; i++)
+ marker[i] = i;
+
+ while (0 == (r = archive_entry_acl_next(ae,
+ ARCHIVE_ENTRY_ACL_TYPE_NFS4,
+ &type, &permset, &tag, &qual, &name))) {
+ for (i = 0, matched = 0; i < n && !matched; i++) {
+ if (acl_match(&acls[marker[i]], type, permset,
+ tag, qual, name)) {
+ /* We found a match; remove it. */
+ marker[i] = marker[n - 1];
+ n--;
+ matched = 1;
+ }
+ }
+ failure("Could not find match for ACL "
+ "(type=%d,permset=%d,tag=%d,qual=%d,name=``%s'')",
+ type, permset, tag, qual, name);
+ assertEqualInt(1, matched);
+ }
+ assertEqualInt(ARCHIVE_EOF, r);
+ failure("Could not find match for ACL "
+ "(type=%d,permset=%d,tag=%d,qual=%d,name=``%s'')",
+ acls[marker[0]].type, acls[marker[0]].permset,
+ acls[marker[0]].tag, acls[marker[0]].qual, acls[marker[0]].name);
+ assertEqualInt(0, n); /* Number of ACLs not matched should == 0 */
+ free(marker);
+}
+
+DEFINE_TEST(test_acl_nfs4)
+{
+ struct archive_entry *ae;
+ int i;
+
+ /* Create a simple archive_entry. */
+ assert((ae = archive_entry_new()) != NULL);
+ archive_entry_set_pathname(ae, "file");
+ archive_entry_set_mode(ae, S_IFREG | 0777);
+
+ /* Store and read back some basic ACL entries. */
+ set_acls(ae, acls1, sizeof(acls1)/sizeof(acls1[0]));
+ assertEqualInt(4,
+ archive_entry_acl_reset(ae, ARCHIVE_ENTRY_ACL_TYPE_NFS4));
+ compare_acls(ae, acls1, sizeof(acls1)/sizeof(acls1[0]));
+
+ /* A more extensive set of ACLs. */
+ set_acls(ae, acls2, sizeof(acls2)/sizeof(acls2[0]));
+ assertEqualInt(32,
+ archive_entry_acl_reset(ae, ARCHIVE_ENTRY_ACL_TYPE_NFS4));
+ compare_acls(ae, acls2, sizeof(acls2)/sizeof(acls2[0]));
+
+ /*
+ * Check that clearing ACLs gets rid of them all by repeating
+ * the first test.
+ */
+ set_acls(ae, acls1, sizeof(acls1)/sizeof(acls1[0]));
+ failure("Basic ACLs shouldn't be stored as extended ACLs");
+ assertEqualInt(4,
+ archive_entry_acl_reset(ae, ARCHIVE_ENTRY_ACL_TYPE_NFS4));
+
+ /*
+ * Different types of malformed ACL entries that should
+ * fail when added to existing NFS4 ACLs.
+ */
+ set_acls(ae, acls2, sizeof(acls2)/sizeof(acls2[0]));
+ for (i = 0; i < (int)(sizeof(acls_bad)/sizeof(acls_bad[0])); ++i) {
+ struct acl_t *p = &acls_bad[i];
+ failure("Malformed ACL test #%d", i);
+ assertEqualInt(ARCHIVE_FAILED,
+ archive_entry_acl_add_entry(ae,
+ p->type, p->permset, p->tag, p->qual, p->name));
+ failure("Malformed ACL test #%d", i);
+ assertEqualInt(32,
+ archive_entry_acl_reset(ae,
+ ARCHIVE_ENTRY_ACL_TYPE_NFS4));
+ }
+ archive_entry_free(ae);
+}
diff --git a/contrib/libarchive/libarchive/test/test_acl_pax.c b/contrib/libarchive/libarchive/test/test_acl_pax.c
index f6b065d2a689..464858ff12ea 100644
--- a/contrib/libarchive/libarchive/test/test_acl_pax.c
+++ b/contrib/libarchive/libarchive/test/test_acl_pax.c
@@ -35,230 +35,6 @@ __FBSDID("$FreeBSD$");
static unsigned char buff[16384];
-static unsigned char reference[] = {
-'P','a','x','H','e','a','d','e','r','/','f','i','l','e',0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,'0','0','0','1','4','2',' ',0,'0','0','0','0','0','0',' ',0,'0','0',
-'0','0','0','0',' ',0,'0','0','0','0','0','0','0','0','0','6','2',' ','0',
-'0','0','0','0','0','0','0','0','0','0',' ','0','1','1','7','6','7',0,' ',
-'x',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'u','s','t','a','r',
-0,'0','0',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'0','0','0',
-'0','0','0',' ',0,'0','0','0','0','0','0',' ',0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,'1','6',' ','S','C','H','I','L','Y','.','d','e','v','=','0',10,
-'1','6',' ','S','C','H','I','L','Y','.','i','n','o','=','0',10,'1','8',' ',
-'S','C','H','I','L','Y','.','n','l','i','n','k','=','0',10,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,'f','i','l','e',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,'0','0','0','1','4','2',' ',0,'0','0','0','0','0','0',' ',0,'0','0',
-'0','0','0','0',' ',0,'0','0','0','0','0','0','0','0','0','0','0',' ','0',
-'0','0','0','0','0','0','0','0','0','0',' ','0','1','0','0','0','6',0,' ',
-'0',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'u','s','t','a','r',
-0,'0','0',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'0','0','0',
-'0','0','0',' ',0,'0','0','0','0','0','0',' ',0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,'P','a','x','H','e','a','d','e','r','/','f','i','l','e',0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,'0','0','0','1','4','2',' ',0,'0','0','0','0','0','0',' ',
-0,'0','0','0','0','0','0',' ',0,'0','0','0','0','0','0','0','0','1','7','2',
-' ','0','0','0','0','0','0','0','0','0','0','0',' ','0','1','1','7','7','1',
-0,' ','x',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'u','s','t',
-'a','r',0,'0','0',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'0',
-'0','0','0','0','0',' ',0,'0','0','0','0','0','0',' ',0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,'7','2',' ','S','C','H','I','L','Y','.','a','c','l','.',
-'a','c','c','e','s','s','=','u','s','e','r',':',':','-','-','x',',','g','r',
-'o','u','p',':',':','r','-','-',',','o','t','h','e','r',':',':','-','w','-',
-',','u','s','e','r',':','u','s','e','r','7','7',':','r','-','-',':','7','7',
-10,'1','6',' ','S','C','H','I','L','Y','.','d','e','v','=','0',10,'1','6',
-' ','S','C','H','I','L','Y','.','i','n','o','=','0',10,'1','8',' ','S','C',
-'H','I','L','Y','.','n','l','i','n','k','=','0',10,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,'f','i','l','e',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,'0','0','0','1','4','2',' ',0,'0','0','0','0','0','0',' ',0,'0','0','0',
-'0','0','0',' ',0,'0','0','0','0','0','0','0','0','0','0','0',' ','0','0',
-'0','0','0','0','0','0','0','0','0',' ','0','1','0','0','0','6',0,' ','0',
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'u','s','t','a','r',0,
-'0','0',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'0','0','0',
-'0','0','0',' ',0,'0','0','0','0','0','0',' ',0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,'P','a','x','H','e','a','d','e','r','/','f','i','l','e',0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,'0','0','0','5','4','3',' ',0,'0','0','0','0','0','0',' ',
-0,'0','0','0','0','0','0',' ',0,'0','0','0','0','0','0','0','0','2','4','3',
-' ','0','0','0','0','0','0','0','0','0','0','0',' ','0','1','1','7','7','5',
-0,' ','x',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'u','s','t',
-'a','r',0,'0','0',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'0',
-'0','0','0','0','0',' ',0,'0','0','0','0','0','0',' ',0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,'1','1','3',' ','S','C','H','I','L','Y','.','a','c','l',
-'.','a','c','c','e','s','s','=','u','s','e','r',':',':','r','-','x',',','g',
-'r','o','u','p',':',':','r','-','-',',','o','t','h','e','r',':',':','-','w',
-'x',',','u','s','e','r',':','u','s','e','r','7','7',':','r','-','-',':','7',
-'7',',','u','s','e','r',':','u','s','e','r','7','8',':','-','-','-',':','7',
-'8',',','g','r','o','u','p',':','g','r','o','u','p','7','8',':','r','w','x',
-':','7','8',10,'1','6',' ','S','C','H','I','L','Y','.','d','e','v','=','0',
-10,'1','6',' ','S','C','H','I','L','Y','.','i','n','o','=','0',10,'1','8',
-' ','S','C','H','I','L','Y','.','n','l','i','n','k','=','0',10,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,'f','i','l','e',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,'0','0','0','5','4','3',' ',0,'0','0','0','0','0','0',' ',0,'0','0',
-'0','0','0','0',' ',0,'0','0','0','0','0','0','0','0','0','0','0',' ','0',
-'0','0','0','0','0','0','0','0','0','0',' ','0','1','0','0','1','3',0,' ',
-'0',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'u','s','t','a','r',
-0,'0','0',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'0','0','0',
-'0','0','0',' ',0,'0','0','0','0','0','0',' ',0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,'P','a','x','H','e','a','d','e','r','/','f','i','l','e',0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,'0','0','0','1','4','2',' ',0,'0','0','0','0','0','0',' ',
-0,'0','0','0','0','0','0',' ',0,'0','0','0','0','0','0','0','0','0','6','2',
-' ','0','0','0','0','0','0','0','0','0','0','0',' ','0','1','1','7','6','7',
-0,' ','x',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'u','s','t',
-'a','r',0,'0','0',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'0',
-'0','0','0','0','0',' ',0,'0','0','0','0','0','0',' ',0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,'1','6',' ','S','C','H','I','L','Y','.','d','e','v','=',
-'0',10,'1','6',' ','S','C','H','I','L','Y','.','i','n','o','=','0',10,'1',
-'8',' ','S','C','H','I','L','Y','.','n','l','i','n','k','=','0',10,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'f','i','l','e',0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,'0','0','0','1','4','2',' ',0,'0','0','0','0','0','0',' ',
-0,'0','0','0','0','0','0',' ',0,'0','0','0','0','0','0','0','0','0','0','0',
-' ','0','0','0','0','0','0','0','0','0','0','0',' ','0','1','0','0','0','6',
-0,' ','0',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'u','s','t',
-'a','r',0,'0','0',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,'0',
-'0','0','0','0','0',' ',0,'0','0','0','0','0','0',' ',0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
-
-
struct acl_t {
int type; /* Type of ACL: "access" or "default" */
int permset; /* Permissions for this class of users. */
@@ -386,13 +162,8 @@ compare_acls(struct archive_entry *ae, struct acl_t *acls, int n, int mode)
assert(matched == 1);
}
}
-#if ARCHIVE_VERSION_NUMBER < 1009000
- /* Known broken before 1.9.0. */
- skipping("archive_entry_acl_next() exits with ARCHIVE_EOF");
-#else
assertEqualInt(ARCHIVE_EOF, r);
-#endif
- assert((mode & 0777) == (archive_entry_mode(ae) & 0777));
+ assert((mode_t)(mode & 0777) == (archive_entry_mode(ae) & 0777));
failure("Could not find match for ACL "
"(type=%d,permset=%d,tag=%d,qual=%d,name=``%s'')",
acls[marker[0]].type, acls[marker[0]].permset,
@@ -407,6 +178,8 @@ DEFINE_TEST(test_acl_pax)
struct archive_entry *ae;
size_t used;
FILE *f;
+ void *reference;
+ size_t reference_size;
/* Write an archive to memory. */
assert(NULL != (a = archive_write_new()));
@@ -445,12 +218,8 @@ DEFINE_TEST(test_acl_pax)
archive_entry_free(ae);
/* Close out the archive. */
- assertA(0 == archive_write_close(a));
-#if ARCHIVE_VERSION_NUMBER < 2000000
- archive_write_finish(a);
-#else
- assertA(0 == archive_write_finish(a));
-#endif
+ assertEqualIntA(a, ARCHIVE_OK, archive_write_close(a));
+ assertEqualInt(ARCHIVE_OK, archive_write_free(a));
/* Write out the data we generated to a file for manual inspection. */
assert(NULL != (f = fopen("testout", "wb")));
@@ -458,20 +227,20 @@ DEFINE_TEST(test_acl_pax)
fclose(f);
/* Write out the reference data to a file for manual inspection. */
- assert(NULL != (f = fopen("reference", "wb")));
- assert(sizeof(reference) == fwrite(reference, 1, sizeof(reference), f));
- fclose(f);
+ extract_reference_file("test_acl_pax.tar");
+ reference = slurpfile(&reference_size, "test_acl_pax.tar");
/* Assert that the generated data matches the built-in reference data.*/
- failure("Generated pax archive does not match reference; check 'testout' and 'reference' files.");
- assertEqualMem(buff, reference, sizeof(reference));
- failure("Generated pax archive does not match reference; check 'testout' and 'reference' files.");
- assertEqualInt((int)used, sizeof(reference));
+ failure("Generated pax archive does not match reference; compare 'testout' to 'test_acl_pax.tar' reference file.");
+ assertEqualMem(buff, reference, reference_size);
+ failure("Generated pax archive does not match reference; compare 'testout' to 'test_acl_pax.tar' reference file.");
+ assertEqualInt((int)used, reference_size);
+ free(reference);
/* Read back each entry and check that the ACL data is right. */
assert(NULL != (a = archive_read_new()));
assertA(0 == archive_read_support_format_all(a));
- assertA(0 == archive_read_support_compression_all(a));
+ assertA(0 == archive_read_support_filter_all(a));
assertA(0 == archive_read_open_memory(a, buff, used));
/* First item has no ACLs */
@@ -508,10 +277,6 @@ DEFINE_TEST(test_acl_pax)
assert((archive_entry_mode(ae) & 0777) == 0142);
/* Close the archive. */
- assertA(0 == archive_read_close(a));
-#if ARCHIVE_VERSION_NUMBER < 2000000
- archive_read_finish(a);
-#else
- assertA(0 == archive_read_finish(a));
-#endif
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
+ assertEqualInt(ARCHIVE_OK, archive_read_free(a));
}
diff --git a/contrib/libarchive/libarchive/test/test_acl_pax.tar.uu b/contrib/libarchive/libarchive/test/test_acl_pax.tar.uu
new file mode 100644
index 000000000000..58d7b62463d4
--- /dev/null
+++ b/contrib/libarchive/libarchive/test/test_acl_pax.tar.uu
@@ -0,0 +1,117 @@
+begin 644 test_acl_pax.tar
+M9FEL90``````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M`````````````#`P,#$T,B``,#`P,#`P(``P,#`P,#`@`#`P,#`P,#`P,#`P
+M(#`P,#`P,#`P,#`P(#`Q,#`P-@`@,```````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````````!U<W1A<@`P,```````
+M````````````````````````````````````````````````````````````
+M```````````````````P,#`P,#`@`#`P,#`P,"``````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````!087A(96%D97(O9FEL90``````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````,#`P,30R(``P,#`P,#`@`#`P
+M,#`P,"``,#`P,#`P,#`Q,3`@,#`P,#`P,#`P,#`@,#$Q-S8Q`"!X````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M`````'5S=&%R`#`P````````````````````````````````````````````
+M`````````````````````````````````````````#`P,#`P,"``,#`P,#`P
+M(```````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M`````````````````````````````````````````````#<R(%-#2$E,62YA
+M8VPN86-C97-S/75S97(Z.BTM>"QG<F]U<#HZ<BTM+&]T:&5R.CHM=RTL=7-E
+M<CIU<V5R-S<Z<BTM.C<W"@``````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````9FEL90``````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M`````````````````````#`P,#$T,B``,#`P,#`P(``P,#`P,#`@`#`P,#`P
+M,#`P,#`P(#`P,#`P,#`P,#`P(#`Q,#`P-@`@,```````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````````````````!U<W1A<@`P
+M,```````````````````````````````````````````````````````````
+M```````````````````````````P,#`P,#`@`#`P,#`P,"``````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````!087A(96%D97(O9FEL90``````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````,#`P-30S(``P,#`P
+M,#`@`#`P,#`P,"``,#`P,#`P,#`Q-C$@,#`P,#`P,#`P,#`@,#$Q-S<T`"!X
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M`````````````'5S=&%R`#`P````````````````````````````````````
+M`````````````````````````````````````````````````#`P,#`P,"``
+M,#`P,#`P(```````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M`````````````````````````````````````````````````````#$Q,R!3
+M0TA)3%DN86-L+F%C8V5S<SUU<V5R.CIR+7@L9W)O=7`Z.G(M+2QO=&AE<CHZ
+M+7=X+'5S97(Z=7-E<C<W.G(M+3HW-RQU<V5R.G5S97(W.#HM+2TZ-S@L9W)O
+M=7`Z9W)O=7`W.#IR=W@Z-S@*````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````9FEL90``````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M`````````````````````````````#`P,#4T,R``,#`P,#`P(``P,#`P,#`@
+M`#`P,#`P,#`P,#`P(#`P,#`P,#`P,#`P(#`Q,#`Q,P`@,```````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````````````````````````!U
+M<W1A<@`P,```````````````````````````````````````````````````
+M```````````````````````````````````P,#`P,#`@`#`P,#`P,"``````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````!F:6QE````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````,#`P,30R
+M(``P,#`P,#`@`#`P,#`P,"``,#`P,#`P,#`P,#`@,#`P,#`P,#`P,#`@,#$P
+M,#`V`"`P````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M`````````````````````'5S=&%R`#`P````````````````````````````
+M`````````````````````````````````````````````````````````#`P
+M,#`P,"``,#`P,#`P(```````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+C````````````````````````````````````````````````
+`
+end
diff --git a/contrib/libarchive/libarchive/test/test_acl_basic.c b/contrib/libarchive/libarchive/test/test_acl_posix1e.c
index 8fbd3a014371..2055682bb2ab 100644
--- a/contrib/libarchive/libarchive/test/test_acl_basic.c
+++ b/contrib/libarchive/libarchive/test/test_acl_posix1e.c
@@ -23,11 +23,11 @@
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "test.h"
-__FBSDID("$FreeBSD$");
+__FBSDID("$FreeBSD: src/lib/libarchive/test/test_acl_basic.c,v 1.6 2008/10/19 00:13:57 kientzle Exp $");
/*
* Exercise the system-independent portion of the ACL support.
- * Check that archive_entry objects can save and restore ACL data.
+ * Check that archive_entry objects can save and restore POSIX.1e-style ACL data.
*
* This should work on all systems, regardless of whether local
* filesystems support ACLs or not.
@@ -76,6 +76,34 @@ static struct acl_t acls2[] = {
ARCHIVE_ENTRY_ACL_OTHER, -1, "" },
};
+/*
+ * NFS4 entry types; attempts to set these on top of POSIX.1e
+ * attributes should fail.
+ */
+static struct acl_t acls_nfs4[] = {
+ /* NFS4 types */
+ { ARCHIVE_ENTRY_ACL_TYPE_ALLOW, ARCHIVE_ENTRY_ACL_READ,
+ ARCHIVE_ENTRY_ACL_USER, 78, "" },
+ { ARCHIVE_ENTRY_ACL_TYPE_DENY, ARCHIVE_ENTRY_ACL_READ,
+ ARCHIVE_ENTRY_ACL_USER, 78, "" },
+ { ARCHIVE_ENTRY_ACL_TYPE_AUDIT, ARCHIVE_ENTRY_ACL_READ,
+ ARCHIVE_ENTRY_ACL_USER, 78, "" },
+ { ARCHIVE_ENTRY_ACL_TYPE_ALARM, ARCHIVE_ENTRY_ACL_READ,
+ ARCHIVE_ENTRY_ACL_USER, 78, "" },
+
+ /* NFS4 tags */
+ { ARCHIVE_ENTRY_ACL_TYPE_ACCESS, ARCHIVE_ENTRY_ACL_READ,
+ ARCHIVE_ENTRY_ACL_EVERYONE, -1, "" },
+
+ /* NFS4 inheritance markers */
+ { ARCHIVE_ENTRY_ACL_TYPE_ACCESS,
+ ARCHIVE_ENTRY_ACL_READ | ARCHIVE_ENTRY_ACL_ENTRY_FILE_INHERIT,
+ ARCHIVE_ENTRY_ACL_USER, 79, "" },
+ { ARCHIVE_ENTRY_ACL_TYPE_ACCESS,
+ ARCHIVE_ENTRY_ACL_READ | ARCHIVE_ENTRY_ACL_ENTRY_FILE_INHERIT,
+ ARCHIVE_ENTRY_ACL_USER_OBJ, -1, "" },
+};
+
static void
set_acls(struct archive_entry *ae, struct acl_t *acls, int n)
{
@@ -164,13 +192,8 @@ compare_acls(struct archive_entry *ae, struct acl_t *acls, int n, int mode)
assert(matched == 1);
}
}
-#if ARCHIVE_VERSION_NUMBER < 1009000
- /* Known broken before 1.9.0. */
- skipping("archive_entry_acl_next() exits with ARCHIVE_EOF");
-#else
assertEqualInt(ARCHIVE_EOF, r);
-#endif
- assert((mode & 0777) == (archive_entry_mode(ae) & 0777));
+ assert((mode_t)(mode & 0777) == (archive_entry_mode(ae) & 0777));
failure("Could not find match for ACL "
"(type=%d,permset=%d,tag=%d,qual=%d,name=``%s'')",
acls[marker[0]].type, acls[marker[0]].permset,
@@ -179,9 +202,10 @@ compare_acls(struct archive_entry *ae, struct acl_t *acls, int n, int mode)
free(marker);
}
-DEFINE_TEST(test_acl_basic)
+DEFINE_TEST(test_acl_posix1e)
{
struct archive_entry *ae;
+ int i;
/* Create a simple archive_entry. */
assert((ae = archive_entry_new()) != NULL);
@@ -189,6 +213,14 @@ DEFINE_TEST(test_acl_basic)
archive_entry_set_mode(ae, S_IFREG | 0777);
/* Basic owner/owning group should just update mode bits. */
+
+ /*
+ * Note: This features of libarchive's ACL implementation
+ * shouldn't be relied on and should probably be removed. It
+ * was done to identify trivial ACLs so we could avoid
+ * triggering unnecessary extensions. It's better to identify
+ * trivial ACLs at the point they are being read from disk.
+ */
set_acls(ae, acls0, sizeof(acls0)/sizeof(acls0[0]));
failure("Basic ACLs shouldn't be stored as extended ACLs");
assert(0 == archive_entry_acl_reset(ae, ARCHIVE_ENTRY_ACL_TYPE_ACCESS));
@@ -225,5 +257,21 @@ DEFINE_TEST(test_acl_basic)
failure("Basic ACLs should set mode to 0142, not %04o",
archive_entry_mode(ae)&0777);
assert((archive_entry_mode(ae) & 0777) == 0142);
+
+ /*
+ * Different types of malformed ACL entries that should
+ * fail when added to existing POSIX.1e ACLs.
+ */
+ set_acls(ae, acls2, sizeof(acls2)/sizeof(acls2[0]));
+ for (i = 0; i < (int)(sizeof(acls_nfs4)/sizeof(acls_nfs4[0])); ++i) {
+ struct acl_t *p = &acls_nfs4[i];
+ failure("Malformed ACL test #%d", i);
+ assertEqualInt(ARCHIVE_FAILED,
+ archive_entry_acl_add_entry(ae,
+ p->type, p->permset, p->tag, p->qual, p->name));
+ assertEqualInt(6,
+ archive_entry_acl_reset(ae,
+ ARCHIVE_ENTRY_ACL_TYPE_ACCESS));
+ }
archive_entry_free(ae);
}
diff --git a/contrib/libarchive/libarchive/test/test_archive_api_feature.c b/contrib/libarchive/libarchive/test/test_archive_api_feature.c
index 3324aad58def..f2925b573d18 100644
--- a/contrib/libarchive/libarchive/test/test_archive_api_feature.c
+++ b/contrib/libarchive/libarchive/test/test_archive_api_feature.c
@@ -38,7 +38,7 @@ DEFINE_TEST(test_archive_api_feature)
archive_version_number() % 1000);
failure("Version string is: %s, computed is: %s",
archive_version_string(), buff);
- assert(memcmp(buff, archive_version_string(), strlen(buff)) == 0);
+ assertEqualMem(buff, archive_version_string(), strlen(buff));
if (strlen(buff) < strlen(archive_version_string())) {
p = archive_version_string() + strlen(buff);
failure("Version string is: %s", archive_version_string());
@@ -47,30 +47,4 @@ DEFINE_TEST(test_archive_api_feature)
failure("Version string is: %s", archive_version_string());
assert(*p == '\0');
}
-
-/* This is all scheduled to disappear in libarchive 3.0 */
-#if ARCHIVE_VERSION_NUMBER < 3000000
- assertEqualInt(ARCHIVE_VERSION_STAMP, ARCHIVE_VERSION_NUMBER);
- assertEqualInt(ARCHIVE_API_FEATURE, archive_api_feature());
- assertEqualInt(ARCHIVE_API_VERSION, archive_api_version());
- /*
- * Even though ARCHIVE_VERSION_STAMP only appears in
- * archive.h after 1.9.0 and 2.2.3, the macro is synthesized
- * in test.h, so this test is always valid.
- */
- assertEqualInt(ARCHIVE_VERSION_STAMP / 1000, ARCHIVE_API_VERSION * 1000 + ARCHIVE_API_FEATURE);
- /*
- * The function, however, isn't always available. It appeared
- * sometime in the middle of 2.2.3, but the synthesized value
- * never has a release version, so the following conditional
- * exactly determines whether the current library has the
- * function.
- */
-#if ARCHIVE_VERSION_STAMP / 1000 == 1009 || ARCHIVE_VERSION_STAMP > 2002000
- assertEqualInt(ARCHIVE_VERSION_STAMP, archive_version_stamp());
-#else
- skipping("archive_version_stamp()");
-#endif
- assertEqualString(ARCHIVE_LIBRARY_VERSION, archive_version());
-#endif
}
diff --git a/contrib/libarchive/libarchive/test/test_archive_clear_error.c b/contrib/libarchive/libarchive/test/test_archive_clear_error.c
new file mode 100644
index 000000000000..43265b5391b4
--- /dev/null
+++ b/contrib/libarchive/libarchive/test/test_archive_clear_error.c
@@ -0,0 +1,42 @@
+/*-
+ * Copyright (c) 2003-2010 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.
+ */
+
+#include "test.h"
+__FBSDID("$FreeBSD$");
+
+DEFINE_TEST(test_archive_clear_error)
+{
+ struct archive* a = archive_read_new();
+
+ archive_set_error(a, 12, "abcdefgh");
+ assertEqualInt(12, archive_errno(a));
+ assertEqualString("abcdefgh", archive_error_string(a));
+
+ archive_clear_error(a);
+ assertEqualInt(0, archive_errno(a));
+ assertEqualString(NULL, archive_error_string(a));
+
+ archive_read_finish(a);
+}
diff --git a/contrib/libarchive/libarchive/test/test_archive_crypto.c b/contrib/libarchive/libarchive/test/test_archive_crypto.c
new file mode 100644
index 000000000000..a4bf4ec6df5a
--- /dev/null
+++ b/contrib/libarchive/libarchive/test/test_archive_crypto.c
@@ -0,0 +1,145 @@
+/*-
+ * Copyright (c) 2003-2007 Tim Kientzle
+ * Copyright (c) 2011 Andres Mejia
+ * 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.
+ */
+#include "test.h"
+
+/* Sanity test of internal crypto functionality */
+
+#define __LIBARCHIVE_BUILD 1
+#include "archive_crypto_private.h"
+
+DEFINE_TEST(test_archive_md5)
+{
+ archive_md5_ctx ctx;
+ unsigned char buf[] = "";
+ unsigned char md[16];
+ unsigned char actualmd[] = "\x93\xb8\x85\xad\xfe\x0d\xa0\x89"
+ "\xcd\xf6\x34\x90\x4f\xd5\x9f\x71";
+
+ if (ARCHIVE_OK != archive_md5_init(&ctx)) {
+ skipping("This platform does not support MD5");
+ return;
+ }
+ assertEqualInt(ARCHIVE_OK, archive_md5_update(&ctx, buf, sizeof(buf)));
+ assertEqualInt(ARCHIVE_OK, archive_md5_final(&ctx, md));
+ assertEqualMem(md, actualmd, sizeof(md));
+}
+
+DEFINE_TEST(test_archive_rmd160)
+{
+ archive_rmd160_ctx ctx;
+ unsigned char buf[] = "";
+ unsigned char md[20];
+ unsigned char actualmd[] = "\xc8\x1b\x94\x93\x34\x20\x22\x1a\x7a\xc0"
+ "\x04\xa9\x02\x42\xd8\xb1\xd3\xe5\x07\x0d";
+
+ if (ARCHIVE_OK != archive_rmd160_init(&ctx)) {
+ skipping("This platform does not support RMD160");
+ return;
+ }
+ assertEqualInt(ARCHIVE_OK, archive_rmd160_update(&ctx, buf, sizeof(buf)));
+ assertEqualInt(ARCHIVE_OK, archive_rmd160_final(&ctx, md));
+ assertEqualMem(md, actualmd, sizeof(md));
+}
+
+DEFINE_TEST(test_archive_sha1)
+{
+ archive_sha1_ctx ctx;
+ unsigned char buf[] = "";
+ unsigned char md[20];
+ unsigned char actualmd[] = "\x5b\xa9\x3c\x9d\xb0\xcf\xf9\x3f\x52\xb5"
+ "\x21\xd7\x42\x0e\x43\xf6\xed\xa2\x78\x4f";
+
+ if (ARCHIVE_OK != archive_sha1_init(&ctx)) {
+ skipping("This platform does not support SHA1");
+ return;
+ }
+ assertEqualInt(ARCHIVE_OK, archive_sha1_update(&ctx, buf, sizeof(buf)));
+ assertEqualInt(ARCHIVE_OK, archive_sha1_final(&ctx, md));
+ assertEqualMem(md, actualmd, sizeof(md));
+}
+
+DEFINE_TEST(test_archive_sha256)
+{
+ archive_sha256_ctx ctx;
+ unsigned char buf[] = "";
+ unsigned char md[32];
+ unsigned char actualmd[] = "\x6e\x34\x0b\x9c\xff\xb3\x7a\x98"
+ "\x9c\xa5\x44\xe6\xbb\x78\x0a\x2c"
+ "\x78\x90\x1d\x3f\xb3\x37\x38\x76"
+ "\x85\x11\xa3\x06\x17\xaf\xa0\x1d";
+
+ if (ARCHIVE_OK != archive_sha256_init(&ctx)) {
+ skipping("This platform does not support SHA256");
+ return;
+ }
+ assertEqualInt(ARCHIVE_OK, archive_sha256_update(&ctx, buf, sizeof(buf)));
+ assertEqualInt(ARCHIVE_OK, archive_sha256_final(&ctx, md));
+ assertEqualMem(md, actualmd, sizeof(md));
+}
+
+DEFINE_TEST(test_archive_sha384)
+{
+ archive_sha384_ctx ctx;
+ unsigned char buf[] = "";
+ unsigned char md[48];
+ unsigned char actualmd[] = "\xbe\xc0\x21\xb4\xf3\x68\xe3\x06"
+ "\x91\x34\xe0\x12\xc2\xb4\x30\x70"
+ "\x83\xd3\xa9\xbd\xd2\x06\xe2\x4e"
+ "\x5f\x0d\x86\xe1\x3d\x66\x36\x65"
+ "\x59\x33\xec\x2b\x41\x34\x65\x96"
+ "\x68\x17\xa9\xc2\x08\xa1\x17\x17";
+
+ if (ARCHIVE_OK != archive_sha384_init(&ctx)) {
+ skipping("This platform does not support SHA384");
+ return;
+ }
+ assertEqualInt(ARCHIVE_OK, archive_sha384_update(&ctx, buf, sizeof(buf)));
+ assertEqualInt(ARCHIVE_OK, archive_sha384_final(&ctx, md));
+ assertEqualMem(md, actualmd, sizeof(md));
+}
+
+DEFINE_TEST(test_archive_sha512)
+{
+ archive_sha512_ctx ctx;
+ unsigned char buf[] = "";
+ unsigned char md[64];
+ unsigned char actualmd[] = "\xb8\x24\x4d\x02\x89\x81\xd6\x93"
+ "\xaf\x7b\x45\x6a\xf8\xef\xa4\xca"
+ "\xd6\x3d\x28\x2e\x19\xff\x14\x94"
+ "\x2c\x24\x6e\x50\xd9\x35\x1d\x22"
+ "\x70\x4a\x80\x2a\x71\xc3\x58\x0b"
+ "\x63\x70\xde\x4c\xeb\x29\x3c\x32"
+ "\x4a\x84\x23\x34\x25\x57\xd4\xe5"
+ "\xc3\x84\x38\xf0\xe3\x69\x10\xee";
+
+ if (ARCHIVE_OK != archive_sha512_init(&ctx)) {
+ skipping("This platform does not support SHA512");
+ return;
+ }
+ assertEqualInt(ARCHIVE_OK, archive_sha512_update(&ctx, buf, sizeof(buf)));
+ assertEqualInt(ARCHIVE_OK, archive_sha512_final(&ctx, md));
+ assertEqualMem(md, actualmd, sizeof(md));
+}
diff --git a/contrib/libarchive/libarchive/test/test_archive_read_close_twice.c b/contrib/libarchive/libarchive/test/test_archive_read_close_twice.c
new file mode 100644
index 000000000000..d69054b4fe5a
--- /dev/null
+++ b/contrib/libarchive/libarchive/test/test_archive_read_close_twice.c
@@ -0,0 +1,43 @@
+/*-
+ * Copyright (c) 2003-2010 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.
+ */
+
+#include "test.h"
+__FBSDID("$FreeBSD$");
+
+
+DEFINE_TEST(test_archive_read_close_twice)
+{
+ struct archive* a = archive_read_new();
+
+ assertEqualInt(0, archive_read_close(a));
+ assertEqualInt(0, archive_errno(a));
+ assertEqualString(NULL, archive_error_string(a));
+
+ assertEqualInt(0, archive_read_close(a));
+ assertEqualInt(0, archive_errno(a));
+ assertEqualString(NULL, archive_error_string(a));
+
+ archive_read_finish(a);
+}
diff --git a/contrib/libarchive/libarchive/test/test_archive_read_close_twice_open_fd.c b/contrib/libarchive/libarchive/test/test_archive_read_close_twice_open_fd.c
new file mode 100644
index 000000000000..d30735e4c48b
--- /dev/null
+++ b/contrib/libarchive/libarchive/test/test_archive_read_close_twice_open_fd.c
@@ -0,0 +1,47 @@
+/*-
+ * Copyright (c) 2011 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.
+ */
+
+#include "test.h"
+__FBSDID("$FreeBSD$");
+
+DEFINE_TEST(test_archive_read_close_twice_open_fd)
+{
+ struct archive* a = archive_read_new();
+
+ assertEqualInt(ARCHIVE_OK, archive_read_support_format_empty(a));
+ assertEqualInt(ARCHIVE_OK, archive_read_open_fd(a, 0, 0));
+ assertEqualInt(0, archive_errno(a));
+ assertEqualString(NULL, archive_error_string(a));
+
+ assertEqualInt(ARCHIVE_OK, archive_read_close(a));
+ assertEqualInt(0, archive_errno(a));
+ assertEqualString(NULL, archive_error_string(a));
+
+ assertEqualInt(ARCHIVE_OK, archive_read_close(a));
+ assertEqualInt(0, archive_errno(a));
+ assertEqualString(NULL, archive_error_string(a));
+
+ assertEqualInt(ARCHIVE_OK, archive_read_finish(a));
+}
diff --git a/contrib/libarchive/libarchive/test/test_archive_read_close_twice_open_filename.c b/contrib/libarchive/libarchive/test/test_archive_read_close_twice_open_filename.c
new file mode 100644
index 000000000000..456b6d688e55
--- /dev/null
+++ b/contrib/libarchive/libarchive/test/test_archive_read_close_twice_open_filename.c
@@ -0,0 +1,47 @@
+/*-
+ * Copyright (c) 2011 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.
+ */
+
+#include "test.h"
+__FBSDID("$FreeBSD$");
+
+DEFINE_TEST(test_archive_read_close_twice_open_filename)
+{
+ struct archive* a = archive_read_new();
+
+ assertEqualInt(ARCHIVE_OK, archive_read_support_format_empty(a));
+ assertEqualInt(ARCHIVE_OK, archive_read_open_filename(a, 0, 0));
+ assertEqualInt(0, archive_errno(a));
+ assertEqualString(NULL, archive_error_string(a));
+
+ assertEqualInt(ARCHIVE_OK, archive_read_close(a));
+ assertEqualInt(0, archive_errno(a));
+ assertEqualString(NULL, archive_error_string(a));
+
+ assertEqualInt(ARCHIVE_OK, archive_read_close(a));
+ assertEqualInt(0, archive_errno(a));
+ assertEqualString(NULL, archive_error_string(a));
+
+ assertEqualInt(ARCHIVE_OK, archive_read_finish(a));
+}
diff --git a/contrib/libarchive/libarchive/test/test_archive_read_next_header_empty.c b/contrib/libarchive/libarchive/test/test_archive_read_next_header_empty.c
new file mode 100644
index 000000000000..f650bccce89b
--- /dev/null
+++ b/contrib/libarchive/libarchive/test/test_archive_read_next_header_empty.c
@@ -0,0 +1,111 @@
+/*-
+ * Copyright (c) 2003-2011 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.
+ */
+
+#include "test.h"
+__FBSDID("$FreeBSD$");
+
+static void
+test_empty_file1(void)
+{
+ struct archive* a = archive_read_new();
+
+ /* Try opening an empty file with the raw handler. */
+ assertEqualInt(ARCHIVE_OK, archive_read_support_format_raw(a));
+ assertEqualInt(0, archive_errno(a));
+ assertEqualString(NULL, archive_error_string(a));
+
+ /* Raw handler doesn't support empty files. */
+ assertEqualInt(ARCHIVE_FATAL, archive_read_open_filename(a, "emptyfile", 0));
+ assert(NULL != archive_error_string(a));
+
+ archive_read_free(a);
+}
+
+static void
+test_empty_file2(void)
+{
+ struct archive* a = archive_read_new();
+ struct archive_entry* e;
+
+ /* Try opening an empty file with raw and empty handlers. */
+ assertEqualInt(ARCHIVE_OK, archive_read_support_format_raw(a));
+ assertEqualInt(ARCHIVE_OK, archive_read_support_format_empty(a));
+ assertEqualInt(0, archive_errno(a));
+ assertEqualString(NULL, archive_error_string(a));
+
+ assertEqualInt(ARCHIVE_OK, archive_read_open_filename(a, "emptyfile", 0));
+ assertEqualInt(0, archive_errno(a));
+ assertEqualString(NULL, archive_error_string(a));
+
+ assertEqualInt(ARCHIVE_EOF, archive_read_next_header(a, &e));
+ assertEqualInt(0, archive_errno(a));
+ assertEqualString(NULL, archive_error_string(a));
+
+ archive_read_free(a);
+}
+
+static void
+test_empty_tarfile(void)
+{
+ struct archive* a = archive_read_new();
+ struct archive_entry* e;
+
+ /* Try opening an empty file with raw and empty handlers. */
+ assertEqualInt(ARCHIVE_OK, archive_read_support_format_tar(a));
+ assertEqualInt(0, archive_errno(a));
+ assertEqualString(NULL, archive_error_string(a));
+
+ assertEqualInt(ARCHIVE_OK, archive_read_open_filename(a, "empty.tar", 0));
+ assertEqualInt(0, archive_errno(a));
+ assertEqualString(NULL, archive_error_string(a));
+
+ assertEqualInt(ARCHIVE_EOF, archive_read_next_header(a, &e));
+ assertEqualInt(0, archive_errno(a));
+ assertEqualString(NULL, archive_error_string(a));
+
+ archive_read_free(a);
+}
+
+/* 512 zero bytes. */
+static char nulls[512];
+
+DEFINE_TEST(test_archive_read_next_header_empty)
+{
+ FILE *f;
+
+ /* Create an empty file. */
+ f = fopen("emptyfile", "wb");
+ fclose(f);
+
+ /* Create a file with 512 zero bytes. */
+ f = fopen("empty.tar", "wb");
+ assertEqualInt(512, fwrite(nulls, 1, 512, f));
+ fclose(f);
+
+ test_empty_file1();
+ test_empty_file2();
+ test_empty_tarfile();
+
+}
diff --git a/contrib/libarchive/libarchive/test/test_archive_read_next_header_raw.c b/contrib/libarchive/libarchive/test/test_archive_read_next_header_raw.c
new file mode 100644
index 000000000000..1c8af20f8c3e
--- /dev/null
+++ b/contrib/libarchive/libarchive/test/test_archive_read_next_header_raw.c
@@ -0,0 +1,65 @@
+/*-
+ * Copyright (c) 2011 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.
+ */
+
+#include "test.h"
+__FBSDID("$FreeBSD$");
+
+#define DATA "random garbage for testing purposes"
+
+static const char data[sizeof(DATA)] = DATA;
+
+static void
+test(int skip_explicitely)
+{
+ struct archive* a = archive_read_new();
+ struct archive_entry* e;
+
+ assertEqualInt(ARCHIVE_OK, archive_read_support_format_raw(a));
+ assertEqualInt(0, archive_errno(a));
+ assertEqualString(NULL, archive_error_string(a));
+
+ assertEqualInt(ARCHIVE_OK, archive_read_open_memory(a,
+ (void *)(uintptr_t) data, sizeof(data)));
+ assertEqualString(NULL, archive_error_string(a));
+
+ assertEqualInt(ARCHIVE_OK, archive_read_next_header(a, &e));
+ assertEqualInt(0, archive_errno(a));
+ assertEqualString(NULL, archive_error_string(a));
+
+ if (skip_explicitely)
+ assertEqualInt(ARCHIVE_OK, archive_read_data_skip(a));
+
+ assertEqualInt(ARCHIVE_EOF, archive_read_next_header(a, &e));
+ assertEqualInt(0, archive_errno(a));
+ assertEqualString(NULL, archive_error_string(a));
+
+ archive_read_free(a);
+}
+
+DEFINE_TEST(test_archive_read_next_header_raw)
+{
+ test(1);
+ test(0);
+}
diff --git a/contrib/libarchive/libarchive/test/test_archive_read_open2.c b/contrib/libarchive/libarchive/test/test_archive_read_open2.c
new file mode 100644
index 000000000000..0a801ac5d26d
--- /dev/null
+++ b/contrib/libarchive/libarchive/test/test_archive_read_open2.c
@@ -0,0 +1,109 @@
+/*-
+ * Copyright (c) 2011 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.
+ */
+#include "test.h"
+__FBSDID("$FreeBSD$");
+
+static int
+open_cb(struct archive *a, void *client)
+{
+ (void)a; /* UNUSED */
+ (void)client; /* UNUSED */
+ return 0;
+}
+static ssize_t
+read_cb(struct archive *a, void *client, const void **buff)
+{
+ (void)a; /* UNUSED */
+ (void)client; /* UNUSED */
+ (void)buff; /* UNUSED */
+ return (ssize_t)0;
+}
+static int64_t
+skip_cb(struct archive *a, void *client, int64_t request)
+{
+ (void)a; /* UNUSED */
+ (void)client; /* UNUSED */
+ (void)request; /* UNUSED */
+ return (int64_t)0;
+}
+static int
+close_cb(struct archive *a, void *client)
+{
+ (void)a; /* UNUSED */
+ (void)client; /* UNUSED */
+ return 0;
+}
+
+static void
+test(int formatted, archive_open_callback *o, archive_read_callback *r,
+ archive_skip_callback *s, archive_close_callback *c,
+ int rv, const char *msg)
+{
+ struct archive* a = archive_read_new();
+ if (formatted)
+ assertEqualInt(ARCHIVE_OK,
+ archive_read_support_format_empty(a));
+ assertEqualInt(rv,
+ archive_read_open2(a, NULL, o, r, s, c));
+ assertEqualString(msg, archive_error_string(a));
+ archive_read_free(a);
+}
+
+DEFINE_TEST(test_archive_read_open2)
+{
+ const char *no_reader =
+ "No reader function provided to archive_read_open";
+ const char *no_formats = "No formats registered";
+
+ test(1, NULL, NULL, NULL, NULL,
+ ARCHIVE_FATAL, no_reader);
+ test(1, open_cb, NULL, NULL, NULL,
+ ARCHIVE_FATAL, no_reader);
+ test(1, open_cb, read_cb, NULL, NULL,
+ ARCHIVE_OK, NULL);
+ test(1, open_cb, read_cb, skip_cb, NULL,
+ ARCHIVE_OK, NULL);
+ test(1, open_cb, read_cb, skip_cb, close_cb,
+ ARCHIVE_OK, NULL);
+ test(1, NULL, read_cb, skip_cb, close_cb,
+ ARCHIVE_OK, NULL);
+ test(1, open_cb, read_cb, skip_cb, NULL,
+ ARCHIVE_OK, NULL);
+ test(1, NULL, read_cb, skip_cb, NULL,
+ ARCHIVE_OK, NULL);
+ test(1, NULL, read_cb, NULL, NULL,
+ ARCHIVE_OK, NULL);
+
+ test(0, NULL, NULL, NULL, NULL,
+ ARCHIVE_FATAL, no_reader);
+ test(0, open_cb, NULL, NULL, NULL,
+ ARCHIVE_FATAL, no_reader);
+ test(0, open_cb, read_cb, NULL, NULL,
+ ARCHIVE_FATAL, no_formats);
+ test(0, open_cb, read_cb, skip_cb, NULL,
+ ARCHIVE_FATAL, no_formats);
+ test(0, open_cb, read_cb, skip_cb, close_cb,
+ ARCHIVE_FATAL, no_formats);
+}
diff --git a/contrib/libarchive/libarchive/test/test_archive_read_set_filter_option.c b/contrib/libarchive/libarchive/test/test_archive_read_set_filter_option.c
new file mode 100644
index 000000000000..7ff3c267947d
--- /dev/null
+++ b/contrib/libarchive/libarchive/test/test_archive_read_set_filter_option.c
@@ -0,0 +1,55 @@
+/*-
+ * Copyright (c) 2011 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.
+ */
+
+#include "test.h"
+__FBSDID("$FreeBSD$");
+
+#define should(__a, __code, __m, __o, __v) \
+assertEqualInt(__code, archive_read_set_filter_option(__a, __m, __o, __v))
+
+static void
+test(int pristine)
+{
+ struct archive* a = archive_read_new();
+
+ if (!pristine)
+ archive_read_support_filter_all(a);
+
+ should(a, ARCHIVE_OK, NULL, NULL, NULL);
+ should(a, ARCHIVE_OK, "", "", "");
+
+ should(a, ARCHIVE_FAILED, NULL, "fubar", NULL);
+ should(a, ARCHIVE_FAILED, NULL, "fubar", "snafu");
+ should(a, ARCHIVE_FAILED, "fubar", "snafu", NULL);
+ should(a, ARCHIVE_FAILED, "fubar", "snafu", "betcha");
+
+ archive_read_finish(a);
+}
+
+DEFINE_TEST(test_archive_read_set_filter_option)
+{
+ test(1);
+ test(0);
+}
diff --git a/contrib/libarchive/libarchive/test/test_archive_read_set_format_option.c b/contrib/libarchive/libarchive/test/test_archive_read_set_format_option.c
new file mode 100644
index 000000000000..e1aac574e158
--- /dev/null
+++ b/contrib/libarchive/libarchive/test/test_archive_read_set_format_option.c
@@ -0,0 +1,67 @@
+/*-
+ * Copyright (c) 2011 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.
+ */
+
+#include "test.h"
+__FBSDID("$FreeBSD$");
+
+#define should(__a, __code, __m, __o, __v) \
+assertEqualInt(__code, archive_read_set_format_option(__a, __m, __o, __v))
+
+static void
+test(int pristine)
+{
+ struct archive* a = archive_read_new();
+ int known_option_rv = pristine ? ARCHIVE_FAILED : ARCHIVE_OK;
+
+ if (!pristine)
+ archive_read_support_format_all(a);
+
+ /* NULL and "" denote `no option', so they're ok no matter
+ * what, if any, formats are registered */
+ should(a, ARCHIVE_OK, NULL, NULL, NULL);
+ should(a, ARCHIVE_OK, "", "", "");
+
+ /* unknown modules and options */
+ should(a, ARCHIVE_FAILED, "fubar", "snafu", NULL);
+ should(a, ARCHIVE_FAILED, "fubar", "snafu", "betcha");
+
+ /* unknown modules and options */
+ should(a, ARCHIVE_FAILED, NULL, "snafu", NULL);
+ should(a, ARCHIVE_FAILED, NULL, "snafu", "betcha");
+
+ /* ARCHIVE_OK with iso9660 loaded, ARCHIVE_WARN otherwise */
+ should(a, known_option_rv, "iso9660", "joliet", NULL);
+ should(a, known_option_rv, "iso9660", "joliet", NULL);
+ should(a, known_option_rv, NULL, "joliet", NULL);
+ should(a, known_option_rv, NULL, "joliet", NULL);
+
+ archive_read_finish(a);
+}
+
+DEFINE_TEST(test_archive_read_set_format_option)
+{
+ test(1);
+ test(0);
+}
diff --git a/contrib/libarchive/libarchive/test/test_archive_read_set_option.c b/contrib/libarchive/libarchive/test/test_archive_read_set_option.c
new file mode 100644
index 000000000000..2ad5b0bda8e2
--- /dev/null
+++ b/contrib/libarchive/libarchive/test/test_archive_read_set_option.c
@@ -0,0 +1,69 @@
+/*-
+ * Copyright (c) 2011 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.
+ */
+
+#include "test.h"
+__FBSDID("$FreeBSD$");
+
+#define should(__a, __code, __m, __o, __v) \
+assertEqualInt(__code, archive_read_set_option(__a, __m, __o, __v))
+
+static void
+test(int pristine)
+{
+ struct archive* a = archive_read_new();
+ int known_option_rv = pristine ? ARCHIVE_FAILED : ARCHIVE_OK;
+
+ if (!pristine) {
+ archive_read_support_filter_all(a);
+ archive_read_support_format_all(a);
+ }
+
+ /* NULL and "" denote `no option', so they're ok no matter
+ * what, if any, formats are registered */
+ should(a, ARCHIVE_OK, NULL, NULL, NULL);
+ should(a, ARCHIVE_OK, "", "", "");
+
+ /* unknown modules and options */
+ should(a, ARCHIVE_FAILED, "fubar", "snafu", NULL);
+ should(a, ARCHIVE_FAILED, "fubar", "snafu", "betcha");
+
+ /* unknown modules and options */
+ should(a, ARCHIVE_FAILED, NULL, "snafu", NULL);
+ should(a, ARCHIVE_FAILED, NULL, "snafu", "betcha");
+
+ /* ARCHIVE_OK with iso9660 loaded, ARCHIVE_WARN otherwise */
+ should(a, known_option_rv, "iso9660", "joliet", NULL);
+ should(a, known_option_rv, "iso9660", "joliet", NULL);
+ should(a, known_option_rv, NULL, "joliet", NULL);
+ should(a, known_option_rv, NULL, "joliet", NULL);
+
+ archive_read_finish(a);
+}
+
+DEFINE_TEST(test_archive_read_set_option)
+{
+ test(1);
+ test(0);
+}
diff --git a/contrib/libarchive/libarchive/test/test_archive_read_set_options.c b/contrib/libarchive/libarchive/test/test_archive_read_set_options.c
new file mode 100644
index 000000000000..297d8fe8bf8f
--- /dev/null
+++ b/contrib/libarchive/libarchive/test/test_archive_read_set_options.c
@@ -0,0 +1,126 @@
+/*-
+ * Copyright (c) 2011 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.
+ */
+
+#include "test.h"
+__FBSDID("$FreeBSD$");
+
+#define should(__a, __code, __opts) \
+assertEqualInt(__code, archive_read_set_options(__a, __opts))
+
+static void
+test(int pristine)
+{
+ struct archive* a = archive_read_new();
+ int halfempty_options_rv = pristine ? ARCHIVE_FAILED : ARCHIVE_OK;
+ int known_option_rv = pristine ? ARCHIVE_FAILED : ARCHIVE_OK;
+
+ if (!pristine) {
+ archive_read_support_filter_all(a);
+ archive_read_support_format_all(a);
+ }
+
+ /* NULL and "" denote `no option', so they're ok no matter
+ * what, if any, formats are registered */
+ should(a, ARCHIVE_OK, NULL);
+ should(a, ARCHIVE_OK, "");
+
+ /* unknown modules and options */
+ should(a, ARCHIVE_FAILED, "fubar:snafu");
+ assertEqualString("Unknown module name: `fubar'",
+ archive_error_string(a));
+ should(a, ARCHIVE_FAILED, "fubar:snafu=betcha");
+ assertEqualString("Unknown module name: `fubar'",
+ archive_error_string(a));
+
+ /* unknown modules and options */
+ should(a, ARCHIVE_FAILED, "snafu");
+ assertEqualString("Undefined option: `snafu'",
+ archive_error_string(a));
+ should(a, ARCHIVE_FAILED, "snafu=betcha");
+ assertEqualString("Undefined option: `snafu'",
+ archive_error_string(a));
+
+ /* ARCHIVE_OK with iso9660 loaded, ARCHIVE_FAILED otherwise */
+ should(a, known_option_rv, "iso9660:joliet");
+ if (pristine) {
+ assertEqualString("Unknown module name: `iso9660'",
+ archive_error_string(a));
+ }
+ should(a, known_option_rv, "iso9660:joliet");
+ if (pristine) {
+ assertEqualString("Unknown module name: `iso9660'",
+ archive_error_string(a));
+ }
+ should(a, known_option_rv, "joliet");
+ if (pristine) {
+ assertEqualString("Undefined option: `joliet'",
+ archive_error_string(a));
+ }
+ should(a, known_option_rv, "!joliet");
+ if (pristine) {
+ assertEqualString("Undefined option: `joliet'",
+ archive_error_string(a));
+ }
+
+ should(a, ARCHIVE_OK, ",");
+ should(a, ARCHIVE_OK, ",,");
+
+ should(a, halfempty_options_rv, ",joliet");
+ if (pristine) {
+ assertEqualString("Undefined option: `joliet'",
+ archive_error_string(a));
+ }
+ should(a, halfempty_options_rv, "joliet,");
+ if (pristine) {
+ assertEqualString("Undefined option: `joliet'",
+ archive_error_string(a));
+ }
+
+ should(a, ARCHIVE_FAILED, "joliet,snafu");
+ if (pristine) {
+ assertEqualString("Undefined option: `joliet'",
+ archive_error_string(a));
+ } else {
+ assertEqualString("Undefined option: `snafu'",
+ archive_error_string(a));
+ }
+
+ should(a, ARCHIVE_FAILED, "iso9660:snafu");
+ if (pristine) {
+ assertEqualString("Unknown module name: `iso9660'",
+ archive_error_string(a));
+ } else {
+ assertEqualString("Undefined option: `iso9660:snafu'",
+ archive_error_string(a));
+ }
+
+ archive_read_finish(a);
+}
+
+DEFINE_TEST(test_archive_read_set_options)
+{
+ test(1);
+ test(0);
+}
diff --git a/contrib/libarchive/libarchive/test/test_archive_read_support.c b/contrib/libarchive/libarchive/test/test_archive_read_support.c
new file mode 100644
index 000000000000..1619b0729e94
--- /dev/null
+++ b/contrib/libarchive/libarchive/test/test_archive_read_support.c
@@ -0,0 +1,98 @@
+/*-
+ * Copyright (c) 2011 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.
+ */
+#include "test.h"
+__FBSDID("$FreeBSD$");
+
+/*
+ * Verify that the various archive_read_support_* functions
+ * return appropriate errors when invoked on the wrong kind of
+ * archive handle.
+ */
+
+typedef struct archive *constructor(void);
+typedef int enabler(struct archive *);
+typedef int destructor(struct archive *);
+
+static void
+test_success(constructor new_, enabler enable_, destructor free_)
+{
+ struct archive *a = new_();
+ int result = enable_(a);
+ if (result == ARCHIVE_WARN) {
+ assert(NULL != archive_error_string(a));
+ assertEqualIntA(a, -1, archive_errno(a));
+ } else {
+ assertEqualIntA(a, ARCHIVE_OK, result);
+ assert(NULL == archive_error_string(a));
+ assertEqualIntA(a, 0, archive_errno(a));
+ }
+ free_(a);
+}
+
+static void
+test_failure(constructor new_, enabler enable_, destructor free_)
+{
+ struct archive *a = new_();
+ assertEqualIntA(a, ARCHIVE_FATAL, enable_(a));
+ assert(NULL != archive_error_string(a));
+ assertEqualIntA(a, -1, archive_errno(a));
+ free_(a);
+}
+
+static void
+test_filter_or_format(enabler enable)
+{
+ test_success(archive_read_new, enable, archive_read_free);
+ test_failure(archive_write_new, enable, archive_write_free);
+ test_failure(archive_read_disk_new, enable, archive_read_free);
+ test_failure(archive_write_disk_new, enable, archive_write_free);
+}
+
+DEFINE_TEST(test_archive_read_support)
+{
+ test_filter_or_format(archive_read_support_format_7zip);
+ test_filter_or_format(archive_read_support_format_all);
+ test_filter_or_format(archive_read_support_format_ar);
+ test_filter_or_format(archive_read_support_format_cab);
+ test_filter_or_format(archive_read_support_format_cpio);
+ test_filter_or_format(archive_read_support_format_empty);
+ test_filter_or_format(archive_read_support_format_iso9660);
+ test_filter_or_format(archive_read_support_format_lha);
+ test_filter_or_format(archive_read_support_format_mtree);
+ test_filter_or_format(archive_read_support_format_tar);
+ test_filter_or_format(archive_read_support_format_xar);
+ test_filter_or_format(archive_read_support_format_zip);
+
+ test_filter_or_format(archive_read_support_filter_all);
+ test_filter_or_format(archive_read_support_filter_bzip2);
+ test_filter_or_format(archive_read_support_filter_compress);
+ test_filter_or_format(archive_read_support_filter_gzip);
+ test_filter_or_format(archive_read_support_filter_lzip);
+ test_filter_or_format(archive_read_support_filter_lzma);
+ test_filter_or_format(archive_read_support_filter_none);
+ test_filter_or_format(archive_read_support_filter_rpm);
+ test_filter_or_format(archive_read_support_filter_uu);
+ test_filter_or_format(archive_read_support_filter_xz);
+}
diff --git a/contrib/libarchive/libarchive/test/test_archive_set_error.c b/contrib/libarchive/libarchive/test/test_archive_set_error.c
new file mode 100644
index 000000000000..18897fbda8d2
--- /dev/null
+++ b/contrib/libarchive/libarchive/test/test_archive_set_error.c
@@ -0,0 +1,51 @@
+/*-
+ * Copyright (c) 2011 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.
+ */
+
+#include "test.h"
+__FBSDID("$FreeBSD$");
+
+static void
+test(struct archive *a, int code, const char *msg)
+{
+ archive_set_error(a, code, "%s", msg);
+
+ assertEqualInt(code, archive_errno(a));
+ assertEqualString(msg, archive_error_string(a));
+}
+
+DEFINE_TEST(test_archive_set_error)
+{
+ struct archive* a = archive_read_new();
+
+ /* unlike printf("%s", NULL),
+ * archive_set_error(a, code, "%s", NULL)
+ * segfaults, so it's not tested here */
+ test(a, 12, "abcdefgh");
+ test(a, 0, "123456");
+ test(a, -1, "tuvw");
+ test(a, 34, "XYZ");
+
+ archive_read_finish(a);
+}
diff --git a/contrib/libarchive/libarchive/test/test_archive_string.c b/contrib/libarchive/libarchive/test/test_archive_string.c
new file mode 100644
index 000000000000..54f68bdaed1a
--- /dev/null
+++ b/contrib/libarchive/libarchive/test/test_archive_string.c
@@ -0,0 +1,344 @@
+/*-
+ * Copyright (c) 2011 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.
+ */
+#include "test.h"
+__FBSDID("$FreeBSD$");
+
+#define __LIBARCHIVE_TEST
+#include "archive_string.h"
+
+#define EXTENT 32
+
+#define assertStringSizes(strlen, buflen, as) \
+ assertEqualInt(strlen, (as).length); \
+ assertEqualInt(buflen, (as).buffer_length);
+
+#define assertExactString(strlen, buflen, data, as) \
+ do { \
+ assertStringSizes(strlen, buflen, as); \
+ assertEqualString(data, (as).s); \
+ } while (0)
+
+#define assertNonNULLString(strlen, buflen, as) \
+ do { \
+ assertStringSizes(strlen, buflen, as); \
+ assert(NULL != (as).s); \
+ } while (0)
+
+static void
+test_archive_string_ensure(void)
+{
+ struct archive_string s;
+
+ archive_string_init(&s);
+ assertExactString(0, 0, NULL, s);
+
+ /* single-extent allocation */
+ assert(&s == archive_string_ensure(&s, 5));
+ assertNonNULLString(0, EXTENT, s);
+
+ /* what happens around extent boundaries? */
+ assert(&s == archive_string_ensure(&s, EXTENT - 1));
+ assertNonNULLString(0, EXTENT, s);
+
+ assert(&s == archive_string_ensure(&s, EXTENT));
+ assertNonNULLString(0, EXTENT, s);
+
+ assert(&s == archive_string_ensure(&s, EXTENT + 1));
+ assertNonNULLString(0, 2 * EXTENT, s);
+}
+
+static void
+test_archive_strcat(void)
+{
+ struct archive_string s;
+
+ archive_string_init(&s);
+ assertExactString(0, 0, NULL, s);
+
+ /* null target, empty source */
+ assert(&s == archive_strcat(&s, ""));
+ assertExactString(0, EXTENT, "", s);
+
+ /* empty target, empty source */
+ assert(&s == archive_strcat(&s, ""));
+ assertExactString(0, EXTENT, "", s);
+
+ /* empty target, non-empty source */
+ assert(&s == archive_strcat(&s, "fubar"));
+ assertExactString(5, EXTENT, "fubar", s);
+
+ /* non-empty target, non-empty source */
+ assert(&s == archive_strcat(&s, "baz"));
+ assertExactString(8, EXTENT, "fubarbaz", s);
+}
+
+static void
+test_archive_strappend_char(void)
+{
+ struct archive_string s;
+
+ archive_string_init(&s);
+ assertExactString(0, 0, NULL, s);
+
+ /* null target */
+ archive_strappend_char(&s, 'X');
+ assertExactString(1, EXTENT, "X", s);
+
+ /* non-empty target */
+ archive_strappend_char(&s, 'Y');
+ assertExactString(2, EXTENT, "XY", s);
+}
+
+/* archive_strnXXX() tests focus on length handling.
+ * other behaviors are tested by proxy through archive_strXXX()
+ */
+
+static void
+test_archive_strncat(void)
+{
+ struct archive_string s;
+
+ archive_string_init(&s);
+ assertExactString(0, 0, NULL, s);
+
+ /* perfect length */
+ assert(&s == archive_strncat(&s, "snafu", 5));
+ assertExactString(5, EXTENT, "snafu", s);
+
+ /* short read */
+ assert(&s == archive_strncat(&s, "barbazqux", 3));
+ assertExactString(8, EXTENT, "snafubar", s);
+
+ /* long read is ok too! */
+ assert(&s == archive_strncat(&s, "snafu", 8));
+ assertExactString(13, EXTENT, "snafubarsnafu", s);
+}
+
+static void
+test_archive_strncpy(void)
+{
+ struct archive_string s;
+
+ archive_string_init(&s);
+ assertExactString(0, 0, NULL, s);
+
+ /* perfect length */
+ assert(&s == archive_strncpy(&s, "fubar", 5));
+ assertExactString(5, EXTENT, "fubar", s);
+
+ /* short read */
+ assert(&s == archive_strncpy(&s, "snafubar", 5));
+ assertExactString(5, EXTENT, "snafu", s);
+
+ /* long read is ok too! */
+ assert(&s == archive_strncpy(&s, "snafu", 8));
+ assertExactString(5, EXTENT, "snafu", s);
+}
+
+static void
+test_archive_strcpy(void)
+{
+ struct archive_string s;
+
+ archive_string_init(&s);
+ assertExactString(0, 0, NULL, s);
+
+ /* null target */
+ assert(&s == archive_strcpy(&s, "snafu"));
+ assertExactString(5, EXTENT, "snafu", s);
+
+ /* dirty target */
+ assert(&s == archive_strcpy(&s, "foo"));
+ assertExactString(3, EXTENT, "foo", s);
+
+ /* dirty target, empty source */
+ assert(&s == archive_strcpy(&s, ""));
+ assertExactString(0, EXTENT, "", s);
+}
+
+static void
+test_archive_string_concat(void)
+{
+ struct archive_string s, t, u, v;
+
+ archive_string_init(&s);
+ assertExactString(0, 0, NULL, s);
+ archive_string_init(&t);
+ assertExactString(0, 0, NULL, t);
+ archive_string_init(&u);
+ assertExactString(0, 0, NULL, u);
+ archive_string_init(&v);
+ assertExactString(0, 0, NULL, v);
+
+ /* null target, null source */
+ archive_string_concat(&t, &s);
+ assertExactString(0, 0, NULL, s);
+ assertExactString(0, EXTENT, "", t);
+
+ /* null target, empty source */
+ assert(&s == archive_strcpy(&s, ""));
+ archive_string_concat(&u, &s);
+ assertExactString(0, EXTENT, "", s);
+ assertExactString(0, EXTENT, "", u);
+
+ /* null target, non-empty source */
+ assert(&s == archive_strcpy(&s, "foo"));
+ archive_string_concat(&v, &s);
+ assertExactString(3, EXTENT, "foo", s);
+ assertExactString(3, EXTENT, "foo", v);
+
+ /* empty target, empty source */
+ assert(&s == archive_strcpy(&s, ""));
+ assert(&t == archive_strcpy(&t, ""));
+ archive_string_concat(&t, &s);
+ assertExactString(0, EXTENT, "", s);
+ assertExactString(0, EXTENT, "", t);
+
+ /* empty target, non-empty source */
+ assert(&s == archive_strcpy(&s, "snafu"));
+ assert(&t == archive_strcpy(&t, ""));
+ archive_string_concat(&t, &s);
+ assertExactString(5, EXTENT, "snafu", s);
+ assertExactString(5, EXTENT, "snafu", t);
+}
+
+static void
+test_archive_string_copy(void)
+{
+ struct archive_string s, t, u, v;
+
+ archive_string_init(&s);
+ assertExactString(0, 0, NULL, s);
+ archive_string_init(&t);
+ assertExactString(0, 0, NULL, t);
+ archive_string_init(&u);
+ assertExactString(0, 0, NULL, u);
+ archive_string_init(&v);
+ assertExactString(0, 0, NULL, v);
+
+ /* null target, null source */
+ archive_string_copy(&t, &s);
+ assertExactString(0, 0, NULL, s);
+ assertExactString(0, EXTENT, "", t);
+
+ /* null target, empty source */
+ archive_string_copy(&u, &t);
+ assertExactString(0, EXTENT, "", t);
+ assertExactString(0, EXTENT, "", u);
+
+ /* empty target, empty source */
+ archive_string_copy(&u, &t);
+ assertExactString(0, EXTENT, "", t);
+ assertExactString(0, EXTENT, "", u);
+
+ /* null target, non-empty source */
+ assert(NULL != archive_strcpy(&s, "snafubar"));
+ assertExactString(8, EXTENT, "snafubar", s);
+
+ archive_string_copy(&v, &s);
+ assertExactString(8, EXTENT, "snafubar", s);
+ assertExactString(8, EXTENT, "snafubar", v);
+
+ /* empty target, non-empty source */
+ assertExactString(0, EXTENT, "", t);
+ archive_string_copy(&t, &s);
+ assertExactString(8, EXTENT, "snafubar", s);
+ assertExactString(8, EXTENT, "snafubar", t);
+
+ /* non-empty target, non-empty source */
+ assert(NULL != archive_strcpy(&s, "fubar"));
+ assertExactString(5, EXTENT, "fubar", s);
+
+ archive_string_copy(&t, &s);
+ assertExactString(5, EXTENT, "fubar", s);
+ assertExactString(5, EXTENT, "fubar", t);
+}
+
+static void
+test_archive_string_sprintf(void)
+{
+ struct archive_string s;
+#define S16 "0123456789abcdef"
+#define S32 S16 S16
+#define S64 S32 S32
+#define S128 S64 S64
+ const char *s32 = S32;
+ const char *s33 = S32 "0";
+ const char *s64 = S64;
+ const char *s65 = S64 "0";
+ const char *s128 = S128;
+ const char *s129 = S128 "0";
+#undef S16
+#undef S32
+#undef S64
+#undef S128
+
+ archive_string_init(&s);
+ assertExactString(0, 0, NULL, s);
+
+ archive_string_sprintf(&s, "%s", "");
+ assertExactString(0, 2 * EXTENT, "", s);
+
+ archive_string_empty(&s);
+ archive_string_sprintf(&s, "%s", s32);
+ assertExactString(32, 2 * EXTENT, s32, s);
+
+ archive_string_empty(&s);
+ archive_string_sprintf(&s, "%s", s33);
+ assertExactString(33, 2 * EXTENT, s33, s);
+
+ archive_string_empty(&s);
+ archive_string_sprintf(&s, "%s", s64);
+ assertExactString(64, 4 * EXTENT, s64, s);
+
+ archive_string_empty(&s);
+ archive_string_sprintf(&s, "%s", s65);
+ assertExactString(65, 4 * EXTENT, s65, s);
+
+ archive_string_empty(&s);
+ archive_string_sprintf(&s, "%s", s128);
+ assertExactString(128, 8 * EXTENT, s128, s);
+
+ archive_string_empty(&s);
+ archive_string_sprintf(&s, "%s", s129);
+ assertExactString(129, 8 * EXTENT, s129, s);
+
+ archive_string_empty(&s);
+ archive_string_sprintf(&s, "%d", 1234567890);
+ assertExactString(10, 8 * EXTENT, "1234567890", s);
+}
+
+DEFINE_TEST(test_archive_string)
+{
+ test_archive_string_ensure();
+ test_archive_strcat();
+ test_archive_strappend_char();
+ test_archive_strncat();
+ test_archive_strncpy();
+ test_archive_strcpy();
+ test_archive_string_concat();
+ test_archive_string_copy();
+ test_archive_string_sprintf();
+}
diff --git a/contrib/libarchive/libarchive/test/test_archive_string_conversion.c b/contrib/libarchive/libarchive/test/test_archive_string_conversion.c
new file mode 100644
index 000000000000..8b833ea6f705
--- /dev/null
+++ b/contrib/libarchive/libarchive/test/test_archive_string_conversion.c
@@ -0,0 +1,629 @@
+/*-
+ * Copyright (c) 2011 Michihiro NAKAJIMA
+ * 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.
+ */
+#include "test.h"
+__FBSDID("$FreeBSD$");
+
+#include <locale.h>
+
+#define __LIBARCHIVE_TEST
+#include "archive_string.h"
+
+/*
+Execute the following to rebuild the data for this program:
+ tail -n +36 test_archive_string_conversion.c | /bin/sh
+#
+# This requires http://unicode.org/Public/UNIDATA/NormalizationTest.txt
+#
+if="NormalizationTest.txt"
+if [ ! -f ${if} ]; then
+ echo "Not found: \"${if}\""
+ exit 0
+fi
+of=test_archive_string_conversion.txt.Z
+echo "\$FreeBSD\$" > ${of}.uu
+awk -F ';' '$0 ~/^[0-9A-F]+/ {printf "%s;%s\n", $2, $3}' ${if} | compress | uuencode ${of} >> ${of}.uu
+exit 1
+*/
+
+static int
+unicode_to_utf8(char *p, uint32_t uc)
+{
+ char *_p = p;
+
+ /* Translate code point to UTF8 */
+ if (uc <= 0x7f) {
+ *p++ = (char)uc;
+ } else if (uc <= 0x7ff) {
+ *p++ = 0xc0 | ((uc >> 6) & 0x1f);
+ *p++ = 0x80 | (uc & 0x3f);
+ } else if (uc <= 0xffff) {
+ *p++ = 0xe0 | ((uc >> 12) & 0x0f);
+ *p++ = 0x80 | ((uc >> 6) & 0x3f);
+ *p++ = 0x80 | (uc & 0x3f);
+ } else {
+ *p++ = 0xf0 | ((uc >> 18) & 0x07);
+ *p++ = 0x80 | ((uc >> 12) & 0x3f);
+ *p++ = 0x80 | ((uc >> 6) & 0x3f);
+ *p++ = 0x80 | (uc & 0x3f);
+ }
+ return ((int)(p - _p));
+}
+
+static void
+archive_be16enc(void *pp, uint16_t u)
+{
+ unsigned char *p = (unsigned char *)pp;
+
+ p[0] = (u >> 8) & 0xff;
+ p[1] = u & 0xff;
+}
+
+static int
+unicode_to_utf16be(char *p, uint32_t uc)
+{
+ char *utf16 = p;
+
+ if (uc > 0xffff) {
+ /* We have a code point that won't fit into a
+ * wchar_t; convert it to a surrogate pair. */
+ uc -= 0x10000;
+ archive_be16enc(utf16, ((uc >> 10) & 0x3ff) + 0xD800);
+ archive_be16enc(utf16+2, (uc & 0x3ff) + 0xDC00);
+ return (4);
+ } else {
+ archive_be16enc(utf16, uc);
+ return (2);
+ }
+}
+
+static void
+archive_le16enc(void *pp, uint16_t u)
+{
+ unsigned char *p = (unsigned char *)pp;
+
+ p[0] = u & 0xff;
+ p[1] = (u >> 8) & 0xff;
+}
+
+static size_t
+unicode_to_utf16le(char *p, uint32_t uc)
+{
+ char *utf16 = p;
+
+ if (uc > 0xffff) {
+ /* We have a code point that won't fit into a
+ * wchar_t; convert it to a surrogate pair. */
+ uc -= 0x10000;
+ archive_le16enc(utf16, ((uc >> 10) & 0x3ff) + 0xD800);
+ archive_le16enc(utf16+2, (uc & 0x3ff) + 0xDC00);
+ return (4);
+ } else {
+ archive_le16enc(utf16, uc);
+ return (2);
+ }
+}
+
+static int
+wc_size(void)
+{
+ return (sizeof(wchar_t));
+}
+
+static int
+unicode_to_wc(wchar_t *wp, uint32_t uc)
+{
+ if (wc_size() == 4) {
+ *wp = (wchar_t)uc;
+ return (1);
+ }
+ if (uc > 0xffff) {
+ /* We have a code point that won't fit into a
+ * wchar_t; convert it to a surrogate pair. */
+ uc -= 0x10000;
+ *wp++ = (wchar_t)(((uc >> 10) & 0x3ff) + 0xD800);
+ *wp = (wchar_t)((uc & 0x3ff) + 0xDC00);
+ return (2);
+ } else {
+ *wp = (wchar_t)uc;
+ return (1);
+ }
+}
+
+/*
+ * Note: U+2000 - U+2FFF, U+F900 - U+FAFF and U+2F800 - U+2FAFF are not
+ * converted to NFD on Mac OS.
+ * see also http://developer.apple.com/library/mac/#qa/qa2001/qa1173.html
+ */
+static int
+scan_unicode_pattern(char *out, wchar_t *wout, char *u16be, char *u16le,
+ const char *pattern, int exclude_mac_nfd)
+{
+ unsigned uc = 0;
+ const char *p = pattern;
+ char *op = out;
+ wchar_t *owp = wout;
+ char *op16be = u16be;
+ char *op16le = u16le;
+
+ for (;;) {
+ if (*p >= '0' && *p <= '9')
+ uc = (uc << 4) + (*p - '0');
+ else if (*p >= 'A' && *p <= 'F')
+ uc = (uc << 4) + (*p - 'A' + 0x0a);
+ else {
+ if (exclude_mac_nfd) {
+ /*
+ * These are not converted to NFD on Mac OS.
+ */
+ if ((uc >= 0x2000 && uc <= 0x2FFF) ||
+ (uc >= 0xF900 && uc <= 0xFAFF) ||
+ (uc >= 0x2F800 && uc <= 0x2FAFF))
+ return (-1);
+ /*
+ * Those code points are not converted to
+ * NFD on Mac OS. I do not know the reason
+ * because it is undocumented.
+ * NFC NFD
+ * 1109A ==> 11099 110BA
+ * 1109C ==> 1109B 110BA
+ * 110AB ==> 110A5 110BA
+ */
+ if (uc == 0x1109A || uc == 0x1109C ||
+ uc == 0x110AB)
+ return (-1);
+ }
+ op16be += unicode_to_utf16be(op16be, uc);
+ op16le += unicode_to_utf16le(op16le, uc);
+ owp += unicode_to_wc(owp, uc);
+ op += unicode_to_utf8(op, uc);
+ if (!*p) {
+ *op16be++ = 0;
+ *op16be = 0;
+ *op16le++ = 0;
+ *op16le = 0;
+ *owp = L'\0';
+ *op = '\0';
+ break;
+ }
+ uc = 0;
+ }
+ p++;
+ }
+ return (0);
+}
+
+static int
+is_wc_unicode(void)
+{
+#if defined(_WIN32) && !defined(__CYGWIN__)
+ return (1);
+#else
+ return (0);
+#endif
+}
+
+/*
+ * A conversion test that we correctly normalize UTF-8 and UTF-16BE characters.
+ * On Mac OS, the characters to be Form D.
+ * On other platforms, the characters to be Form C.
+ */
+static void
+test_archive_string_normalization(void)
+{
+ struct archive *a, *a2;
+ struct archive_entry *ae;
+ struct archive_string utf8;
+ struct archive_mstring mstr;
+ struct archive_string_conv *f_sconv8, *t_sconv8;
+ struct archive_string_conv *f_sconv16be, *f_sconv16le;
+ FILE *fp;
+ char buff[512];
+ static const char reffile[] = "test_archive_string_conversion.txt.Z";
+ ssize_t size;
+ int line = 0;
+ int locale_is_utf8, wc_is_unicode;
+
+ locale_is_utf8 = (NULL != setlocale(LC_ALL, "en_US.UTF-8"));
+ wc_is_unicode = is_wc_unicode();
+ /* If it doesn't exist, just warn and return. */
+ if (!locale_is_utf8 && !wc_is_unicode) {
+ skipping("invalid encoding tests require a suitable locale;"
+ " en_US.UTF-8 not available on this system");
+ return;
+ }
+
+ archive_string_init(&utf8);
+ memset(&mstr, 0, sizeof(mstr));
+
+ /*
+ * Extract a test pattern file.
+ */
+ extract_reference_file(reffile);
+ assert((a = archive_read_new()) != NULL);
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_raw(a));
+ assertEqualIntA(a, ARCHIVE_OK,
+ archive_read_open_filename(a, reffile, 512));
+
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
+ assert((fp = fopen("testdata.txt", "w")) != NULL);
+ while ((size = archive_read_data(a, buff, 512)) > 0)
+ fwrite(buff, 1, size, fp);
+ fclose(fp);
+
+ /* Open a test pattern file. */
+ assert((fp = fopen("testdata.txt", "r")) != NULL);
+
+ /*
+ * Create string conversion objects.
+ */
+ assertA(NULL != (f_sconv8 =
+ archive_string_conversion_from_charset(a, "UTF-8", 0)));
+ assertA(NULL != (f_sconv16be =
+ archive_string_conversion_from_charset(a, "UTF-16BE", 0)));
+ assertA(NULL != (f_sconv16le =
+ archive_string_conversion_from_charset(a, "UTF-16LE", 0)));
+ assert((a2 = archive_write_new()) != NULL);
+ assertA(NULL != (t_sconv8 =
+ archive_string_conversion_to_charset(a2, "UTF-8", 0)));
+ if (f_sconv8 == NULL || f_sconv16be == NULL || f_sconv16le == NULL ||
+ t_sconv8 == NULL || fp == NULL) {
+ /* We cannot continue this test. */
+ if (fp != NULL)
+ fclose(fp);
+ assertEqualInt(ARCHIVE_OK, archive_read_free(a));
+ return;
+ }
+
+ /*
+ * Read test data.
+ * Test data format:
+ * <NFC Unicode pattern> ';' <NFD Unicode pattern> '\n'
+ * Unicode pattern format:
+ * [0-9A-F]{4,5}([ ][0-9A-F]{4,5}){0,}
+ */
+ while (fgets(buff, sizeof(buff), fp) != NULL) {
+ char nfc[80], nfd[80];
+ char utf8_nfc[80], utf8_nfd[80];
+ char utf16be_nfc[80], utf16be_nfd[80];
+ char utf16le_nfc[80], utf16le_nfd[80];
+ wchar_t wc_nfc[40], wc_nfd[40];
+ char *e, *p;
+
+ line++;
+ if (buff[0] == '#')
+ continue;
+ p = strchr(buff, ';');
+ if (p == NULL)
+ continue;
+ *p++ = '\0';
+ /* Copy an NFC pattern */
+ strncpy(nfc, buff, sizeof(nfc)-1);
+ nfc[sizeof(nfc)-1] = '\0';
+ e = p;
+ p = strchr(p, '\n');
+ if (p == NULL)
+ continue;
+ *p = '\0';
+ /* Copy an NFD pattern */
+ strncpy(nfd, e, sizeof(nfd)-1);
+ nfd[sizeof(nfd)-1] = '\0';
+
+ /*
+ * Convert an NFC pattern to UTF-8 bytes.
+ */
+#if defined(__APPLE__)
+ if (scan_unicode_pattern(utf8_nfc, wc_nfc, utf16be_nfc, utf16le_nfc,
+ nfc, 1) != 0)
+ continue;
+#else
+ scan_unicode_pattern(utf8_nfc, wc_nfc, utf16be_nfc, utf16le_nfc,
+ nfc, 0);
+#endif
+
+ /*
+ * Convert an NFD pattern to UTF-8 bytes.
+ */
+ scan_unicode_pattern(utf8_nfd, wc_nfd, utf16be_nfd, utf16le_nfd,
+ nfd, 0);
+
+ if (locale_is_utf8) {
+#if defined(__APPLE__)
+ /*
+ * Normalize an NFC string for import.
+ */
+ assertEqualInt(0, archive_strcpy_in_locale(
+ &utf8, utf8_nfc, f_sconv8));
+ failure("NFC(%s) should be converted to NFD(%s):%d",
+ nfc, nfd, line);
+ assertEqualUTF8String(utf8_nfd, utf8.s);
+
+ /*
+ * Normalize an NFD string for import.
+ */
+ assertEqualInt(0, archive_strcpy_in_locale(
+ &utf8, utf8_nfd, f_sconv8));
+ failure("NFD(%s) should not be any changed:%d",
+ nfd, line);
+ assertEqualUTF8String(utf8_nfd, utf8.s);
+
+ /*
+ * Copy an NFD string for export.
+ */
+ assertEqualInt(0, archive_strcpy_in_locale(
+ &utf8, utf8_nfd, t_sconv8));
+ failure("NFD(%s) should not be any changed:%d",
+ nfd, line);
+ assertEqualUTF8String(utf8_nfd, utf8.s);
+
+ /*
+ * Normalize an NFC string in UTF-16BE for import.
+ */
+ assertEqualInt(0, archive_strncpy_in_locale(
+ &utf8, utf16be_nfc, 100000, f_sconv16be));
+ failure("NFC(%s) should be converted to NFD(%s):%d",
+ nfc, nfd, line);
+ assertEqualUTF8String(utf8_nfd, utf8.s);
+
+ /*
+ * Normalize an NFC string in UTF-16LE for import.
+ */
+ assertEqualInt(0, archive_strncpy_in_locale(
+ &utf8, utf16le_nfc, 100000, f_sconv16le));
+ failure("NFC(%s) should be converted to NFD(%s):%d",
+ nfc, nfd, line);
+ assertEqualUTF8String(utf8_nfd, utf8.s);
+#else
+ /*
+ * Normalize an NFD string for import.
+ */
+ assertEqualInt(0, archive_strcpy_in_locale(
+ &utf8, utf8_nfd, f_sconv8));
+ failure("NFD(%s) should be converted to NFC(%s):%d",
+ nfd, nfc, line);
+ assertEqualUTF8String(utf8_nfc, utf8.s);
+
+ /*
+ * Normalize an NFC string for import.
+ */
+ assertEqualInt(0, archive_strcpy_in_locale(
+ &utf8, utf8_nfc, f_sconv8));
+ failure("NFC(%s) should not be any changed:%d",
+ nfc, line);
+ assertEqualUTF8String(utf8_nfc, utf8.s);
+
+ /*
+ * Copy an NFC string for export.
+ */
+ assertEqualInt(0, archive_strcpy_in_locale(
+ &utf8, utf8_nfc, t_sconv8));
+ failure("NFC(%s) should not be any changed:%d",
+ nfc, line);
+ assertEqualUTF8String(utf8_nfc, utf8.s);
+
+ /*
+ * Normalize an NFD string in UTF-16BE for import.
+ */
+ assertEqualInt(0, archive_strncpy_in_locale(
+ &utf8, utf16be_nfd, 100000, f_sconv16be));
+ failure("NFD(%s) should be converted to NFC(%s):%d",
+ nfd, nfc, line);
+ assertEqualUTF8String(utf8_nfc, utf8.s);
+
+ /*
+ * Normalize an NFD string in UTF-16LE for import.
+ */
+ assertEqualInt(0, archive_strncpy_in_locale(
+ &utf8, utf16le_nfd, 100000, f_sconv16le));
+ failure("NFD(%s) should be converted to NFC(%s):%d",
+ nfd, nfc, line);
+ assertEqualUTF8String(utf8_nfc, utf8.s);
+#endif
+ }
+
+ /*
+ * Test for archive_mstring interface.
+ * In specific, Windows platform UTF-16BE is directly
+ * converted to/from wide-character to avoid the effect of
+ * current locale since windows platform cannot make
+ * locale UTF-8.
+ */
+ if (locale_is_utf8 || wc_is_unicode) {
+ const wchar_t *wp;
+ const char *mp;
+ size_t mplen;
+
+#if defined(__APPLE__)
+ /*
+ * Normalize an NFD string in UTF-8 for import.
+ */
+ assertEqualInt(0, archive_mstring_copy_mbs_len_l(
+ &mstr, utf8_nfc, 100000, f_sconv8));
+ assertEqualInt(0,
+ archive_mstring_get_wcs(a, &mstr, &wp));
+ failure("UTF-8 NFC(%s) should be converted "
+ "to WCS NFD(%s):%d", nfc, nfd, line);
+ assertEqualWString(wc_nfd, wp);
+
+ /*
+ * Normalize an NFD string in UTF-16BE for import.
+ */
+ assertEqualInt(0, archive_mstring_copy_mbs_len_l(
+ &mstr, utf16be_nfc, 100000, f_sconv16be));
+ assertEqualInt(0,
+ archive_mstring_get_wcs(a, &mstr, &wp));
+ failure("UTF-16BE NFC(%s) should be converted "
+ "to WCS NFD(%s):%d", nfc, nfd, line);
+ assertEqualWString(wc_nfd, wp);
+
+ /*
+ * Normalize an NFD string in UTF-16LE for import.
+ */
+ assertEqualInt(0, archive_mstring_copy_mbs_len_l(
+ &mstr, utf16le_nfc, 100000, f_sconv16le));
+ assertEqualInt(0,
+ archive_mstring_get_wcs(a, &mstr, &wp));
+ failure("UTF-16LE NFC(%s) should be converted "
+ "to WCS NFD(%s):%d", nfc, nfd, line);
+ assertEqualWString(wc_nfd, wp);
+
+ /*
+ * Copy an NFD wide-string for export.
+ */
+ assertEqualInt(0, archive_mstring_copy_wcs(
+ &mstr, wc_nfd));
+ assertEqualInt(0, archive_mstring_get_mbs_l(
+ &mstr, &mp, &mplen, t_sconv8));
+ failure("WCS NFD(%s) should be UTF-8 NFD:%d"
+ ,nfd, line);
+ assertEqualUTF8String(utf8_nfd, mp);
+#else
+ /*
+ * Normalize an NFD string in UTF-8 for import.
+ */
+ assertEqualInt(0, archive_mstring_copy_mbs_len_l(
+ &mstr, utf8_nfd, 100000, f_sconv8));
+ assertEqualInt(0,
+ archive_mstring_get_wcs(a, &mstr, &wp));
+ failure("UTF-8 NFD(%s) should be converted "
+ "to WCS NFC(%s):%d", nfd, nfc, line);
+ assertEqualWString(wc_nfc, wp);
+
+ /*
+ * Normalize an NFD string in UTF-16BE for import.
+ */
+ assertEqualInt(0, archive_mstring_copy_mbs_len_l(
+ &mstr, utf16be_nfd, 100000, f_sconv16be));
+ assertEqualInt(0,
+ archive_mstring_get_wcs(a, &mstr, &wp));
+ failure("UTF-8 NFD(%s) should be converted "
+ "to WCS NFC(%s):%d", nfd, nfc, line);
+ assertEqualWString(wc_nfc, wp);
+
+ /*
+ * Normalize an NFD string in UTF-16LE for import.
+ */
+ assertEqualInt(0, archive_mstring_copy_mbs_len_l(
+ &mstr, utf16le_nfd, 100000, f_sconv16le));
+ assertEqualInt(0,
+ archive_mstring_get_wcs(a, &mstr, &wp));
+ failure("UTF-8 NFD(%s) should be converted "
+ "to WCS NFC(%s):%d", nfd, nfc, line);
+ assertEqualWString(wc_nfc, wp);
+
+ /*
+ * Copy an NFC wide-string for export.
+ */
+ assertEqualInt(0, archive_mstring_copy_wcs(
+ &mstr, wc_nfc));
+ assertEqualInt(0, archive_mstring_get_mbs_l(
+ &mstr, &mp, &mplen, t_sconv8));
+ failure("WCS NFC(%s) should be UTF-8 NFC:%d"
+ ,nfc, line);
+ assertEqualUTF8String(utf8_nfc, mp);
+#endif
+ }
+ }
+
+ archive_string_free(&utf8);
+ archive_mstring_clean(&mstr);
+ fclose(fp);
+ assertEqualInt(ARCHIVE_OK, archive_read_free(a));
+ assertEqualInt(ARCHIVE_OK, archive_write_free(a2));
+}
+
+static void
+test_archive_string_canonicalization(void)
+{
+ struct archive *a;
+ struct archive_string_conv *sconv;
+
+ setlocale(LC_ALL, "en_US.UTF-8");
+
+ assert((a = archive_read_new()) != NULL);
+
+ assertA(NULL != (sconv =
+ archive_string_conversion_to_charset(a, "UTF-8", 1)));
+ failure("Charset name should be UTF-8");
+ assertEqualString("UTF-8",
+ archive_string_conversion_charset_name(sconv));
+
+ assertA(NULL != (sconv =
+ archive_string_conversion_to_charset(a, "UTF8", 1)));
+ failure("Charset name should be UTF-8");
+ assertEqualString("UTF-8",
+ archive_string_conversion_charset_name(sconv));
+
+ assertA(NULL != (sconv =
+ archive_string_conversion_to_charset(a, "utf8", 1)));
+ failure("Charset name should be UTF-8");
+ assertEqualString("UTF-8",
+ archive_string_conversion_charset_name(sconv));
+
+ assertA(NULL != (sconv =
+ archive_string_conversion_to_charset(a, "UTF-16BE", 1)));
+ failure("Charset name should be UTF-16BE");
+ assertEqualString("UTF-16BE",
+ archive_string_conversion_charset_name(sconv));
+
+ assertA(NULL != (sconv =
+ archive_string_conversion_to_charset(a, "UTF16BE", 1)));
+ failure("Charset name should be UTF-16BE");
+ assertEqualString("UTF-16BE",
+ archive_string_conversion_charset_name(sconv));
+
+ assertA(NULL != (sconv =
+ archive_string_conversion_to_charset(a, "utf16be", 1)));
+ failure("Charset name should be UTF-16BE");
+ assertEqualString("UTF-16BE",
+ archive_string_conversion_charset_name(sconv));
+
+ assertA(NULL != (sconv =
+ archive_string_conversion_to_charset(a, "UTF-16LE", 1)));
+ failure("Charset name should be UTF-16LE");
+ assertEqualString("UTF-16LE",
+ archive_string_conversion_charset_name(sconv));
+
+ assertA(NULL != (sconv =
+ archive_string_conversion_to_charset(a, "UTF16LE", 1)));
+ failure("Charset name should be UTF-16LE");
+ assertEqualString("UTF-16LE",
+ archive_string_conversion_charset_name(sconv));
+
+ assertA(NULL != (sconv =
+ archive_string_conversion_to_charset(a, "utf16le", 1)));
+ failure("Charset name should be UTF-16LE");
+ assertEqualString("UTF-16LE",
+ archive_string_conversion_charset_name(sconv));
+
+ assertEqualInt(ARCHIVE_OK, archive_read_free(a));
+
+}
+
+DEFINE_TEST(test_archive_string_conversion)
+{
+ test_archive_string_normalization();
+ test_archive_string_canonicalization();
+}
diff --git a/contrib/libarchive/libarchive/test/test_archive_string_conversion.txt.Z.uu b/contrib/libarchive/libarchive/test/test_archive_string_conversion.txt.Z.uu
new file mode 100644
index 000000000000..33c2e03bf7a2
--- /dev/null
+++ b/contrib/libarchive/libarchive/test/test_archive_string_conversion.txt.Z.uu
@@ -0,0 +1,2605 @@
+$FreeBSD$
+begin 644 test_archive_string_conversion.txt.Z
+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
+M6X6+)XI.?S)<$HWMC"V*6WA-!2&,7G$[7$*-H6F4!AN-[U3#BSF*9W&4!B*-
+MZ52ABS^*;7&4!BF-!U5:C$6*<W&4!C"-%5R%BTN*>'A\*`V)9FJ4!@:-+&.1
+MBU2*(5Q#"5>*A'B4!AN,<FJ4!N.,)US[BQ<L\8AX:FI<98W-BV:*DW%P7'N-
+MTXMLBIEQ=ER`C=J+<HJ?>)D"+8U4/Z2+>(I7/X6+>XJG<5P+A8U"C(&*K7&9
+M`CR-L'&;BX>*LW&17(6-]XN-BJ1JEUR+BQ9.0PF3BJEJV@=-C:QJV@=<C*]J
+MUR@-B;)JI5ROC9%FV@=9C;AJV@>*C<:&FXNHBM!_V@>?C--_I8TVC<"&W66V
+M7+*-S(RTBN!QV@<8B\UJV@<;C-!JPER+B]-JQ5S%C89MR%S3C7IGRUS6C5J,
+MCRSQB-]JFXMS,]R-6&1W"?6,PHV)B].*_7C:7-"-863=7-:-NHO<B@6`=PG!
+MC<5CPXOBB@QR*RG3C:J,Z(K[:C,I`HG,8W<)XXS/8X$)_(T:@/A<`HZSC?>*
+M/4>;B_J*)')P"5.-WF-P">.-/G(`9W`)*8WD8PI=!8[,C`F+^3\)CKZ-.X<F
+MC`^+_S\)CFB-6G*$C!6+!4`)CK>*"4!#"1N+.(<JCO^-_V,E71>.)F<H73&.
+MYXLGBSMK+ETTCI&++8M5>31=-(Z^BS.+3H<Z73&.GHLYBX)'0PD\BRU`1X[Q
+MC?8P6HQ"BXM'FXM%BV"'.1<HCBID.1?IB_8PC8LB+>DG86M47?R-,V2)";>,
+M9H>^BU>+%3G#BRXM6XX\9%]=7H[*BV&+>X=E76N.$6=H77".V(QKB[-'0PEN
+MBQ]6=XY+CHJ'=%USCN&+=XN?@'I=?HZ)BWV+RT=WCO^-J'F#77Z.UF6&78>+
+M,S&Z8XE=&(QXAUUVC5V.CK2`D%V2CH1RQF.478Z.=&2779V.)F::79F.1U;"
+M8^TI_(U]9*!=HXZ`9*-=IXX7;J9=H(Z89JE=L(ZY:ZQ=JHYK:*]=LX[=9;)=
+MN8X>9+5=K8YQ:[A=N8['9+M=N8[M9;Y=N8[Q9<%=MHX89\1=N8[Y9<==OXZ.
+M;<I=N8X`9LU=N8Y29;$"'(Z+73)L,"K1CJ5PUUVYC@EEVEW+CC5GW5W>CI".
+M_C=;C@)Z(P7LBP5ZYUW1CIN.\HL-<^U=CH[*9/!=]8["9?-=^([&9?9=_(W3
+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
+MN:JXGA0T8ZVX;K;BC%^X<;;76S1C)+@[#3<P)[BL%#<P*KA[MNZ,7;A^MO"J
+M0[G"N.&S]XQ?N.2S9*M*N3FXBK;P6T.YSKCMLPZL2KE"N).V!8U#N:>X]K,<
+M*$JY2[B<M@)<0[FPN/^S!UQ*N22X[@DSE">XY!`SE"JXJ[9-!2VXKK8AC5VX
+ML;9-!3.XM+8HC7*YR+@7M"^-7[@:M$T%SK@=M$T%T;@@M"E<,Y1%N,:V305(
+MN,FV305+N,RV,EQRN;"X+[1&C7RY)+A-%CXP+;BU#3XP,+CAMI0&,[CDMEB-
+M7;CGMDY<H+G+N$JT5%Q?N$VT9(T^,$*X\[9GC:"YI[A6M%]<I[E+N/RV<(V@
+MN;"X7[1G7*>Y)+@%MVI<7;C9#3F4*KC=#3F4+;@.MW-<OKG"N'&T>5Q?N'2T
+MB8W+N3FX&K>K*+ZYSKA]M)*-.91"N".WMRB^N:>XAK2.7,NY2[@LMY%<OKFP
+MN(^TEUPYE"2X-;?:!R>X.+>HC5VX.[>KC>VYM++7*.VYPKB""T4PQ;@2"D4P
+MR+B^%D4PR[CA!D4PSKC$%D4PT;C'%D4PI+B5"T4PI[B8"T4PJKB;"T4PK;C3
+M%D4PL+@O"44PL[BE"\8%9;?(7%VX:+?+7!JZ>[+.7!JZ\;FS`1JZPKC_!!>Z
+MQ;CL%A>ZR+CP%A>ZR[CS%E!C=+)@CEVX^+=973*Z'KKXM&J.4&,PN`&X5JY0
+M8\6X`;5RCE!C.;@*N&M=,KK.N`JU<5U?N`VU?8Y08T6X%KAW73*ZJK@6M;A=
+M/A)QL[M=/A)YLKY=/A*RLALJ/A*`LL1=/A*1LM"./A*'LLI=/A(UM<U=/A*H
+MLMF.E;79CG*RW8X^$C^U(8]LNK6UA"ISNEBZ:08Q$BL8>;JTLHT)>;J"LF4,
+M;KK#M3*/@;J)LBY>@;J9LC%>@;K#LC1>@;K'LJ$J@;J.LZ4J@;J2LSQ>@;J5
+MLZPJ@;J9LTB/@;J<LTN/@;ILLT=>;KI,"C$2YK6DNJVRSK"DNGNR6(^BNGRZ
+MJPJDNG^Z1""DNHBZ[A*DNHNZO`JDNHZZ1!2DNI&ZPPJDNI2Z>!BDNI>Z"[9Q
+M7J2ZGK9T7FRZ$;9W7J2ZI+9Z7F)C5;K5"F)C6+KEN(!>;KKKN`0KU;J%L@@K
+MU;J%NH.SEH]B8VJZ+;;&`L6RQ@*.NO$*8F.1NOZXH8]LN@&YQ@*7NCNV)RMB
+M8\:ZL!AB8YZSK8_KNLRZH[,T*VZZ$;FL7ONZJKJKLW4%?+JNL[R/,1*QL[^/
+M!;MDNE>VOU[[NHNZO;-U!8ZZP+-4*P6[D+/1CVRZVAAG8W2RWUYNNCZYR@)8
+MNGNV00T;NW^ZX;/SCVRZY[/*`HBZZK/*`HNZ[;/]CV=C<;J3MOY>&[N4NO:S
+M9@TENY>SR@*:NORS"U\EN_6Z<0UG8\RZ9[FI*VZZ:KF*#5BZJ[:2K$.[?+H.
+MM""0;+H1M(H-V;H4M+TK3;MGNKJVP2M#NXNZ';3)*TV[<;K#MHH-%+O&MHH-
+M"+:=#4V[-[O,MCM?0[N=NB^TWBM-N\RZJ0UM8U6ZK0UM8UBZE;FQ#6ZZF+E/
+MD':[?[I!M%:0;+I$M%J0?;MGNNJV"0AJNNVV"0CCNO"VRPUVNY&Z4[0)")2Z
+M5K0)")>Z6;1L7WV[QKK_M@D(];I7(6UCS+H%M^$-5;J_N>$-6+K"N>$-6[H.
+MM^$-7KH1MR<L;KH4MRLLJKN%NG>T\`ULNGJTX0V+NGVTX0V.NH"TX0V1NH.T
+MX0V4NH:TX0V7NHFTX0V:NHRTY*VQN_6Z,K=/+&ZZ-;>)!56Z.+>LD,J[JKIZ
+M!G5C?+H&`G5C?[KUN8D%V;KXN8D%A;K[N8D%B+K^N8D%B[H!NHD%CKH$NH.O
+M;+H'NHD%E+H*NHD%E[H-ND(.Z;O&NE^WB07UNF*W@RQNNF6WARSYNZ>ZB"-Y
+M8ZJZC"-Y8WRZ(KIY8W^Z);K@`MFZ*+K@`H6Z*[K@`HBZ+KK@`HNZ]A9Y8XZZ
+M$P5Y8Y&Z=0EY8Y2Z_Q9Y8Y>Z'@5Y8YJZ!1=Y8YVZ"!=Y8Z"Z"Q=^,!F[-@=^
+M,*>Z.@=^,*JZ%1=^,'RZF[22!7^ZGK22!=FZH;22!86ZI+22!8BZI[22!8NZ
+MJK2I#FRZK;2M#D6\%+NVMY(%8KNYMY4);KJ\MYD)?C"=NKRTD@6@NK^TRPX9
+MN\*TRPZGNL6TRPZJNLBTRPY\NLNTRPY_NLZTRP[9NM&TRPZ%NM2TRPZ(NM>T
+MRPZ+NMJTRPZ.NMVTRPZ1NN"TRPZ4NN.TRPZ7NN:TRPZ:NNFT8&!LNNRTRPZ@
+MNN^TFP49N_*T:F!LNO6TFP6JNOBT<6",O%ZZ`;AU8&ZZ!+B;!62Z![B;!6>Z
+M"KB;!6JZ#;B;!>.Z$+B;!7&Z$[B;!12[%KB;!6*[&;B;!9>S7RV%8WFR8BV%
+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
+M@8X3C=-#LH4!1;)"K#!P2*PP<)/342W4@5>R8@+EK9O3CZP:)LO,&B9"K,V,
+M-@O.&&$7Z!*FTY[3,PCS`V$?2@:<$ZW3G]&>4:?3L1Q@%[2<N#EG$RR"7*WK
+MNX^LF8PU!`H)[U`GLJ2\HZR'TY+./()YK9L7/()SK+P7C*P9L/"\NP$$L6*2
+M8!=(=OIKU1"K`M@!M05!`8$!LP*X`K\!;@NU$7,2C@C:T[8"UM/>T^#3?!`9
+M#K<!U]/K$$4!V=,/"\4"X]-5`MC3"@':TT(&1J;>TUH1Y=.[`MS3Z=.4&_+3
+MYM,?,JD!W=/PT^K3_-,(`[L"[].'#@34\]/GT_73`]2;#OC3W`U)LP'4"=3^
+MT[D"#-0(U)@1$]0&U`#4&P16`?C3]-,2U!C4Q`SKT_W3NP*T`2#4O@<>U`O4
+M(-2A#_'3!=3BTQO4_PLIU/_3Z-/VTTP![--*`QL1%M08U#+4%=0@U#@1(]0N
+MU.[3,-0P`>D%-]0?U/O3.4E`U.'3*M0;!)<"+=0*U#/4.M1.U$K4[=/5TT/4
+M<0-/U!34^M/VT[D'#]0G#EO45-3;TU?4#PX#U`_40M0TU&<&8=1'U/;3F`\W
+MU-`%2P)CU"C41M1,U&\%9=1NU&?4.M2T`SS48-1S$@$59M3!`G'46=1BU&C4
+M1!+?TW?45M2$U(\(@M1KU`W4X@]NU`@.)M3[TWO48]3C`H+4+]2)U.4#D]2)
+MU,,'F=2'U,8"@=1JU'3410+DTY[4!]1@=J'44=0GU$,$EM2BU"D(I-0DU(S4
+MKM1VU"34E]0ZU#D!FM0ZU,,'M]1WU&*:H-09U+'49P&&U+34>-0@U(H,N-2J
+MU#`!QM2'U#W4&P2.#'+4L-2MU(."L]1!U(C4.M06!,?42-37U,O4?-2UB]/4
+M4-3,U",!DM2EU&/4!P9SU*G42-3EU,/4U06^U-C4UP6OU-34`@%7U,<'J-3@
+MU&74S]34U/74J!_OU-_4?-3SU,+4\-0'U#V>]-3<U"C4WP5WU/P4F]2+U*W4
+M`M7_U$O4U=02U,^E`]7LU$T$?]3YU!'5#=5:U/+44PZLU`_5U]0=U.;4^=0[
+MU!_5P]3GU%$1O]0+U2S48=2UU!#5-M30U"759=0MU?C4_=0_U"?5+]6`$3O4
+MX]1`U`34C2`NU<,"]]0[U9T')-7QU#K5C@@\U074XPT_U4750=4RU54:2@9!
+M`5W4$;//#3W591I.U44!4-6O`>$##M6T`HD"F=17U<,!6=49U5S53]5CU5_5
+M)-5;U94#7=5!`4FS4M5'U1D.8M56U6K56-5FU535F=28#U'58-5BU&_5]QMD
+MU;H!>-5]`6?55=7&&T$!%K-LU?S43=5IU44!A-5^U6[5:-6#U7S5A=5AU8W5
+MB=6/U8O5_]-ZU>`'5QQRU6W5EM62U8+510&=LI#56P*`U9G4X@]WU5/5A]5!
+M`:75FM4.U4/5.]6'`QP!2]6&U=/4Q1^PU2\!K-4HU)W4M=6GU674N=4+`;'5
+M5=2=(OZ-80%&`6_5AM5=!=?4[P/$U9+56M5`"L+5KP[*U575QM7.U;X.9`'%
+MU<#5=-5DU4D[J]61U8'5F-6E"'W5<]6HU44!M]2FU9O5H]5!`>35V]6BU=C5
+M<-5%`>@!X-7FU>S5GM7.'^K5?]7RU3,%E-6GU9?5QM3EU<S5XM7SU0$!ZM5N
+M!9?57=0NLZ'5]M7_U0'6[=7PU8;5E]77U/W5U]4)UEW4A`(,UMS5B-74'_75
+MC-7=U0<&$-9YU9W5FP/YU4S5!-8A`<@!H=4#UA_6;PTEUI75Y]46`2C4'=8G
+MUH'5GP,AUO[5S@F(!#@#S=4C!;O5T@DA`3?6-K\YUDS5-=8\UD+6Q]4ZUDHJ
+M%@$]UD360-8[UD?6(0$6(\[5LM5+UK@<3=8^UO0"--91UK((4M9)UE#61M;D
+M'$/63]81UB/6+0X5UA[6W=5S#?75"`[WU2_6&M:S#1W4'=8(UF'61QT"UFO6
+MV=7'$AG6G-4QUDP!:M9WUK,->=9VUBS6\]51"'+6>]9TUN,!?M40`6G6@M9_
+MUH'6"]8'UG/6[=69'8G6B-86`6[6CM:0UHS6>-4PUK,-7M5CU@C60=9,UNL#
+M5-9%UC;6QPM:UA'6GM;P`U[6/]9;UN4+J=95UJ;65]8]`Z'6\=7*":/6%@$^
+MOZK6[=,J2Z?6J0BEUH/45]8[##C6KM;KU1+6(0&@U9C6E=:8U9T%?M;RU<K6
+ME];ZU9W5S=:>U9S6R-9O#1^S)M;4UB$!UM8KULS6B-5CUIG6V=8SUF#6*-8A
+M`2.SU]:#UH_6M0C3UN?6@A[AUF36LPW)U936Z];)UKD!YM9_UO/6R];_U?P3
+M[=;?UA8!Z=5EU2+6X]8##)'6Q-8"U__6_M5ZU0T(SM:SU@C7_-7XUG#6J`8#
+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
++.++T-:O0]*`Y=/,`
+`
+end
diff --git a/contrib/libarchive/libarchive/test/test_archive_write_set_filter_option.c b/contrib/libarchive/libarchive/test/test_archive_write_set_filter_option.c
new file mode 100644
index 000000000000..87a3e5350bd4
--- /dev/null
+++ b/contrib/libarchive/libarchive/test/test_archive_write_set_filter_option.c
@@ -0,0 +1,55 @@
+/*-
+ * Copyright (c) 2011 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.
+ */
+
+#include "test.h"
+__FBSDID("$FreeBSD$");
+
+#define should(__a, __code, __m, __o, __v) \
+assertEqualInt(__code, archive_write_set_filter_option(__a, __m, __o, __v))
+
+static void
+test(int pristine)
+{
+ struct archive* a = archive_write_new();
+
+ if (!pristine)
+ archive_write_set_compression_gzip(a);
+
+ should(a, ARCHIVE_OK, NULL, NULL, NULL);
+ should(a, ARCHIVE_OK, "", "", "");
+
+ should(a, ARCHIVE_FAILED, NULL, "fubar", NULL);
+ should(a, ARCHIVE_FAILED, NULL, "fubar", "snafu");
+ should(a, ARCHIVE_FAILED, "fubar", "snafu", NULL);
+ should(a, ARCHIVE_FAILED, "fubar", "snafu", "betcha");
+
+ archive_write_finish(a);
+}
+
+DEFINE_TEST(test_archive_write_set_filter_option)
+{
+ test(1);
+ test(0);
+}
diff --git a/contrib/libarchive/libarchive/test/test_archive_write_set_format_option.c b/contrib/libarchive/libarchive/test/test_archive_write_set_format_option.c
new file mode 100644
index 000000000000..ee53ca4c39d2
--- /dev/null
+++ b/contrib/libarchive/libarchive/test/test_archive_write_set_format_option.c
@@ -0,0 +1,67 @@
+/*-
+ * Copyright (c) 2011 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.
+ */
+
+#include "test.h"
+__FBSDID("$FreeBSD$");
+
+#define should(__a, __code, __m, __o, __v) \
+assertEqualInt(__code, archive_write_set_format_option(__a, __m, __o, __v))
+
+static void
+test(int pristine)
+{
+ struct archive* a = archive_write_new();
+ int known_option_rv = pristine ? ARCHIVE_FAILED : ARCHIVE_OK;
+
+ if (!pristine)
+ archive_write_set_format_iso9660(a);
+
+ /* NULL and "" denote `no option', so they're ok no matter
+ * what, if any, formats are registered */
+ should(a, ARCHIVE_OK, NULL, NULL, NULL);
+ should(a, ARCHIVE_OK, "", "", "");
+
+ /* unknown modules and options */
+ should(a, ARCHIVE_FAILED, "fubar", "snafu", NULL);
+ should(a, ARCHIVE_FAILED, "fubar", "snafu", "betcha");
+
+ /* unknown modules and options */
+ should(a, ARCHIVE_FAILED, NULL, "snafu", NULL);
+ should(a, ARCHIVE_FAILED, NULL, "snafu", "betcha");
+
+ /* ARCHIVE_OK with iso9660 loaded, ARCHIVE_WARN otherwise */
+ should(a, known_option_rv, "iso9660", "joliet", NULL);
+ should(a, known_option_rv, "iso9660", "joliet", NULL);
+ should(a, known_option_rv, NULL, "joliet", NULL);
+ should(a, known_option_rv, NULL, "joliet", NULL);
+
+ archive_write_finish(a);
+}
+
+DEFINE_TEST(test_archive_write_set_format_option)
+{
+ test(1);
+ test(0);
+}
diff --git a/contrib/libarchive/libarchive/test/test_archive_write_set_option.c b/contrib/libarchive/libarchive/test/test_archive_write_set_option.c
new file mode 100644
index 000000000000..a7957ed7b266
--- /dev/null
+++ b/contrib/libarchive/libarchive/test/test_archive_write_set_option.c
@@ -0,0 +1,69 @@
+/*-
+ * Copyright (c) 2011 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.
+ */
+
+#include "test.h"
+__FBSDID("$FreeBSD$");
+
+#define should(__a, __code, __m, __o, __v) \
+assertEqualInt(__code, archive_write_set_option(__a, __m, __o, __v))
+
+static void
+test(int pristine)
+{
+ struct archive* a = archive_write_new();
+ int known_option_rv = pristine ? ARCHIVE_FAILED : ARCHIVE_OK;
+
+ if (!pristine) {
+ archive_write_set_compression_gzip(a);
+ archive_write_set_format_iso9660(a);
+ }
+
+ /* NULL and "" denote `no option', so they're ok no matter
+ * what, if any, formats are registered */
+ should(a, ARCHIVE_OK, NULL, NULL, NULL);
+ should(a, ARCHIVE_OK, "", "", "");
+
+ /* unknown modules and options */
+ should(a, ARCHIVE_FAILED, "fubar", "snafu", NULL);
+ should(a, ARCHIVE_FAILED, "fubar", "snafu", "betcha");
+
+ /* unknown modules and options */
+ should(a, ARCHIVE_FAILED, NULL, "snafu", NULL);
+ should(a, ARCHIVE_FAILED, NULL, "snafu", "betcha");
+
+ /* ARCHIVE_OK with iso9660 loaded, ARCHIVE_WARN otherwise */
+ should(a, known_option_rv, "iso9660", "joliet", NULL);
+ should(a, known_option_rv, "iso9660", "joliet", NULL);
+ should(a, known_option_rv, NULL, "joliet", NULL);
+ should(a, known_option_rv, NULL, "joliet", NULL);
+
+ archive_write_finish(a);
+}
+
+DEFINE_TEST(test_archive_write_set_option)
+{
+ test(1);
+ test(0);
+}
diff --git a/contrib/libarchive/libarchive/test/test_archive_write_set_options.c b/contrib/libarchive/libarchive/test/test_archive_write_set_options.c
new file mode 100644
index 000000000000..57aba98c18c9
--- /dev/null
+++ b/contrib/libarchive/libarchive/test/test_archive_write_set_options.c
@@ -0,0 +1,126 @@
+/*-
+ * Copyright (c) 2011 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.
+ */
+
+#include "test.h"
+__FBSDID("$FreeBSD$");
+
+#define should(__a, __code, __opts) \
+assertEqualInt(__code, archive_write_set_options(__a, __opts))
+
+static void
+test(int pristine)
+{
+ struct archive* a = archive_write_new();
+ int halfempty_options_rv = pristine ? ARCHIVE_FAILED : ARCHIVE_OK;
+ int known_option_rv = pristine ? ARCHIVE_FAILED : ARCHIVE_OK;
+
+ if (!pristine) {
+ archive_write_set_compression_gzip(a);
+ archive_write_set_format_iso9660(a);
+ }
+
+ /* NULL and "" denote `no option', so they're ok no matter
+ * what, if any, formats are registered */
+ should(a, ARCHIVE_OK, NULL);
+ should(a, ARCHIVE_OK, "");
+
+ /* unknown modules and options */
+ should(a, ARCHIVE_FAILED, "fubar:snafu");
+ assertEqualString("Unknown module name: `fubar'",
+ archive_error_string(a));
+ should(a, ARCHIVE_FAILED, "fubar:snafu=betcha");
+ assertEqualString("Unknown module name: `fubar'",
+ archive_error_string(a));
+
+ /* unknown modules and options */
+ should(a, ARCHIVE_FAILED, "snafu");
+ assertEqualString("Undefined option: `snafu'",
+ archive_error_string(a));
+ should(a, ARCHIVE_FAILED, "snafu=betcha");
+ assertEqualString("Undefined option: `snafu'",
+ archive_error_string(a));
+
+ /* ARCHIVE_OK with iso9660 loaded, ARCHIVE_FAILED otherwise */
+ should(a, known_option_rv, "iso9660:joliet");
+ if (pristine) {
+ assertEqualString("Unknown module name: `iso9660'",
+ archive_error_string(a));
+ }
+ should(a, known_option_rv, "iso9660:joliet");
+ if (pristine) {
+ assertEqualString("Unknown module name: `iso9660'",
+ archive_error_string(a));
+ }
+ should(a, known_option_rv, "joliet");
+ if (pristine) {
+ assertEqualString("Undefined option: `joliet'",
+ archive_error_string(a));
+ }
+ should(a, known_option_rv, "!joliet");
+ if (pristine) {
+ assertEqualString("Undefined option: `joliet'",
+ archive_error_string(a));
+ }
+
+ should(a, ARCHIVE_OK, ",");
+ should(a, ARCHIVE_OK, ",,");
+
+ should(a, halfempty_options_rv, ",joliet");
+ if (pristine) {
+ assertEqualString("Undefined option: `joliet'",
+ archive_error_string(a));
+ }
+ should(a, halfempty_options_rv, "joliet,");
+ if (pristine) {
+ assertEqualString("Undefined option: `joliet'",
+ archive_error_string(a));
+ }
+
+ should(a, ARCHIVE_FAILED, "joliet,snafu");
+ if (pristine) {
+ assertEqualString("Undefined option: `joliet'",
+ archive_error_string(a));
+ } else {
+ assertEqualString("Undefined option: `snafu'",
+ archive_error_string(a));
+ }
+
+ should(a, ARCHIVE_FAILED, "iso9660:snafu");
+ if (pristine) {
+ assertEqualString("Unknown module name: `iso9660'",
+ archive_error_string(a));
+ } else {
+ assertEqualString("Undefined option: `iso9660:snafu'",
+ archive_error_string(a));
+ }
+
+ archive_write_finish(a);
+}
+
+DEFINE_TEST(test_archive_write_set_options)
+{
+ test(1);
+ test(0);
+}
diff --git a/contrib/libarchive/libarchive/test/test_bad_fd.c b/contrib/libarchive/libarchive/test/test_bad_fd.c
index a0f9ae1ec799..87dd4aa2b73e 100644
--- a/contrib/libarchive/libarchive/test/test_bad_fd.c
+++ b/contrib/libarchive/libarchive/test/test_bad_fd.c
@@ -30,12 +30,8 @@ DEFINE_TEST(test_bad_fd)
{
struct archive *a;
assert((a = archive_read_new()) != NULL);
- assertA(0 == archive_read_support_compression_all(a));
+ assertA(0 == archive_read_support_filter_all(a));
assertA(ARCHIVE_FATAL == archive_read_open_fd(a, -1, 1024));
- assertA(0 == archive_read_close(a));
-#if ARCHIVE_VERSION_NUMBER < 2000000
- archive_read_finish(a);
-#else
- assertA(0 == archive_read_finish(a));
-#endif
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
+ assertEqualInt(ARCHIVE_OK, archive_read_free(a));
}
diff --git a/contrib/libarchive/libarchive/test/test_compat_bzip2.c b/contrib/libarchive/libarchive/test/test_compat_bzip2.c
index 96eacad79cc4..2b6aa1d2a74c 100644
--- a/contrib/libarchive/libarchive/test/test_compat_bzip2.c
+++ b/contrib/libarchive/libarchive/test/test_compat_bzip2.c
@@ -47,7 +47,7 @@ compat_bzip2(const char *name)
int i;
assert((a = archive_read_new()) != NULL);
- if (ARCHIVE_OK != archive_read_support_compression_bzip2(a)) {
+ if (ARCHIVE_OK != archive_read_support_filter_bzip2(a)) {
skipping("Unsupported bzip2");
return;
}
@@ -71,8 +71,12 @@ compat_bzip2(const char *name)
assertEqualString(archive_compression_name(a), "bzip2");
assertEqualInt(archive_format(a), ARCHIVE_FORMAT_TAR_USTAR);
- assertEqualInt(ARCHIVE_OK, archive_read_close(a));
- assertEqualInt(ARCHIVE_OK, archive_read_finish(a));
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
+ assertEqualInt(archive_compression(a), ARCHIVE_COMPRESSION_BZIP2);
+ assertEqualString(archive_compression_name(a), "bzip2");
+ assertEqualInt(archive_format(a), ARCHIVE_FORMAT_TAR_USTAR);
+
+ assertEqualInt(ARCHIVE_OK, archive_read_free(a));
}
diff --git a/contrib/libarchive/libarchive/test/test_compat_cpio.c b/contrib/libarchive/libarchive/test/test_compat_cpio.c
index b0ead3901e14..40a6c4135172 100644
--- a/contrib/libarchive/libarchive/test/test_compat_cpio.c
+++ b/contrib/libarchive/libarchive/test/test_compat_cpio.c
@@ -48,7 +48,7 @@ test_compat_cpio_1(void)
struct archive *a;
assert((a = archive_read_new()) != NULL);
- assertEqualIntA(a, ARCHIVE_OK, archive_read_support_compression_all(a));
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
extract_reference_file(name);
assertEqualIntA(a, ARCHIVE_OK, archive_read_open_filename(a, name, 17));
@@ -94,7 +94,7 @@ test_compat_cpio_1(void)
assertEqualInt(archive_format(a), ARCHIVE_FORMAT_CPIO_SVR4_NOCRC);
assertEqualInt(ARCHIVE_OK, archive_read_close(a));
- assertEqualInt(ARCHIVE_OK, archive_read_finish(a));
+ assertEqualInt(ARCHIVE_OK, archive_read_free(a));
}
diff --git a/contrib/libarchive/libarchive/test/test_compat_gtar.c b/contrib/libarchive/libarchive/test/test_compat_gtar.c
index 41fc2f23a24e..98455b85a2c9 100644
--- a/contrib/libarchive/libarchive/test/test_compat_gtar.c
+++ b/contrib/libarchive/libarchive/test/test_compat_gtar.c
@@ -46,7 +46,7 @@ test_compat_gtar_1(void)
int r;
assert((a = archive_read_new()) != NULL);
- assertEqualIntA(a, ARCHIVE_OK, archive_read_support_compression_all(a));
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
extract_reference_file(name);
assertEqualIntA(a, ARCHIVE_OK, archive_read_open_filename(a, name, 10240));
@@ -54,7 +54,7 @@ test_compat_gtar_1(void)
/* Read first entry. */
assertEqualIntA(a, ARCHIVE_OK, r = archive_read_next_header(a, &ae));
if (r != ARCHIVE_OK) {
- archive_read_finish(a);
+ archive_read_free(a);
return;
}
assertEqualString(
@@ -73,7 +73,7 @@ test_compat_gtar_1(void)
/* Read second entry. */
assertEqualIntA(a, ARCHIVE_OK, r = archive_read_next_header(a, &ae));
if (r != ARCHIVE_OK) {
- archive_read_finish(a);
+ archive_read_free(a);
return;
}
assertEqualString(
@@ -103,11 +103,7 @@ test_compat_gtar_1(void)
assertEqualInt(archive_format(a), ARCHIVE_FORMAT_TAR_GNUTAR);
assertEqualInt(ARCHIVE_OK, archive_read_close(a));
-#if ARCHIVE_VERSION_NUMBER < 2000000
- archive_read_finish(a);
-#else
- assertEqualInt(ARCHIVE_OK, archive_read_finish(a));
-#endif
+ assertEqualInt(ARCHIVE_OK, archive_read_free(a));
}
diff --git a/contrib/libarchive/libarchive/test/test_compat_gzip.c b/contrib/libarchive/libarchive/test/test_compat_gzip.c
index eb9981d02fe9..82ed25bdd955 100644
--- a/contrib/libarchive/libarchive/test/test_compat_gzip.c
+++ b/contrib/libarchive/libarchive/test/test_compat_gzip.c
@@ -47,10 +47,10 @@ verify(const char *name)
int i,r;
assert((a = archive_read_new()) != NULL);
- r = archive_read_support_compression_gzip(a);
+ r = archive_read_support_filter_gzip(a);
if (r == ARCHIVE_WARN) {
skipping("gzip reading not fully supported on this platform");
- assertEqualInt(ARCHIVE_OK, archive_read_finish(a));
+ assertEqualInt(ARCHIVE_OK, archive_read_free(a));
return;
}
assertEqualIntA(a, ARCHIVE_OK, r);
@@ -64,7 +64,7 @@ verify(const char *name)
assertEqualIntA(a, ARCHIVE_OK,
archive_read_next_header(a, &ae));
if (r != ARCHIVE_OK) {
- archive_read_finish(a);
+ archive_read_free(a);
return;
}
assertEqualString(n[i], archive_entry_pathname(ae));
@@ -79,7 +79,7 @@ verify(const char *name)
assertEqualInt(archive_format(a), ARCHIVE_FORMAT_TAR_USTAR);
assertEqualInt(ARCHIVE_OK, archive_read_close(a));
- assertEqualInt(ARCHIVE_OK, archive_read_finish(a));
+ assertEqualInt(ARCHIVE_OK, archive_read_free(a));
}
diff --git a/contrib/libarchive/libarchive/test/test_compat_lzip.c b/contrib/libarchive/libarchive/test/test_compat_lzip.c
new file mode 100644
index 000000000000..f474cd49e1d7
--- /dev/null
+++ b/contrib/libarchive/libarchive/test/test_compat_lzip.c
@@ -0,0 +1,141 @@
+/*-
+ * Copyright (c) 2010 Michihiro NAKAJIMA
+ * Copyright (c) 2003-2008 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.
+ */
+#include "test.h"
+__FBSDID("$FreeBSD$");
+
+/*
+Execute the following to rebuild the data for this program:
+ tail -n +33 test_compat_lzip.c | /bin/sh
+
+# Use lzip command.
+zcmd=lzip
+zsuffix=lz
+ztar_suffix=tlz
+mktarfile()
+{
+mkdir $dir
+echo "f1" > $dir/f1
+echo "f2" > $dir/f2
+echo "f3" > $dir/f3
+mkdir $dir/d1
+echo "f1" > $dir/d1/f1
+echo "f2" > $dir/d1/f2
+echo "f3" > $dir/d1/f3
+(cd $dir; tar cf ../$name.tar f1 f2 f3 d1/f1 d1/f2 d1/f3)
+rm -r $dir
+}
+#
+# Make a lzip file from splitted tar file.
+#
+name=test_compat_lzip_1
+dir="$name`date +%Y%m%d%H%M%S`.$USER"
+mktarfile
+split -b 3600 $name.tar $name.tar.
+rm $name.tar
+$zcmd $name.tar.*
+cat $name.tar.*.$zsuffix > $name.$ztar_suffix
+rm $name.tar.*.$zsuffix
+uuencode $name.$ztar_suffix $name.$ztar_suffix > $name.$ztar_suffix.uu
+rm -f $name.$ztar_suffix
+#
+# Make a lzip file with junk data at the end of the file.
+#
+name=test_compat_lzip_2
+dir="$name`date +%Y%m%d%H%M%S`.$USER"
+mktarfile
+$zcmd $name.tar
+mv $name.tar.$zsuffix $name.$ztar_suffix
+echo "This is unrelated junk data at the end of the file" >> $name.$ztar_suffix
+uuencode $name.$ztar_suffix $name.$ztar_suffix > $name.$ztar_suffix.uu
+rm -f $name.$ztar_suffix
+
+exit 0
+*/
+
+/*
+ * Verify our ability to read sample files compatibly with lzip.
+ *
+ * In particular:
+ * * lzip will read multiple lzip streams, concatenating the output
+ * * lzip will stop at the end of a stream if the following data
+ * doesn't start with a gzip signature.
+ *
+ */
+
+/*
+ * All of the sample files have the same contents; they're just
+ * compressed in different ways.
+ */
+static void
+compat_lzip(const char *name)
+{
+ const char *n[7] = { "f1", "f2", "f3", "d1/f1", "d1/f2", "d1/f3", NULL };
+ struct archive_entry *ae;
+ struct archive *a;
+ int i, r;
+
+ assert((a = archive_read_new()) != NULL);
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
+ r = archive_read_support_filter_lzip(a);
+ if (r == ARCHIVE_WARN) {
+ skipping("lzip reading not fully supported on this platform");
+ assertEqualInt(ARCHIVE_OK, archive_read_free(a));
+ return;
+ }
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
+ extract_reference_file(name);
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_open_filename(a, name, 2));
+
+ /* Read entries, match up names with list above. */
+ for (i = 0; i < 6; ++i) {
+ failure("Could not read file %d (%s) from %s", i, n[i], name);
+ assertEqualIntA(a, ARCHIVE_OK,
+ archive_read_next_header(a, &ae));
+ assertEqualString(n[i], archive_entry_pathname(ae));
+ }
+
+ /* Verify the end-of-archive. */
+ assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
+
+ /* Verify that the format detection worked. */
+ assertEqualInt(archive_compression(a), ARCHIVE_COMPRESSION_LZIP);
+ assertEqualString(archive_compression_name(a), "lzip");
+ assertEqualInt(archive_format(a), ARCHIVE_FORMAT_TAR_USTAR);
+
+ assertEqualInt(ARCHIVE_OK, archive_read_close(a));
+ assertEqualInt(ARCHIVE_OK, archive_read_free(a));
+}
+
+
+DEFINE_TEST(test_compat_lzip)
+{
+ /* This sample has been 'split', each piece compressed separately,
+ * then concatenated. lzip will emit the concatenated result. */
+ compat_lzip("test_compat_lzip_1.tlz");
+ /* This sample has been compressed as a single stream, but then
+ * some unrelated garbage text has been appended to the end. */
+ compat_lzip("test_compat_lzip_2.tlz");
+}
diff --git a/contrib/libarchive/libarchive/test/test_compat_lzip_1.tlz.uu b/contrib/libarchive/libarchive/test/test_compat_lzip_1.tlz.uu
new file mode 100644
index 000000000000..01e5e3bfadee
--- /dev/null
+++ b/contrib/libarchive/libarchive/test/test_compat_lzip_1.tlz.uu
@@ -0,0 +1,10 @@
+begin 644 test_compat_lzip_1.tlz
+M3%I)4`$,`#,,/!NGC#0&C6L"2_R2/O9*^":#5/GP,U"QL$1\Q:(3S>V*OTP*
+M1&9J-1:S\^>DEIOT;'&#"`B6#7ZO7%">,>LZ=:BU,Z7*^>M<3FV:GKO_?W;`
+M,N31CE_$<-$(3$J*AB5TTG2\;X[CSPOI6IIPV8\]86+J37::!/_LA^/@O"(1
+MAA`.````````F`````````!,6DE0`0P``&_]_BC86HZ6L8?*M6SC8*JJ7,GS
+M0IZA9CQ/^VS2N26K[BXKGC_1Z&JR]S2)5Q",)*$1RS"):7X:?OBQDJXU`>8K
+M\2*:_6!:)ZD5FBGJ?II6>-<K71*E]Z%2+8"G-.(X-N74SK.)7_YTN3Z\/1D0
+0\`T```````"&````````````
+`
+end
diff --git a/contrib/libarchive/libarchive/test/test_compat_lzip_2.tlz.uu b/contrib/libarchive/libarchive/test/test_compat_lzip_2.tlz.uu
new file mode 100644
index 000000000000..bf954f2f92cb
--- /dev/null
+++ b/contrib/libarchive/libarchive/test/test_compat_lzip_2.tlz.uu
@@ -0,0 +1,9 @@
+begin 644 test_compat_lzip_2.tlz
+M3%I)4`%-`#,,/!NGC#0&C6L"2_R2/O9*^":#5/GP,U"QL$1\Q:(3S>V*OTP*
+M1&9J-1:S\^>DEIOT;'&#"`B6#7ZO7%">,>LZ=:BU,Z7*^>M<3FV:GKO_?W;`
+M,N31CE_$<-$(3$J*AB5TTG2\;X[CSPOI6IIPV8\]9>BP>V?/L._78%+F2N-;
+M6V[`1"7)=_,5LD9U%73FQV-?_X5OKW0_.'N"`!P```````"R`````````%1H
+M:7,@:7,@=6YR96QA=&5D(&IU;FL@9&%T82!A="!T:&4@96YD(&]F('1H92!F
+$:6QE"@``
+`
+end
diff --git a/contrib/libarchive/libarchive/test/test_compat_lzma.c b/contrib/libarchive/libarchive/test/test_compat_lzma.c
index 7269a4c970da..4d3eab3d5142 100644
--- a/contrib/libarchive/libarchive/test/test_compat_lzma.c
+++ b/contrib/libarchive/libarchive/test/test_compat_lzma.c
@@ -107,11 +107,11 @@ compat_lzma(const char *name)
int i, r;
assert((a = archive_read_new()) != NULL);
- assertEqualIntA(a, ARCHIVE_OK, archive_read_support_compression_all(a));
- r = archive_read_support_compression_lzma(a);
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
+ r = archive_read_support_filter_lzma(a);
if (r == ARCHIVE_WARN) {
skipping("lzma reading not fully supported on this platform");
- assertEqualInt(ARCHIVE_OK, archive_read_finish(a));
+ assertEqualInt(ARCHIVE_OK, archive_read_free(a));
return;
}
assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
@@ -135,7 +135,7 @@ compat_lzma(const char *name)
assertEqualInt(archive_format(a), ARCHIVE_FORMAT_TAR_USTAR);
assertEqualInt(ARCHIVE_OK, archive_read_close(a));
- assertEqualInt(ARCHIVE_OK, archive_read_finish(a));
+ assertEqualInt(ARCHIVE_OK, archive_read_free(a));
}
diff --git a/contrib/libarchive/libarchive/test/test_compat_mac-1.tar.Z.uu b/contrib/libarchive/libarchive/test/test_compat_mac-1.tar.Z.uu
new file mode 100644
index 000000000000..c5eda8017f72
--- /dev/null
+++ b/contrib/libarchive/libarchive/test/test_compat_mac-1.tar.Z.uu
@@ -0,0 +1,38 @@
+begin 644 test_compat_mac-1.tar.Z
+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
+$2UM(`0``
+`
+end
diff --git a/contrib/libarchive/libarchive/test/test_compat_mac-2.tar.Z.uu b/contrib/libarchive/libarchive/test/test_compat_mac-2.tar.Z.uu
new file mode 100644
index 000000000000..09761b9736bd
--- /dev/null
+++ b/contrib/libarchive/libarchive/test/test_compat_mac-2.tar.Z.uu
@@ -0,0 +1,19 @@
+begin 644 test_compat_mac-2.tar.Z
+M'YV0+EX`&$BPH,&#"!,J7,BPH4.$,"+>J%$#!("(,&[8J'@1HPP:%C&*%`DB
+M1@R*-&[0J`$CQ@T0+4W:@`$`1(V'.'/JW,D30)TY=,+(Z4@G39N>"H&&,6,&
+MZ<&1,$*.M.BTJM6K6+/V#.CB2YL\9-(,U4JV+$&,$SFBW2@UXL>V(VG$F%'R
+M9(V4*UN^;/EQ94V:9@,+)O@SZ-"(18]J5<HT*U2X$:D.GDRY\M4"%@X`$#"P
+M29@Q()Y,`8$%A.G3IC<33$!0!L%L!#D#"+#`<A`J5*0,%/!G(&V"_`@^P$D`
+M.,$"`RN,>=/&Q1LXR\F4D3/'19@O9L0")1@@`$$#`RTL;_X\^O3J8K[,*;/<
+M#9F'RID[A_Y&.G478[Z4:0.'3A[NF@U4'``4C#>?>?>1\04;86P'0';4T;%>
+M>V0PZ*!E&&:HX88<!O156'((Q.&(!:%%45L:J>412!U!A5%=**G$DDLPQ2##
+M###04---)/:84&%"$64468PUA=5C+;[HXY),6L655WEDQT8936:(D0TTL+B6
+MBFYIZ:)<=)D48UXT\C73#']5R220A\&0&)%!-7;D5$E&IN:=>"Z$F6:R>0::
+M:*2AAIIJ`[$VD&L#P;:;;[55=EMNN_G!J'$##??0@``$-Q!R`,1''GWV57<=
+MA!=V]UUX!I97WWDNI#?A&^[!ERJHK.:W7W__^18@``,6*)^JH;J@H(5T#$2J
+MA.S!6F&#Q>;I[+/0[N1AE&E,&:U@5V:)(EM)OE7G8V+>):->-=Y8@PUI7HLA
+MFT(JEE61CM&)I+KTUFOOO?CFJ^^^_/;K[[\`!RSPP`07;/#!"">L\,(,-^SP
+MPQ!'+/'$%%=L\<489ZSQQAQW[/''((<L\L@DEVSRR2BGK/+*++?L\LLPQRSS
+*S#37;//-..>,$```
+`
+end
diff --git a/contrib/libarchive/libarchive/test/test_compat_mac.c b/contrib/libarchive/libarchive/test/test_compat_mac.c
new file mode 100644
index 000000000000..3cad9f37bed0
--- /dev/null
+++ b/contrib/libarchive/libarchive/test/test_compat_mac.c
@@ -0,0 +1,212 @@
+/*-
+ * Copyright (c) 2003-2010 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.
+ */
+#include "test.h"
+__FBSDID("$FreeBSD$");
+
+/* The sample has some files in a directory with a very long name. */
+#define TESTPATH "abcdefghijklmnopqrstuvwxyz/" \
+ "abcdefghijklmnopqrstuvwxyz/" \
+ "abcdefghijklmnopqrstuvwxyz/" \
+ "abcdefghijklmnopqrstuvwxyz/" \
+ "abcdefghijklmnopqrstuvwxyz/" \
+ "abcdefghijklmnopqrstuvwxyz/" \
+ "abcdefghijklmnopqrstuvwxyz/"
+
+static void test_compat_mac_1(void);
+static void test_compat_mac_2(void);
+
+/*
+ * Apple shipped an extended version of GNU tar with Mac OS X 10.5
+ * and earlier.
+ */
+static void
+test_compat_mac_1(void)
+{
+ char name[] = "test_compat_mac-1.tar.Z";
+ struct archive_entry *ae;
+ struct archive *a;
+ const void *attr;
+ size_t attrSize;
+
+ 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(name);
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_open_filename(a, name, 10240));
+
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
+ assertEqualString(TESTPATH, archive_entry_pathname(ae));
+ assertEqualInt(1275688109, archive_entry_mtime(ae));
+ assertEqualInt(95594, archive_entry_uid(ae));
+ assertEqualString("kientzle", archive_entry_uname(ae));
+ assertEqualInt(5000, archive_entry_gid(ae));
+ assertEqualString("", archive_entry_gname(ae));
+ assertEqualInt(040755, archive_entry_mode(ae));
+
+ attr = archive_entry_mac_metadata(ae, &attrSize);
+ assert(attr == NULL);
+ assertEqualInt(0, attrSize);
+
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
+ assertEqualString(TESTPATH "dir/", archive_entry_pathname(ae));
+ assertEqualInt(1275687611, archive_entry_mtime(ae));
+ assertEqualInt(95594, archive_entry_uid(ae));
+ assertEqualString("kientzle", archive_entry_uname(ae));
+ assertEqualInt(5000, archive_entry_gid(ae));
+ assertEqualString("", archive_entry_gname(ae));
+ assertEqualInt(040755, archive_entry_mode(ae));
+
+ attr = archive_entry_mac_metadata(ae, &attrSize);
+ assert(attr != NULL);
+ assertEqualInt(225, attrSize);
+
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
+ assertEqualString(TESTPATH "file", archive_entry_pathname(ae));
+ assertEqualInt(1275687588, archive_entry_mtime(ae));
+ assertEqualInt(95594, archive_entry_uid(ae));
+ assertEqualString("kientzle", archive_entry_uname(ae));
+ assertEqualInt(5000, archive_entry_gid(ae));
+ assertEqualString("", archive_entry_gname(ae));
+ assertEqualInt(0100644, archive_entry_mode(ae));
+
+ attr = archive_entry_mac_metadata(ae, &attrSize);
+ assert(attr != NULL);
+ assertEqualInt(225, attrSize);
+
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
+ assertEqualString("dir/", archive_entry_pathname(ae));
+ assertEqualInt(1275688064, archive_entry_mtime(ae));
+ assertEqualInt(95594, archive_entry_uid(ae));
+ assertEqualString("kientzle", archive_entry_uname(ae));
+ assertEqualInt(5000, archive_entry_gid(ae));
+ assertEqualString("", archive_entry_gname(ae));
+ assertEqualInt(040755, archive_entry_mode(ae));
+
+ attr = archive_entry_mac_metadata(ae, &attrSize);
+ assert(attr != NULL);
+ assertEqualInt(225, attrSize);
+ assertEqualMem("\x00\x05\x16\x07\x00\x02\x00\x00Mac OS X", attr, 16);
+
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
+ assertEqualString("file", archive_entry_pathname(ae));
+ assertEqualInt(1275625860, archive_entry_mtime(ae));
+ assertEqualInt(95594, archive_entry_uid(ae));
+ assertEqualString("kientzle", archive_entry_uname(ae));
+ assertEqualInt(5000, archive_entry_gid(ae));
+ assertEqualString("", archive_entry_gname(ae));
+ assertEqualInt(0100644, archive_entry_mode(ae));
+
+ attr = archive_entry_mac_metadata(ae, &attrSize);
+ assert(attr != NULL);
+ assertEqualInt(225, attrSize);
+ assertEqualMem("\x00\x05\x16\x07\x00\x02\x00\x00Mac OS X", attr, 16);
+
+ /* Verify the end-of-archive. */
+ assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
+
+ /* Verify that the format detection worked. */
+ assertEqualInt(archive_compression(a), ARCHIVE_COMPRESSION_COMPRESS);
+ assertEqualInt(archive_format(a), ARCHIVE_FORMAT_TAR_GNUTAR);
+
+ assertEqualInt(ARCHIVE_OK, archive_read_close(a));
+ assertEqualInt(ARCHIVE_OK, archive_read_free(a));
+}
+
+/*
+ * Apple shipped a customized version of bsdtar starting with MacOS 10.6.
+ */
+static void
+test_compat_mac_2(void)
+{
+ char name[] = "test_compat_mac-2.tar.Z";
+ struct archive_entry *ae;
+ struct archive *a;
+ const void *attr;
+ size_t attrSize;
+
+ 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(name);
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_open_filename(a, name, 10240));
+
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
+ assertEqualString("./", archive_entry_pathname(ae));
+ assertEqualInt(1303628303, archive_entry_mtime(ae));
+ assertEqualInt(501, archive_entry_uid(ae));
+ assertEqualString("tim", archive_entry_uname(ae));
+ assertEqualInt(20, archive_entry_gid(ae));
+ assertEqualString("staff", archive_entry_gname(ae));
+ assertEqualInt(040755, archive_entry_mode(ae));
+
+ attr = archive_entry_mac_metadata(ae, &attrSize);
+ assert(attr == NULL);
+ assertEqualInt(0, attrSize);
+
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
+ assertEqualString("./mydir/", archive_entry_pathname(ae));
+ assertEqualInt(1303628303, archive_entry_mtime(ae));
+ assertEqualInt(501, archive_entry_uid(ae));
+ assertEqualString("tim", archive_entry_uname(ae));
+ assertEqualInt(20, archive_entry_gid(ae));
+ assertEqualString("staff", archive_entry_gname(ae));
+ assertEqualInt(040755, archive_entry_mode(ae));
+
+ attr = archive_entry_mac_metadata(ae, &attrSize);
+ assert(attr != NULL);
+ assertEqualInt(267, attrSize);
+ assertEqualMem("\x00\x05\x16\x07\x00\x02\x00\x00Mac OS X", attr, 16);
+
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
+ assertEqualString("./myfile", archive_entry_pathname(ae));
+ assertEqualInt(1303628303, archive_entry_mtime(ae));
+ assertEqualInt(501, archive_entry_uid(ae));
+ assertEqualString("tim", archive_entry_uname(ae));
+ assertEqualInt(20, archive_entry_gid(ae));
+ assertEqualString("staff", archive_entry_gname(ae));
+ assertEqualInt(0100644, archive_entry_mode(ae));
+
+ attr = archive_entry_mac_metadata(ae, &attrSize);
+ assert(attr != NULL);
+ assertEqualInt(267, attrSize);
+ assertEqualMem("\x00\x05\x16\x07\x00\x02\x00\x00Mac OS X", attr, 16);
+
+ /* Verify the end-of-archive. */
+ assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
+
+ /* Verify that the format detection worked. */
+ assertEqualInt(archive_compression(a), ARCHIVE_COMPRESSION_COMPRESS);
+ assertEqualInt(archive_format(a), ARCHIVE_FORMAT_TAR_USTAR);
+
+ assertEqualInt(ARCHIVE_OK, archive_read_close(a));
+ assertEqualInt(ARCHIVE_OK, archive_read_free(a));
+}
+
+DEFINE_TEST(test_compat_mac)
+{
+ test_compat_mac_1();
+ test_compat_mac_2();
+}
+
diff --git a/contrib/libarchive/libarchive/test/test_compat_pax_libarchive_2x.c b/contrib/libarchive/libarchive/test/test_compat_pax_libarchive_2x.c
new file mode 100644
index 000000000000..6ea25e4d2501
--- /dev/null
+++ b/contrib/libarchive/libarchive/test/test_compat_pax_libarchive_2x.c
@@ -0,0 +1,146 @@
+/*-
+ * Copyright (c) 2011 Michihiro NAKAJIMA
+ * 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.
+ */
+#include "test.h"
+__FBSDID("$FreeBSD");
+
+#include <locale.h>
+
+/*
+ * Test "tar:compat-2x" option that enables the string conversion of
+ * libarchive 2.x, which made incorrect UTF-8 form filenames for the
+ * pax format on some platform the wchar_t of which was not Unicode form.
+ * The option is unneeded if people have been using UTF-8 locale during
+ * making tar files(in pax format).
+ *
+ * NOTE: The sample tar file was made with bsdtar 2.x in LANG=KOI8-R on
+ * FreeBSD.
+ */
+
+DEFINE_TEST(test_compat_pax_libarchive_2x)
+{
+#if (defined(_WIN32) && !defined(__CYGWIN__)) \
+ || defined(__STDC_ISO_10646__) || defined(__APPLE__)
+ skipping("This test only for the platform the WCS of which is "
+ "not Unicode.");
+#else
+ struct archive *a;
+ struct archive_entry *ae;
+ char c;
+ wchar_t wc;
+ const char *refname = "test_compat_pax_libarchive_2x.tar.Z";
+
+ /*
+ * Read incorrect format UTF-8 filename in ru_RU.KOI8-R with
+ * "tar:compat-2x" option. We should correctly
+ * read two filenames.
+ */
+ if (NULL == setlocale(LC_ALL, "ru_RU.KOI8-R")) {
+ skipping("ru_RU.KOI8-R locale not available on this system.");
+ return;
+ }
+
+ /*
+ * Test if wchar_t format is the same as FreeBSD wchar_t.
+ */
+ assert(-1 != wctomb(NULL, L'\0'));
+ wc = (wchar_t)0xd0;
+ c = 0;
+ if (wctomb(&c, wc) != 1 || (unsigned char)c != 0xd0) {
+ skipping("wchar_t format is different on this platform.");
+ return;
+ }
+
+ extract_reference_file(refname);
+
+ 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));
+ assertEqualIntA(a, ARCHIVE_OK,
+ archive_read_set_options(a, "tar:compat-2x"));
+ assertEqualIntA(a, ARCHIVE_OK,
+ archive_read_open_filename(a, refname, 10240));
+
+ /* Verify regular first file. */
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
+ assertEqualString("\xd0\xd2\xc9\xd7\xc5\xd4",
+ archive_entry_pathname(ae));
+ assertEqualInt(6, archive_entry_size(ae));
+
+ /* Verify regular second file. */
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
+ assertEqualString("\xf0\xf2\xe9\xf7\xe5\xf4",
+ archive_entry_pathname(ae));
+ assertEqualInt(6, archive_entry_size(ae));
+
+
+ /* End of archive. */
+ assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
+
+ /* Verify archive format. */
+ assertEqualIntA(a, ARCHIVE_FILTER_COMPRESS, archive_filter_code(a, 0));
+ assertEqualIntA(a, ARCHIVE_FORMAT_TAR_PAX_INTERCHANGE,
+ archive_format(a));
+
+ /* Close the archive. */
+ assertEqualInt(ARCHIVE_OK, archive_read_close(a));
+ assertEqualInt(ARCHIVE_OK, archive_read_free(a));
+
+ /*
+ * Without "tar:compat-2x" option.
+ * Neither first file name nor second file name can be translated
+ * to KOI8-R.
+ */
+ 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));
+ assertEqualIntA(a, ARCHIVE_OK,
+ archive_read_open_filename(a, refname, 10240));
+
+ /* We cannot correctly read the filename. */
+ assertEqualIntA(a, ARCHIVE_WARN, archive_read_next_header(a, &ae));
+ assert(strcmp("\xd0\xd2\xc9\xd7\xc5\xd4",
+ archive_entry_pathname(ae)) != 0);
+ assertEqualInt(6, archive_entry_size(ae));
+
+ /* We cannot correctly read the filename. */
+ assertEqualIntA(a, ARCHIVE_WARN, archive_read_next_header(a, &ae));
+ assert(strcmp("\xf0\xf2\xe9\xf7\xe5\xf4",
+ archive_entry_pathname(ae)) != 0);
+ assertEqualInt(6, archive_entry_size(ae));
+
+
+ /* End of archive. */
+ assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
+
+ /* Verify archive format. */
+ assertEqualIntA(a, ARCHIVE_FILTER_COMPRESS, archive_filter_code(a, 0));
+ assertEqualIntA(a, ARCHIVE_FORMAT_TAR_PAX_INTERCHANGE,
+ archive_format(a));
+
+ /* Close the archive. */
+ assertEqualInt(ARCHIVE_OK, archive_read_close(a));
+ assertEqualInt(ARCHIVE_OK, archive_read_free(a));
+#endif
+}
diff --git a/contrib/libarchive/libarchive/test/test_compat_pax_libarchive_2x.tar.Z.uu b/contrib/libarchive/libarchive/test/test_compat_pax_libarchive_2x.tar.Z.uu
new file mode 100644
index 000000000000..f44054118c17
--- /dev/null
+++ b/contrib/libarchive/libarchive/test/test_compat_pax_libarchive_2x.tar.Z.uu
@@ -0,0 +1,15 @@
+begin 644 test_compat_pax_libarchive_2x.tar.Z
+M'YV04,+@05(F#)DR<EY`DY;L6C%J`")*G$BQHL6+&#-JW%@1AL<;-6J``.`Q
+M!L@8(TN>3.FQ94D;-D#$B%&#QHT9,CS.B`DCADT;-P"`P,.QJ-&C2)-:K#.'
+M3A@Y)&&,J5-&:<:I5:U>=.F1I<N16L.*'4NV;%D9*.&$H8.FQS!(PR0-2S3L
+MTK!"PR@IR`EB#)TT;<KTB#$#!EJ0.&+@V`L#Q%K`@@D;QG$C!PX9.128!#%E
+M")(D3+*X.&BG1XX:>V5P]@Q:=!HW;P87IE'C!@W-.%9_#NW"#9O7:P8K,$N\
+MN/'CR),K7\Z\N?.)"QL^?$[=:$N0(J.:K(%2^\JH7%O&G%GS9DX8.T'T+`PC
+MJ/KJ\)$R=0K5(];B]XF']]H2;/S_`"H'CSSIW%,./0$FJ.""##;HX(,01@A`
+M0`,5=%!"`Q9XH(3Z?1022]MUIQ)W_+D4`TPRT6033CKQ1),,0`E%%(?PS?=4
+M5/F9E6-9^X'7'XU`-H@6"&JQY18LP\@R3"K#W#),*</0PEA??P4FFV';);88
+M7X]9*9D,E%F&F68WZ-;::&64=EIJ9O+V6FR2T082;FV*YAMPP@6IYYY\]NFG
+M4AD:B."?9EWWH7<D(BIB>.*E6!Z+Z+DX0V'NP4!H<C;6)Q55^'':X5<^=G7I
+>J,<%NB&IJ*:JZJJLMNKJJ[#&*NNLM-9JZZVXYDH<
+`
+end
diff --git a/contrib/libarchive/libarchive/test/test_compat_solaris_pax_sparse.c b/contrib/libarchive/libarchive/test/test_compat_solaris_pax_sparse.c
new file mode 100644
index 000000000000..0ab333bb180b
--- /dev/null
+++ b/contrib/libarchive/libarchive/test/test_compat_solaris_pax_sparse.c
@@ -0,0 +1,188 @@
+/*-
+ * Copyright (c) 2011 Michihiro NAKAJIMA
+ * 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.
+ */
+#include "test.h"
+__FBSDID("$FreeBSD$");
+
+/*
+ * Verify our ability to read sample files created by Solaris pax for
+ * a sparse file.
+ */
+static void
+test_compat_solaris_pax_sparse_1(void)
+{
+ char name[] = "test_compat_solaris_pax_sparse_1.pax.Z";
+ struct archive_entry *ae;
+ struct archive *a;
+ int64_t offset, length;
+ const void *buff;
+ size_t bytes_read;
+ char data[1024*8];
+ int r;
+
+ 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(name);
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_open_filename(a, name, 10240));
+
+ /* Read first entry. */
+ assertEqualIntA(a, ARCHIVE_OK, r = archive_read_next_header(a, &ae));
+ if (r != ARCHIVE_OK) {
+ archive_read_free(a);
+ return;
+ }
+ assertEqualString("hole", archive_entry_pathname(ae));
+ assertEqualInt(1310411683, archive_entry_mtime(ae));
+ assertEqualInt(101, archive_entry_uid(ae));
+ assertEqualString("cue", archive_entry_uname(ae));
+ assertEqualInt(10, archive_entry_gid(ae));
+ assertEqualString("staff", archive_entry_gname(ae));
+ assertEqualInt(0100644, archive_entry_mode(ae));
+
+ /* Verify the sparse information. */
+ failure("This sparse file should have tree data blocks");
+ assertEqualInt(3, archive_entry_sparse_reset(ae));
+ assertEqualInt(ARCHIVE_OK,
+ archive_entry_sparse_next(ae, &offset, &length));
+ assertEqualInt(0, offset);
+ assertEqualInt(131072, length);
+ assertEqualInt(ARCHIVE_OK,
+ archive_entry_sparse_next(ae, &offset, &length));
+ assertEqualInt(393216, offset);
+ assertEqualInt(131072, length);
+ assertEqualInt(ARCHIVE_OK,
+ archive_entry_sparse_next(ae, &offset, &length));
+ assertEqualInt(786432, offset);
+ assertEqualInt(32775, length);
+ while (ARCHIVE_OK ==
+ archive_read_data_block(a, &buff, &bytes_read, &offset)) {
+ failure("The data blocks should not include the hole");
+ assert((offset >= 0 && offset + bytes_read <= 131072) ||
+ (offset >= 393216 && offset + bytes_read <= 393216+131072) ||
+ (offset >= 786432 && offset + bytes_read <= 786432+32775));
+ if (offset == 0 && bytes_read >= 1024*8) {
+ memset(data, 'a', sizeof(data));
+ failure("First data block should be 8K bytes of 'a'");
+ assertEqualMem(buff, data, sizeof(data));
+ } else if (offset + bytes_read == 819207 && bytes_read >= 7) {
+ const char *last = buff;
+ last += bytes_read - 7;
+ memset(data, 'c', 7);
+ failure("Last seven bytes should be all 'c'");
+ assertEqualMem(last, data, 7);
+ }
+ }
+
+ /* Verify the end-of-archive. */
+ assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
+
+ /* Verify that the format detection worked. */
+ assertEqualInt(archive_filter_code(a, 0), ARCHIVE_FILTER_COMPRESS);
+ assertEqualInt(archive_format(a), ARCHIVE_FORMAT_TAR_PAX_INTERCHANGE);
+
+ assertEqualInt(ARCHIVE_OK, archive_read_close(a));
+ assertEqualInt(ARCHIVE_OK, archive_read_free(a));
+}
+
+/*
+ * Verify our ability to read sample files created by Solaris pax for
+ * a sparse file which begin with hole.
+ */
+static void
+test_compat_solaris_pax_sparse_2(void)
+{
+ char name[] = "test_compat_solaris_pax_sparse_2.pax.Z";
+ struct archive_entry *ae;
+ struct archive *a;
+ int64_t offset, length;
+ const void *buff;
+ size_t bytes_read;
+ int r;
+
+ 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(name);
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_open_filename(a, name, 10240));
+
+ /* Read first entry. */
+ assertEqualIntA(a, ARCHIVE_OK, r = archive_read_next_header(a, &ae));
+ if (r != ARCHIVE_OK) {
+ archive_read_free(a);
+ return;
+ }
+ assertEqualString("hole", archive_entry_pathname(ae));
+ assertEqualInt(1310416789, archive_entry_mtime(ae));
+ assertEqualInt(101, archive_entry_uid(ae));
+ assertEqualString("cue", archive_entry_uname(ae));
+ assertEqualInt(10, archive_entry_gid(ae));
+ assertEqualString("staff", archive_entry_gname(ae));
+ assertEqualInt(0100644, archive_entry_mode(ae));
+
+ /* Verify the sparse information. */
+ failure("This sparse file should have two data blocks");
+ assertEqualInt(2, archive_entry_sparse_reset(ae));
+ assertEqualInt(ARCHIVE_OK,
+ archive_entry_sparse_next(ae, &offset, &length));
+ assertEqualInt(393216, offset);
+ assertEqualInt(131072, length);
+ assertEqualInt(ARCHIVE_OK,
+ archive_entry_sparse_next(ae, &offset, &length));
+ assertEqualInt(786432, offset);
+ assertEqualInt(32799, length);
+ while (ARCHIVE_OK ==
+ archive_read_data_block(a, &buff, &bytes_read, &offset)) {
+ failure("The data blocks should not include the hole");
+ assert((offset >= 393216 && offset + bytes_read <= 393216+131072) ||
+ (offset >= 786432 && offset + bytes_read <= 786432+32799));
+ if (offset + bytes_read == 819231 && bytes_read >= 31) {
+ char data[32];
+ const char *last = buff;
+ last += bytes_read - 31;
+ memset(data, 'c', 31);
+ failure("Last 31 bytes should be all 'c'");
+ assertEqualMem(last, data, 31);
+ }
+ }
+
+ /* Verify the end-of-archive. */
+ assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
+
+ /* Verify that the format detection worked. */
+ assertEqualInt(archive_filter_code(a, 0), ARCHIVE_FILTER_COMPRESS);
+ assertEqualInt(archive_format(a), ARCHIVE_FORMAT_TAR_PAX_INTERCHANGE);
+
+ assertEqualInt(ARCHIVE_OK, archive_read_close(a));
+ assertEqualInt(ARCHIVE_OK, archive_read_free(a));
+}
+
+
+DEFINE_TEST(test_compat_solaris_pax_sparse)
+{
+ test_compat_solaris_pax_sparse_1();
+ test_compat_solaris_pax_sparse_2();
+}
+
+
diff --git a/contrib/libarchive/libarchive/test/test_compat_solaris_pax_sparse_1.pax.Z.uu b/contrib/libarchive/libarchive/test/test_compat_solaris_pax_sparse_1.pax.Z.uu
new file mode 100644
index 000000000000..8ab27deb654c
--- /dev/null
+++ b/contrib/libarchive/libarchive/test/test_compat_solaris_pax_sparse_1.pax.Z.uu
@@ -0,0 +1,53 @@
+begin 644 test_compat_solaris_pax_sparse_1.pax.Z
+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
+E_O.@#[WH1T_ZTIO^]*A/O>I7S_K6N_[UL(\]Z<=`^]J/0?9$`P``
+`
+end
diff --git a/contrib/libarchive/libarchive/test/test_compat_solaris_pax_sparse_2.pax.Z.uu b/contrib/libarchive/libarchive/test/test_compat_solaris_pax_sparse_2.pax.Z.uu
new file mode 100644
index 000000000000..5df385f773c7
--- /dev/null
+++ b/contrib/libarchive/libarchive/test/test_compat_solaris_pax_sparse_2.pax.Z.uu
@@ -0,0 +1,53 @@
+begin 644 test_compat_solaris_pax_sparse_2.pax.Z
+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
+F_O.@#[WH1T_ZTIO^]*A/O>I7S_K6NY[I8XB][&=/^]K;7O:O1Q4`
+`
+end
diff --git a/contrib/libarchive/libarchive/test/test_compat_solaris_tar_acl.c b/contrib/libarchive/libarchive/test/test_compat_solaris_tar_acl.c
index af4f9d3825df..d4654d02f769 100644
--- a/contrib/libarchive/libarchive/test/test_compat_solaris_tar_acl.c
+++ b/contrib/libarchive/libarchive/test/test_compat_solaris_tar_acl.c
@@ -45,7 +45,7 @@ DEFINE_TEST(test_compat_solaris_tar_acl)
extract_reference_file(reference1);
assert(NULL != (a = archive_read_new()));
assertA(0 == archive_read_support_format_all(a));
- assertA(0 == archive_read_support_compression_all(a));
+ assertA(0 == archive_read_support_filter_all(a));
assertA(0 == archive_read_open_filename(a, reference1, 512));
/* Archive has 1 entry with some ACLs set on it. */
@@ -124,5 +124,5 @@ DEFINE_TEST(test_compat_solaris_tar_acl)
/* Close the archive. */
assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
- assertEqualInt(ARCHIVE_OK, archive_read_finish(a));
+ assertEqualInt(ARCHIVE_OK, archive_read_free(a));
}
diff --git a/contrib/libarchive/libarchive/test/test_compat_tar_hardlink.c b/contrib/libarchive/libarchive/test/test_compat_tar_hardlink.c
index c1021ef584b2..0ce88e532730 100644
--- a/contrib/libarchive/libarchive/test/test_compat_tar_hardlink.c
+++ b/contrib/libarchive/libarchive/test/test_compat_tar_hardlink.c
@@ -51,7 +51,7 @@ test_compat_tar_hardlink_1(void)
struct archive *a;
assert((a = archive_read_new()) != NULL);
- assertEqualIntA(a, ARCHIVE_OK, archive_read_support_compression_all(a));
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
extract_reference_file(name);
assertEqualIntA(a, ARCHIVE_OK, archive_read_open_filename(a, name, 10240));
@@ -93,11 +93,7 @@ test_compat_tar_hardlink_1(void)
assertEqualInt(archive_format(a), ARCHIVE_FORMAT_TAR);
assertEqualInt(ARCHIVE_OK, archive_read_close(a));
-#if ARCHIVE_VERSION_NUMBER < 2000000
- archive_read_finish(a);
-#else
- assertEqualInt(ARCHIVE_OK, archive_read_finish(a));
-#endif
+ assertEqualInt(ARCHIVE_OK, archive_read_free(a));
}
DEFINE_TEST(test_compat_tar_hardlink)
diff --git a/contrib/libarchive/libarchive/test/test_compat_xz.c b/contrib/libarchive/libarchive/test/test_compat_xz.c
index 9041427f8780..ff399b274778 100644
--- a/contrib/libarchive/libarchive/test/test_compat_xz.c
+++ b/contrib/libarchive/libarchive/test/test_compat_xz.c
@@ -46,11 +46,11 @@ compat_xz(const char *name)
int i, r;
assert((a = archive_read_new()) != NULL);
- assertEqualIntA(a, ARCHIVE_OK, archive_read_support_compression_all(a));
- r = archive_read_support_compression_xz(a);
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
+ r = archive_read_support_filter_xz(a);
if (r == ARCHIVE_WARN) {
skipping("xz reading not fully supported on this platform");
- assertEqualInt(ARCHIVE_OK, archive_read_finish(a));
+ assertEqualInt(ARCHIVE_OK, archive_read_free(a));
return;
}
assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
@@ -74,7 +74,7 @@ compat_xz(const char *name)
assertEqualInt(archive_format(a), ARCHIVE_FORMAT_TAR_USTAR);
assertEqualInt(ARCHIVE_OK, archive_read_close(a));
- assertEqualInt(ARCHIVE_OK, archive_read_finish(a));
+ assertEqualInt(ARCHIVE_OK, archive_read_free(a));
}
diff --git a/contrib/libarchive/libarchive/test/test_compat_zip.c b/contrib/libarchive/libarchive/test/test_compat_zip.c
index adb377c759da..9785d4273599 100644
--- a/contrib/libarchive/libarchive/test/test_compat_zip.c
+++ b/contrib/libarchive/libarchive/test/test_compat_zip.c
@@ -25,6 +25,12 @@
#include "test.h"
__FBSDID("$FreeBSD$");
+#ifdef HAVE_LIBZ
+static const int libz_enabled = 1;
+#else
+static const int libz_enabled = 0;
+#endif
+
/* Copy this function for each test file and adjust it accordingly. */
static void
test_compat_zip_1(void)
@@ -35,7 +41,7 @@ test_compat_zip_1(void)
int r;
assert((a = archive_read_new()) != NULL);
- assertEqualIntA(a, ARCHIVE_OK, archive_read_support_compression_all(a));
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_zip(a));
extract_reference_file(name);
assertEqualIntA(a, ARCHIVE_OK, archive_read_open_filename(a, name, 10240));
@@ -46,13 +52,10 @@ test_compat_zip_1(void)
/* Read second entry. */
r = archive_read_next_header(a, &ae);
- if (r != ARCHIVE_OK) {
- if (strcmp(archive_error_string(a),
- "libarchive compiled without deflate support (no libz)") == 0) {
- skipping("Skipping ZIP compression check: %s",
- archive_error_string(a));
- goto finish;
- }
+ if (r == ARCHIVE_FATAL && !libz_enabled) {
+ skipping("Skipping ZIP compression check: %s",
+ archive_error_string(a));
+ goto finish;
}
assertEqualIntA(a, ARCHIVE_OK, r);
assertEqualString("tmp.class", archive_entry_pathname(ae));
@@ -62,13 +65,9 @@ test_compat_zip_1(void)
assertEqualInt(archive_compression(a), ARCHIVE_COMPRESSION_NONE);
assertEqualInt(archive_format(a), ARCHIVE_FORMAT_ZIP);
- assertEqualInt(ARCHIVE_OK, archive_read_close(a));
finish:
-#if ARCHIVE_VERSION_NUMBER < 2000000
- archive_read_finish(a);
-#else
- assertEqualInt(ARCHIVE_OK, archive_read_finish(a));
-#endif
+ assertEqualInt(ARCHIVE_OK, archive_read_close(a));
+ assertEqualInt(ARCHIVE_OK, archive_read_free(a));
}
/*
@@ -85,7 +84,7 @@ test_compat_zip_2(void)
struct archive *a;
assert((a = archive_read_new()) != NULL);
- assertEqualIntA(a, ARCHIVE_OK, archive_read_support_compression_all(a));
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_zip(a));
extract_reference_file(name);
assertEqualIntA(a, ARCHIVE_OK, archive_read_open_filename(a, name, 10240));
@@ -103,11 +102,349 @@ test_compat_zip_2(void)
assertEqualInt(ARCHIVE_OK, archive_read_free(a));
}
+/*
+ * Issue 185: Test a regression that got in between 2.6 and 2.7 that
+ * broke extraction of Zip entries with length-at-end.
+ */
+static void
+test_compat_zip_3(void)
+{
+ const char *refname = "test_compat_zip_3.zip";
+ struct archive_entry *ae;
+ struct archive *a;
+
+ extract_reference_file(refname);
+ 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));
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_open_filename(a, refname, 10240));
+
+ /* First entry. */
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
+ assertEqualString("soapui-4.0.0/", archive_entry_pathname(ae));
+ assertEqualInt(0, archive_entry_size(ae));
+ assert(archive_entry_size_is_set(ae));
+ assertEqualInt(AE_IFDIR, archive_entry_filetype(ae));
+
+ /* Second entry. */
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
+ assertEqualString("soapui-4.0.0/soapui-settings.xml", archive_entry_pathname(ae));
+ assertEqualInt(AE_IFREG, archive_entry_filetype(ae));
+ assertEqualInt(1030, archive_entry_size(ae));
+ assert(archive_entry_size_is_set(ae));
+
+ /* Extract under a different name. */
+ archive_entry_set_pathname(ae, "test_3.txt");
+ if(libz_enabled) {
+ char *p;
+ size_t s;
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_extract(a, ae, 0));
+ /* Verify the first 12 bytes actually got written to disk correctly. */
+ p = slurpfile(&s, "test_3.txt");
+ assertEqualInt(s, 1030);
+ assertEqualMem(p, "<?xml versio", 12);
+ free(p);
+ } else {
+ skipping("Skipping ZIP compression check, no libz support");
+ }
+ assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
+
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_free(a));
+}
+
+/**
+ * A file with leading garbage (similar to an SFX file).
+ */
+static void
+test_compat_zip_4(void)
+{
+ const char *refname = "test_compat_zip_4.zip";
+ struct archive_entry *ae;
+ struct archive *a;
+ void *p;
+ size_t s;
+
+ extract_reference_file(refname);
+ p = slurpfile(&s, refname);
+
+ /* SFX files require seek support. */
+ 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));
+ assertEqualIntA(a, ARCHIVE_OK, read_open_memory_seek(a, p, s, 18));
+
+ /* First entry. */
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
+ assertEqualString("foo", archive_entry_pathname(ae));
+ assertEqualInt(4, archive_entry_size(ae));
+ assert(archive_entry_size_is_set(ae));
+ assertEqualInt(AE_IFREG, archive_entry_filetype(ae));
+ assertEqualInt(0412, archive_entry_perm(ae));
+
+ /* Second entry. */
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
+ assertEqualString("bar", archive_entry_pathname(ae));
+ assertEqualInt(AE_IFREG, archive_entry_filetype(ae));
+ assertEqualInt(4, archive_entry_size(ae));
+ assert(archive_entry_size_is_set(ae));
+ assertEqualInt(0567, archive_entry_perm(ae));
+
+ /* Third entry. */
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
+ assertEqualString("baz", archive_entry_pathname(ae));
+ assertEqualInt(AE_IFREG, archive_entry_filetype(ae));
+ assertEqualInt(4, archive_entry_size(ae));
+ assert(archive_entry_size_is_set(ae));
+ assertEqualInt(0644, archive_entry_perm(ae));
+
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_free(a));
+
+ /* Try reading without seek support and watch it fail. */
+ 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));
+ assertEqualIntA(a, ARCHIVE_FATAL, read_open_memory(a, p, s, 3));
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_free(a));
+ free(p);
+}
+/**
+ * Issue 152: A file generated by a tool that doesn't really
+ * believe in populating local file headers at all. This
+ * is only readable with the seeking reader.
+ */
+static void
+test_compat_zip_5(void)
+{
+ const char *refname = "test_compat_zip_5.zip";
+ struct archive_entry *ae;
+ struct archive *a;
+ void *p;
+ size_t s;
+
+ extract_reference_file(refname);
+ p = slurpfile(&s, refname);
+
+ /* Verify with seek support.
+ * Everything works correctly here. */
+ 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));
+ assertEqualIntA(a, ARCHIVE_OK, read_open_memory_seek(a, p, s, 18));
+
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
+ assertEqualString("Metadata/Job_PT.xml", archive_entry_pathname(ae));
+ assertEqualInt(3559, archive_entry_size(ae));
+ assertEqualInt(AE_IFREG, archive_entry_filetype(ae));
+ assertEqualInt(0777, archive_entry_perm(ae));
+
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
+ assertEqualString("Metadata/MXDC_Empty_PT.xml", archive_entry_pathname(ae));
+ assertEqualInt(456, archive_entry_size(ae));
+ assertEqualInt(AE_IFREG, archive_entry_filetype(ae));
+ assertEqualInt(0777, archive_entry_perm(ae));
+
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
+ assertEqualString("Documents/1/Metadata/Page1_Thumbnail.JPG", archive_entry_pathname(ae));
+ assertEqualInt(1495, archive_entry_size(ae));
+ assertEqualInt(AE_IFREG, archive_entry_filetype(ae));
+ assertEqualInt(0777, archive_entry_perm(ae));
+ /* TODO: Read some of the file data and verify it.
+ The code to read uncompressed Zip entries with "file at end" semantics
+ is tricky and should be verified more carefully. */
+
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
+ assertEqualString("Documents/1/Pages/_rels/1.fpage.rels", archive_entry_pathname(ae));
+
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
+ assertEqualString("Documents/1/Pages/1.fpage", archive_entry_pathname(ae));
+
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
+ assertEqualString("Documents/1/Resources/Fonts/3DFDBC8B-4514-41F1-A808-DEA1C79BAC2B.odttf", archive_entry_pathname(ae));
+
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
+ assertEqualString("Documents/1/_rels/FixedDocument.fdoc.rels", archive_entry_pathname(ae));
+
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
+ assertEqualString("Documents/1/FixedDocument.fdoc", archive_entry_pathname(ae));
+
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
+ assertEqualString("_rels/FixedDocumentSequence.fdseq.rels", archive_entry_pathname(ae));
+
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
+ assertEqualString("FixedDocumentSequence.fdseq", archive_entry_pathname(ae));
+
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
+ assertEqualString("_rels/.rels", archive_entry_pathname(ae));
+
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
+ assertEqualString("[Content_Types].xml", archive_entry_pathname(ae));
+
+ assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
+
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_free(a));
+
+ /* Try reading without seek support. */
+ 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));
+ assertEqualIntA(a, ARCHIVE_OK, read_open_memory(a, p, s, 3));
+
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
+ assertEqualString("Metadata/Job_PT.xml", archive_entry_pathname(ae));
+ assertEqualInt(0, archive_entry_size(ae));
+ assert(!archive_entry_size_is_set(ae));
+ assertEqualInt(AE_IFREG, archive_entry_filetype(ae));
+ assertEqualInt(0777, archive_entry_perm(ae));
+
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
+ assertEqualString("Metadata/MXDC_Empty_PT.xml", archive_entry_pathname(ae));
+ assertEqualInt(0, archive_entry_size(ae));
+ assert(!archive_entry_size_is_set(ae));
+ assertEqualInt(AE_IFREG, archive_entry_filetype(ae));
+ assertEqualInt(0777, archive_entry_perm(ae));
+
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
+ assertEqualString("Documents/1/Metadata/Page1_Thumbnail.JPG", archive_entry_pathname(ae));
+ assertEqualInt(0, archive_entry_size(ae));
+ assert(!archive_entry_size_is_set(ae));
+ assertEqualInt(AE_IFREG, archive_entry_filetype(ae));
+ assertEqualInt(0777, archive_entry_perm(ae));
+
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
+ assertEqualString("Documents/1/Pages/_rels/1.fpage.rels", archive_entry_pathname(ae));
+
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
+ assertEqualString("Documents/1/Pages/1.fpage", archive_entry_pathname(ae));
+
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
+ assertEqualString("Documents/1/Resources/Fonts/3DFDBC8B-4514-41F1-A808-DEA1C79BAC2B.odttf", archive_entry_pathname(ae));
+
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
+ assertEqualString("Documents/1/_rels/FixedDocument.fdoc.rels", archive_entry_pathname(ae));
+
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
+ assertEqualString("Documents/1/FixedDocument.fdoc", archive_entry_pathname(ae));
+
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
+ assertEqualString("_rels/FixedDocumentSequence.fdseq.rels", archive_entry_pathname(ae));
+
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
+ assertEqualString("FixedDocumentSequence.fdseq", archive_entry_pathname(ae));
+
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
+ assertEqualString("_rels/.rels", archive_entry_pathname(ae));
+
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
+ assertEqualString("[Content_Types].xml", archive_entry_pathname(ae));
+
+ assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
+
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_free(a));
+ free(p);
+}
+
+/*
+ * Issue 225: Errors extracting MSDOS Zip archives with directories.
+ */
+static void
+compat_zip_6_verify(struct archive *a)
+{
+ struct archive_entry *ae;
+
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
+ assertEqualString("New Folder/New Folder/", archive_entry_pathname(ae));
+ assertEqualInt(AE_IFDIR, archive_entry_filetype(ae));
+ /* Zip timestamps are local time, so vary by time zone. */
+ /* TODO: A more complex assert would work here; we could
+ verify that it's within +/- 24 hours of a particular value. */
+ /* assertEqualInt(1327314468, archive_entry_mtime(ae)); */
+ assertEqualInt(0, archive_entry_size(ae));
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
+ assertEqualString("New Folder/New Folder/New Text Document.txt", archive_entry_pathname(ae));
+ assertEqualInt(AE_IFREG, archive_entry_filetype(ae));
+ /* Zip timestamps are local time, so vary by time zone. */
+ /* assertEqualInt(1327314476, archive_entry_mtime(ae)); */
+ assertEqualInt(11, archive_entry_size(ae));
+ assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
+}
+
+static void
+test_compat_zip_6(void)
+{
+ const char *refname = "test_compat_zip_6.zip";
+ struct archive *a;
+ void *p;
+ size_t s;
+
+ extract_reference_file(refname);
+ p = slurpfile(&s, refname);
+
+ 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));
+ assertEqualIntA(a, ARCHIVE_OK, read_open_memory_seek(a, p, s, 7));
+ compat_zip_6_verify(a);
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_free(a));
+
+ 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));
+ assertEqualIntA(a, ARCHIVE_OK, read_open_memory(a, p, s, 7));
+ compat_zip_6_verify(a);
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_free(a));
+ free(p);
+}
+
+/*
+ * Issue 226: Try to reproduce hang when reading archives where the
+ * length-at-end marker ends exactly on a block boundary.
+ */
+static void
+test_compat_zip_7(void)
+{
+ const char *refname = "test_compat_zip_7.xps";
+ struct archive *a;
+ struct archive_entry *ae;
+ void *p;
+ size_t s;
+ int i;
+
+ extract_reference_file(refname);
+ p = slurpfile(&s, refname);
+
+ for (i = 1; i < 1000; ++i) {
+ assert((a = archive_read_new()) != NULL);
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_zip(a));
+ assertEqualIntA(a, ARCHIVE_OK, read_open_memory2(a, p, s, i));
+
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_data_skip(a));
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_data_skip(a));
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_data_skip(a));
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_data_skip(a));
+
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_free(a));
+ }
+ free(p);
+}
DEFINE_TEST(test_compat_zip)
{
test_compat_zip_1();
test_compat_zip_2();
+ test_compat_zip_3();
+ test_compat_zip_4();
+ test_compat_zip_5();
+ test_compat_zip_6();
+ test_compat_zip_7();
}
diff --git a/contrib/libarchive/libarchive/test/test_compat_zip_2.zip.uu b/contrib/libarchive/libarchive/test/test_compat_zip_2.zip.uu
index c33e9d99e2e2..f8ada311678e 100644
--- a/contrib/libarchive/libarchive/test/test_compat_zip_2.zip.uu
+++ b/contrib/libarchive/libarchive/test/test_compat_zip_2.zip.uu
@@ -1,5 +1,3 @@
-$FreeBSD$
-
begin 644 test_compat_zip_2.zip
M4$L#!`H``````'V59CT````````````````%````9FEL93$M2E5.2RU02P,$
M"@``````@95F/<>D!,D&````!@````4```!F:6QE,F9I;&4R"E!+`0(>`PH`
diff --git a/contrib/libarchive/libarchive/test/test_compat_zip_3.zip.uu b/contrib/libarchive/libarchive/test/test_compat_zip_3.zip.uu
new file mode 100644
index 000000000000..8e3613985f2f
--- /dev/null
+++ b/contrib/libarchive/libarchive/test/test_compat_zip_3.zip.uu
@@ -0,0 +1,18 @@
+begin 644 test_compat_zip_3.zip
+M4$L#!`H``````-=0SCX````````````````-````<V]A<'5I+30N,"XP+U!+
+M`P04``@`"`#(4,X^C.NJ/7X!```&!```(````'-O87!U:2TT+C`N,"]S;V%P
+M=6DM<V5T=&EN9W,N>&ULI9/12\,P$,;?!?^'D0??DE1%D+EU0U`<*`RWH6\E
+MIK<MVB8UN:[;?^]UG6.H,*=0:.G=]\O7[ZZ=WC+/6@OPP3C;9:<B8BVPVJ7&
+MSKIL,K[EEZP7'Q]UM+/MX%11&AX`D<JA15(;VKH6SA&+MI2P,)7R(+3+9=,M
+MJ3PU,Q8WA$;:,FF7/84T&VU0?:WT''A%KP*+T9?0D3O]>\2%IZ<5+[RQR#V$
+MPMD`G-S]"G5'UK<H8W56II!X>"\A8&)L@B:'!-4;V/_@&E-_X$T&6YHJT25!
+M+6H,@E\H^L#HD*!@N;:3<EP50$&?9'A5"\"B7QTVSD#SRE5_TUA5E:C.A?,S
+M>19%I_+YX7ZT;JA/D-LCXD/,6I731AB<\Q=CZWT\//Y<+1-JL*"1UCLD!?AD
+M[@*R^"+:%]PW$#I4V2Z.Q?2M^S`4G?B,L8E0C.@V&?0KY]]"H32P6`A)UY@6
+M;GA]P[<%01/9@W\$3<D.O7LE4YN)DHI/O9KE5)%?(Y<__,CQ!U!+!PB,ZZH]
+M?@$```8$``!02P$"%`,*``````#74,X^````````````````#0``````````
+M`!``[4$`````<V]A<'5I+30N,"XP+U!+`0(4`Q0`"``(`,A0SCZ,ZZH]?@$`
+M``8$```@``````````````"D@2L```!S;V%P=6DM-"XP+C`O<V]A<'5I+7-E
+@='1I;F=S+GAM;%!+!08``````@`"`(D```#W`0``````
+`
+end
diff --git a/contrib/libarchive/libarchive/test/test_compat_zip_4.zip.uu b/contrib/libarchive/libarchive/test/test_compat_zip_4.zip.uu
new file mode 100644
index 000000000000..3c80cbecf741
--- /dev/null
+++ b/contrib/libarchive/libarchive/test/test_compat_zip_4.zip.uu
@@ -0,0 +1,25 @@
+begin 644 test_compat_zip_4.zip
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M`````````````````````%!+`P0*``````"#KG(_J&4R?@0````$`````P`<
+M`&9O;U54"0`#!43'3A5$QTYU>`L``03U`0``!!0```!F;V\*4$L#!`H`````
+M`(2N<C_ILZ($!`````0````#`!P`8F%R550)``,'1,=.%43'3G5X"P`!!/4!
+M```$%````&)A<@I02P,$"@``````AJYR/^$Y>\P$````!`````,`'`!B87I5
+M5`D``PM$QTX+1,=.=7@+``$$]0$```04````8F%Z"E!+`0(>`PH``````(.N
+M<C^H93)^!`````0````#`!@```````$``0`*@?\!``!F;V]55`4``P5$QTYU
+M>`L``03U`0``!!0```!02P$"'@,*``````"$KG(_Z;.B!`0````$`````P`8
+M```````!``$`=X%``@``8F%R550%``,'1,=.=7@+``$$]0$```04````4$L!
+M`AX#"@``````AJYR/^$Y>\P$````!`````,`&````````0```*2!@0(``&)A
+M>E54!0`#"T3'3G5X"P`!!/4!```$%````%!+!08``````P`#`-L```#"`@``
+"````
+`
+end
diff --git a/contrib/libarchive/libarchive/test/test_compat_zip_5.zip.uu b/contrib/libarchive/libarchive/test/test_compat_zip_5.zip.uu
new file mode 100644
index 000000000000..9dce4521dd3e
--- /dev/null
+++ b/contrib/libarchive/libarchive/test/test_compat_zip_5.zip.uu
@@ -0,0 +1,242 @@
+begin 644 test_compat_zip_5.zip
+M4$L#!!0`"``(`-H0?CX````````````````3````365T861A=&$O2F]B7U!4
+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
+M%$*1H;'!"2,S4O`58G+1"A8D-.$E\1<8&1HF)R@I*C4V-S@Y.D-$149'2$E*
+M4U155E=865IC9&5F9VAI:G-T=79W>'EZ@H.$A8:'B(F*DI.4E9:7F)F:HJ.D
+MI::GJ*FJLK.TM;:WN+FZPL/$Q<;'R,G*TM/4U=;7V-G:XN/DY>;GZ.GJ\O/T
+M]?;W^/GZ_]H`#`,!``(1`Q$`/P#TZBBB@`HHHH`****`"BBB@`HHHH`****`
+M"BBB@`HHHH`****`"BBB@`HHHH`****`"BBB@`HJ+RG\O;]HESOW;\+G&[.W
+MIC&/EZ9QWSS3XD9(D1I&D95`+MC+'U.`!GZ`"@!U%%%`!1110`4444`%4QJE
+MF=4;33(RW2J&VM&RA@02,,1M)PK<`D_*W]TXN44`%%%%`!1110`4444`%%%%
+M`!1110`4444`%%%%`!1110`4444`%%%%`!1110`4444`%%%%`!1110`4444`
+M%%%%`!1110`4444`%%%%`!1110`4444`%%%%`!1110`4444`%%%%`!1110`4
+M444`%%%%`!1110`4444`%%%%`!1110`4444`%%%%`!1110`4444`%%%%`!11
+M10`4444`%%%%`!1110`4444`%%%%`!1110`4444`%%%%`!1110`4444`%%%%
+M`!1110`4444`%%%%`!1110`4444`%%%%`!1110`4444`%%%%`!1110`4444`
+M%%%%`!1110`4444`%%%%`!1110`4444`%%%%`!1110`4444`%%%%`!1110`4
+M444`%%%%`!1110`4444`%%%%`!1110`4444`%%%%`!1110`4444`%%%%`!11
+M10`4444`%%%%`!1110`4444`%%%%`!1110`4444`%%%%`!1110`4444`%%%%
+M`!1110`4444`%%%%`!1110`4444`%%%%`!1110`4444`%%%%`!1110`4444`
+M%%%%`!1110`4444`%%%%`!1110`4444`%%%%`!1110`4444`%%%%`!1110`4
+M444`%%%%`!1110`4444`%%%%`!1110`4444`%%%%`!1110`4444`%%%%`!11
+M10`4444`%%%%`!1110`4444`%%%%`!1110`4444`%%%%`!1110`4444`%%%%
+M`!1110`4444`%%%%`!1110`4444`%%%%`!1110`4444`%%%%`!1110`4444`
+M%%%%`!1110`4444`%%%%`!1110`4453FTNSF9FDC;+W"738D90TB!0I(!Y`V
+M+QTR`<9H`N4444`%%%%`!1110`4444`%%%%`!1110`4444`%%%%`!1110`44
+M44`%%%%`!1110`4444`%%%%`!1110`4444`%%%%`!1110!__V5!+!PC?FNW>
+MUP4``-<%``!02P,$%``(``@`VA!^/@```````````````"0```!$;V-U;65N
+M=',O,2]086=E<R]?<F5L<R\Q+F9P86=E+G)E;'-ED$M.Q#`,AO=(W*'*/G4S
+M=*"@*:,^J,2VF@M$J?L0DP=QBH:SL>!(7($,8L%CZ=^_?W_VQ]O[;G_2Q^0%
+M/2W6E$RD&4O0*#LL9BK9&D9>L/W]Y<6NQZ,,T4/SXBB)0X9*-H?@[@!(S:@E
+MI=:AB9W1>BU#+/T$3JHG.2%LLNP:_,\,]C<U.4@_82@9M%:M&DT@$-`CV=4K
+M).CL6;EJN[9NBIKG6Y'S7'2"5T56\/:A$LW-;5TUFSJU0P@C2QZ'DO7QH,.K
+MPW^P>E'>DAU#JJR&DZ,SXQ:^,)_7Q>/`_?=N!F=6^/6"J'P"4$L'"%!53P;H
+M````/P$``%!+`P04``@`"`#:$'X^````````````````&0```$1O8W5M96YT
+M<R\Q+U!A9V5S+S$N9G!A9V75DTM.PS`0AM=P"LMLJ5]Q'J4-4A\$V`"B0L`R
+M2MS$4F)7L2L5+L`18%E8L^5*(&Z!DXH*Q`F8A34>:SS^/_T>)G(E\HNT$.!:
+MYK:,8=CW4!A`<")D4=H84LH8\EUA55?*Q+"T=G&`L<E*4:<&U3)KM-%SBS)=
+MX]7"8$:(C\FFX:!*51'#I<KAX>[.\+BZ6Y0&)+*J8K@WGY,N($BTLE>-C"&>
+MZFQ9"V4-IOA2&+UL,F%P>VZP-TVFXTDT[G&?\AZG">V-(A+UID<C.@G[X]&$
+MC9'.K9UO;KP4*A>-5,51/9/WPDEAR(WS(9C9NTK,9+VL4BMUJ^I,*P'!>2,+
+MJ6YBZ(51IWE3N'6MA*,(@E.52_<@1XGTV3XE=!`&W',)&SC9+;8K)3.=BYEM
+M!\?P_7']OG[X?'F"`/\K`J&/@N@G`+HALB401/L^'031X#O9;O]`2+OX;P0\
+MA\!GOSS`..(_74"9SWEG`Z]5STB[>JT5./U#X>/U%5#P^?S6@1CB[<\[W/T"
+M4$L'"%=?-U>$`0``A@,``%!+`P04``@`"`#:$'X^````````````````1@``
+M`$1O8W5M96YT<R\Q+U)E<V]U<F-E<R]&;VYT<R\S1$9$0D,X0BTT-3$T+30Q
+M1C$M03@P."U$14$Q0S<Y0D%#,D(N;V1T=&;MW7UP'.5]!_#?L[MWM[NW=[=W
+MNCN=9<M:Z80E6[;U9DFV:Z*3+-LR!LEO=]@0%0M;E@36"_)+`0,ZC&G4]`7!
+M0,8S;2=VQF2@D*E+(1C:@@GN!!)"TA1H4IM434@,M`:;A%@&6=??KLY&O`3"
+MD%29X?OY>F^?M]U]]NVLT1]VV3?^^ML'OJ?==WI9>.?SXX]UGSYR3]^!EZ]\
+M[G1#KO3\^#_<<N`P32-YS0(BJ6+%NF3CB1=>.T-RZD$BT=6ZKKRJ]2WE*UP^
+M3$2IS3WM_=\LG?M3$JM>Y;8;-^_:87EFRZ=(M)3R]D]L[>_LN>3`7:^2N&P+
+MC_=UMF_OIP+22/)P/YF=VV[8>M71-XI)K.;MW5_OZFC?\O1K]R=Y7TNXO[:+
+M&R31NHKK.[A>W-6SXWHU3<.\;Y/$RI>V]6UN[Y<'UI"XG-L>'.MIO[Y_0X&X
+ME,?OX_%6;WM/1W%:OI$DY2]XFQOZ^[;OR)PD'Q]?M?O[!SKZ7<=;G^/YV?M_
+M:!<?3]S3>@GW+[2/MXN/IY&HX?H7[>.1X%:):-<#FP)7!9:\35Z[@>C^D\Z*
+M'GOYFK\ERARG#!WCJF&/==C#CG-[\<1X[L\6SFOIM5M2-U,W>9P&B4PJI]F\
+M:3L]E-U'6@R3BTMI#E^][#K-QVG@#81;DX6-VV35_]Z^K]BX;"DER-JW;V(.
+M9"_*^1E<F$CZPE))GT6:\C_3]E,M3=ZIG@(`````````````````````````
+M`````````````````````````````````````````````,#_!T&D3_4<````
+M`,[CGTWP?\L"````````````````````````````````````````````````
+M?([AWTL%````````````````````````````````````````````````````
+M``````````````````````"`ST(0!:9Z#N?Q7+2IG@,`````````_,&0[%\6
+ML##)=DGD\>(F(;+=0G+&O!]WRLH'VL*?\KA-GWZJ[W/A^!_8T8?F(7_TX2=\
+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
+M\J1V95+913%Z.5MV3VKWT`9ZVRZKRGO[Y[(@M[@L6[ZP?R[+D]J52>4+^^>R
+M>U*[L__2S;.MI7W]-PQT=W;ML*YH;FU9L7&EM6Q;Q^8=`WV]W9NY<[Y5N6A1
+M3<NZ[IYU.WO7=G3NW-8^D.H8V-[=UVM5SZ^L6C_0OJ6CIWW@6JMOZV_8PURK
+ML:/[FN[>3BJES7P!+;YP?=1/-]``=5,G==$.;KN"FJF56F@%;:257%]&VZB#
+MQ^_@47W4RR,W9[><S^M*6L2IX?'KN*>'/W?RF+6\12>7ME$[;Y7BV@!MYWY[
+M>XNJ><M*JJ+UW-I.6[BWQQEW+??UT=9/.8>Y7&KDWFZZAI=>ZNPX=.6?MZZ;
+M>)8<F=?YV:$+S^!D,JE\]V(D,AG[?G#+L<QQ>ZC]2<<^N%5++U<;*,W%]Y;2
+MC]CO;R]-<S[3]E,MS3<,````````````````````````````````````````
+M``````````````````````````````#@<T`0F5,]!P```(#S^&<3;:KG````
+M``````````````````````````````````````````````!3!_\F&0``````
+M````````````````````````````````````````````````````````````
+M`````````'P6@L@WU7,X[P]I+@`````````PQ23GTTTD2GD]EYQ?'1#IXT9V
+M[92=QE_Q,OWAEFV&(;@JUD\>;XS[LVNG[#2^E1WO]SOCTY/'^\?-[-HI.XVG
+MLN--TQG_X.3QYG@HNW;*3N,;V?$AITO\:/)XWW@@NW;*3N/I[/B`TR4ID\=[
+MQWW9M5-V&G^9'>_C+GO-595<'")[VY!AD&Z\0P:77=,?SC]622TK[5$?&/O'
+MO$SS^\GPGR7_)XP]QHMEFN0W1\G\^+%B-Y=GAT)DALY0Z./'2LU<S@\$R!<X
+M2X%/&/MC+D=]/O+ZWG%^A_2^L?;S,G@DH5`B,[)?%U:HJ.CI$;(:QT])U'?"
+MO/?+ZV?'0R5$A9XG[O[2F+)BK,DS'B[ZXE&BS$BB?H]:O*>9_^@B-I*@P5>&
+M=[_RM1OWSQF_5VU;573'"`V>4LFBM"1G1E9+"8V:A#G4>(2?"XN^^BWZ`EGB
+MR1/JG/N^-GQ7T=#0_D*>3H,X\UJQI`Z.J%\:-].#IV*)`\;!;VWBPXV:E`Z,
+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
+MR#H[\JFA>QY;5(RPCPJZE/H]8M0=N4L4SNK`D4T2FAT.?<2UE!N46YA,L^1,
+MAL+7TG`.FA3@'$4L\6=0F)8UX(3CWR=C\@%02P<(`"(GQI@```#.````4$L#
+M!!0`"``(`-H0?CX````````````````+````7W)E;',O+G)E;'.5D,]*Q#`0
+MA^^"[U!RM],*BLC6O8BB("QK[Q*321ML_FQF*O79//A(OH)9M:`K>_"89.;W
+M??F]O[XMEI,;BF=,9(-O1%U6HD"O@K:^:\3(YNA,+"\.#Q9K'"3G&>IMI"(O
+M>6I$SQS/`4CUZ"25(:+/+R8D)SD?4P=1JB?9(1Q7U2FDGQEB-[5H9>J0&P%7
+M=D)]&=3HT/,];L9LA*71A!M1W.A&K+-E^Q+QCX&S*@4*ADL5'$R1MN`3R&RS
+MS4P8$U(._80*V*\PTPEJN$.66K*$5?Y)_=#VHWOTT@[E[>KZVZ?>X_.O1L#-
+M()X17XKPJ_Q\\P%02P<(MR#R__,```"Y`0``4$L#!!0`"``(`-H0?CX`````
+M```````````3````6T-O;G1E;G1?5'EP97-=+GAM;*62STK$,!"'[X+O4'*5
+M-M6#B&S=@RN")P^^0$PF;=SFSS;3I3Z;!Q_)5W#2"L+"MK+>$F9^WP<S\_7Q
+MN5H/MLWVT$7C7<4NBY)EX*17QM45ZU'G-VQ]=WZV>GD/$#-J=K%B#6*XY3S*
+M!JR(A0_@J*)]9P72MZMY$'(K:N!797G-I7<(#G-,#)9H&]"B;S%[&*@PJ3MH
+M(\ONI]9DJY@(H352(-7YWJD#3_[C*"@Y]L3&A'A!#8P?<6@58;<@L;_@(<1<
+MFP&4\K*WE*!T3].!!8F7_W#,LP-E3H"GV"S8*T3]=[!_U7VD$J@\+24M]B@Z
+M:9?!G7%(-U>,#S1R"_.3>'I^/*`:FP[N+4`]A?AXLO3Z!E!+!PA?-651$0$`
+M`.<"``!02P$"+0`4``@`"`#:$'X^,JA?,K\#``#G#0``$P``````````````
+M````````365T861A=&$O2F]B7U!4+GAM;%!+`0(M`!0`"``(`-H0?CZV6O$]
+MTP```,@!```:```````````````````$``!-971A9&%T82]-6$1#7T5M<'1Y
+M7U!4+GAM;%!+`0(M`!0`"````-H0?C[?FNW>UP4``-<%```H````````````
+M`````!L%``!$;V-U;65N=',O,2]-971A9&%T82]086=E,5]4:'5M8FYA:6PN
+M2E!'4$L!`BT`%``(``@`VA!^/E!53P;H````/P$``"0`````````````````
+M2`L``$1O8W5M96YT<R\Q+U!A9V5S+U]R96QS+S$N9G!A9V4N<F5L<U!+`0(M
+M`!0`"``(`-H0?CY77S=7A`$``(8#```9`````````````````((,``!$;V-U
+M;65N=',O,2]086=E<R\Q+F9P86=E4$L!`BT`%``(``@`VA!^/N*$;,_\$```
+M%%@#`$8`````````````````30X``$1O8W5M96YT<R\Q+U)E<V]U<F-E<R]&
+M;VYT<R\S1$9$0D,X0BTT-3$T+30Q1C$M03@P."U$14$Q0S<Y0D%#,D(N;V1T
+M=&902P$"+0`4``@`"`#:$'X^!!!%#\4````-`0``*0````````````````"]
+M'P``1&]C=6UE;G1S+S$O7W)E;',O1FEX961$;V-U;65N="YF9&]C+G)E;'-0
+M2P$"+0`4``@`"`#:$'X^#(8J/94```"S````'@````````````````#9(```
+M1&]C=6UE;G1S+S$O1FEX961$;V-U;65N="YF9&]C4$L!`BT`%``(``@`VA!^
+M/A*Y#,J]````!@$``"8`````````````````NB$``%]R96QS+T9I>&5D1&]C
+M=6UE;G1397%U96YC92YF9'-E<2YR96QS4$L!`BT`%``(``@`VA!^/@`B)\:8
+M````S@```!L`````````````````RR(``$9I>&5D1&]C=6UE;G1397%U96YC
+M92YF9'-E<5!+`0(M`!0`"``(`-H0?CZW(/+_\P```+D!```+````````````
+M`````*PC``!?<F5L<R\N<F5L<U!+`0(M`!0`"``(`-H0?CY?-651$0$``.<"
+M```3`````````````````-@D``!;0V]N=&5N=%]4>7!E<UTN>&UL4$L%!@``
+0```,``P`I@,``"HF````````
+`
+end
diff --git a/contrib/libarchive/libarchive/test/test_compat_zip_6.zip.uu b/contrib/libarchive/libarchive/test/test_compat_zip_6.zip.uu
new file mode 100644
index 000000000000..ef6d1912697f
--- /dev/null
+++ b/contrib/libarchive/libarchive/test/test_compat_zip_6.zip.uu
@@ -0,0 +1,10 @@
+begin 755 test_compat_zip_6.zip
+M4$L#!`H``````'@3-T`````````````````6````3F5W($9O;&1E<B].97<@
+M1F]L9&5R+U!+`P0*``````!\$S=`%4-8OPL````+````*P```$YE=R!&;VQD
+M97(O3F5W($9O;&1E<B].97<@5&5X="!$;V-U;65N="YT>'1S;VUE('1E>'0-
+M"E!+`0(4"PH``````'@3-T`````````````````6````````````$```````
+M``!.97<@1F]L9&5R+TYE=R!&;VQD97(O4$L!`A0+"@``````?!,W0!5#6+\+
+M````"P```"L``````````0`@````-````$YE=R!&;VQD97(O3F5W($9O;&1E
+M<B].97<@5&5X="!$;V-U;65N="YT>'102P4&``````(``@"=````B```````
+`
+end
diff --git a/contrib/libarchive/libarchive/test/test_compat_zip_7.xps.uu b/contrib/libarchive/libarchive/test/test_compat_zip_7.xps.uu
new file mode 100644
index 000000000000..cfc8ecb2323f
--- /dev/null
+++ b/contrib/libarchive/libarchive/test/test_compat_zip_7.xps.uu
@@ -0,0 +1,357 @@
+begin 644 test_compat_zip_7.xps
+M4$L#!!0`"``(`$"K-D`````````````````3````365T861A=&$O2F]B7U!4
+M+GAM;.U7VW*C.!!]WZK]AQ3O$W"2FHU=<:8:&WS9)3$VX,L;!L766B`*1+#S
+M]=NR\26[\83,S,[3=/DBB3ZGI5:K6]Q]64?LXIFD&>5Q4ZE=:LH%B0,>TGC1
+M5%S'_'2K?+G__;>[)'MJ#%(:"X<&*R(N$!9G#1QM*DLADH:J9L&21'YV&=$@
+MY1E_$I<!C]2"QB$O,O5*TZY5[59-)`>2[QH[S%/J1Z3@Z4HI:=<9/=`617%9
+M7%_R="$Y:NK$^FNT17VB<2;\."!'5/@^2CE9[!X89QI*]85\5O'SUD)69(/+
+M"#/U`%TG6<B#/"*Q*%(J2*H</+?Z`9[;&U3N=QOD2T^BE5Y,Q46,[::R6QP^
+M6I`V>8YX2$:QGV1++DJ0Y[.<W#NVGD#'@F"A/T/7@GFA1]"UH0?Z%$P`MX`%
+M&+8<_QNZ+LQMG4'G!D+`<3.0N$3JSVQ]`P<Q#(!Y`.:B#>JM[$/+;OFM%[LW
+M`]`!;F$,O98<W_T#V#9H\#/$/K3T[>]B.U_\ME4I;V*,8=]A+D6$[H!E@96.
+MZG&ODKF6?=HSOFG*O^27_#2Q7W<-&;/FPX-G\+*/XFK@VS(?]&1>>('.+<P6
+MN@9XDL>@VV!:,G\8<GQ:Z#7H:#(_Y&5>F4@<XC7HN)@_)"G+@ZZGV1'+P9@-
+MW%7-<6K>R-9<<%>>,S36%IA>[D_Z+-"&E@-Z?QX/61"MV70R2^91`(XVZR"/
+MF(Y#YG59@?;^=`VOZXR]%1CUC3_V\K!C:OZXGH.I#UPV'-DN<\%X>)YWULL0
+MY[+E,-'&53T+)\-D?G4#SK6^Q5BV;D\G.@O80T(BU#4\US.\T0Y?WSCC^FIF
+MP^:ATR^";_.\)7\<;VEXA2%S4_-./>;I7?M5HC^?^['(-/I\WN())1DPUBY+
+M47::^B^PVC;$)D%]K*`-K"UD@77JOE;)K$E\D:?DQ*"L-!8)J3^B+Z0T])@(
+M++DG2KW1(]R4#T<!3TDX2'E"4K$Y43JPC&DHEE7F?%63Q>Z_$W]MHJK9+J&+
+MI:ADM_Y');OJT1EEI_3?.6?B[O7B)!<ZC<^Y$G+!1X210"CJ^Z3E=6#+BQO)
+MB/^,=XJWN$O-1]/\(&^$`>"@C[Y"VA\8'71S%>)]2#VF%"/7EUSG/#'@J4A]
+M6LD/4G]_'%J<,5^<C547[\-;A0_-=T@RSO)ST]T[=SM6>^\@'+DF5:+Q\W<?
+M@:/!Z0\S^.'8W^YZ+C#Z<8-X>FY[3A^>71!>?6E`="JR`4D'=$U8I6-]\YU^
+M;*<47S?^#[-?\:;ZKW<U?'W[!U!+!PAPQHG6P`,``.<-``!02P,$%``(``@`
+M0*LV0````````````````!H```!-971A9&%T82]-6$1#7T5M<'1Y7U!4+GAM
+M;*V0P6K#,`R&7R7X7LMM8930M+>=.ABLA5Z#K;0FLQ0L;\[>?NZZ9CL,ML.$
+M#D+P?>+7>CN&Y^H5HWBF1LVU41629>?IU*C#_GZV4MO->I"N?HR>TM[;'E-5
+M()*Z;!MU3FFH`<2>,;2B@[>1A;ND+0?(GAQG@84Q2S`K&"Z.HKX.5Z:+;<#,
+ML5>?VE'\I,TYZ[S4'$\7QQR.#[NG#VKF25)+%K\H]SNEOD6]@22FU-^#W$'I
+MGX+T^%9B.($)'0=Q;%\"4LK1)XQJ^ES_#Y^['52P>0=02P<(MEKQ/=,```#(
+M`0``4$L#!!0`"````$"K-D`````````````````H````1&]C=6UE;G1S+S$O
+M365T861A=&$O4&%G93%?5&AU;6)N86EL+DI01__8_^``$$I&248``0$!`&``
+M8```_]L`0P`-"0H+"@@-"PH+#@X-#Q,@%1,2$A,G'!X7("XI,3`N*2TL,SI*
+M/C,V1C<L+4!7049,3E)34C(^6F%:4&!*45)/_]L`0P$.#@X3$1,F%14F3S4M
+M-4]/3T]/3T]/3T]/3T]/3T]/3T]/3T]/3T]/3T]/3T]/3T]/3T]/3T]/3T]/
+M3T]/3T]/_\``$0@!``"U`P$B``(1`0,1`?_$`!\```$%`0$!`0$!````````
+M```!`@,$!08'"`D*"__$`+40``(!`P,"!`,%!00$```!?0$"`P`$$042(3%!
+M!A-180<B<10R@9&A""-"L<$54M'P)#-B<H()"A87&!D:)28G*"DJ-#4V-S@Y
+M.D-$149'2$E*4U155E=865IC9&5F9VAI:G-T=79W>'EZ@X2%AH>(B8J2DY25
+MEI>8F9JBHZ2EIJ>HJ:JRL[2UMK>XN;K"P\3%QL?(R<K2T]35UM?8V=KAXN/D
+MY>;GZ.GJ\?+S]/7V]_CY^O_$`!\!``,!`0$!`0$!`0$````````!`@,$!08'
+M"`D*"__$`+41``(!`@0$`P0'!00$``$"=P`!`@,1!`4A,08205$'87$3(C*!
+M"!1"D:&QP0DC,U+P%6)RT0H6)#3A)?$7&!D:)B<H*2HU-C<X.3I#1$5&1TA)
+M2E-455976%E:8V1E9F=H:6IS='5V=WAY>H*#A(6&AXB)BI*3E)66EYB9FJ*C
+MI*6FIZBIJK*SM+6VM[BYNL+#Q,7&Q\C)RM+3U-76U]C9VN+CY.7FY^CIZO+S
+M]/7V]_CY^O_:``P#`0`"$0,1`#\`].HHHH`****`"BBB@`HHHH`****`"BBB
+M@`HHHH`****`"BBB@`HHHH`****`"BBB@`HHHH`**SIM'BE:9A>:A&95<#9=
+MOB-G!!903UY&`<JI`*@'.77.F?:+UKK[=?1$P"(1Q38C4AMP<+C&[(QSD$<$
+M$$T`7Z*IFP;[5-<+?7:M(K@*'!2,LJ#*J01D;,C.1EFZYIS6$+($+W.%01C%
+MS(#@!AUW9)PQYZYP<Y4$`%JBLZST>*V)=[S4+F5FW-)-=OR=V[[H(0#(`P%`
+MQQT)S*--B\UI&GNVS*)57[2X"D9.T`$97+$X.1R!T50`"Y15/4=/6_M9H?M5
+MW:M,JJ9;:8HZA6S\O4`GD$XR1P>@Q:2-49V!;+MN.6)`.`.`>@XZ#C.3U)H`
+MR]7\2Z-HLOE:G?+!(55@FQF)#;L$``\?*?IQGJ,SG5[1=/DOI/-2%)V@/[LN
+MQ<2F+`5<DY8<8]13;#2%LK+[*;_4+A"KAWN+@L[EL<[^JD`8&T@<D]>:)M(6
+M2XBFBO\`4(`DIE>-+@LLA+*VTALX7Y`,+@8+#H30!+I.IVVL:='?V19K>1G"
+M,RX+!6*YQZ'&1WQZ5<J*WMTMT*1M*0<?ZR5G/``ZL2>@'U.3U)-2T`%%%%`!
+M1110`4444`%%%%`!1110`4444`%%%%`!1110`4444`%%%%`!1110`4444`%%
+M%%`!1110`4444`%%%%`!1110`4444`%%%%`!1110`4444`%%%%`!1110`444
+M4`%%%%`!1110`4444`%%%%`!1110`4444`%%%%`!1110`4444`%%%%`!1110
+M`4444`%%%%`!1110`4444`%%%%`!1110`4444`%%%%`!1110`4444`%%%%`!
+M1110`4444`%%%%`!1110`4444`%%%%`!1110`4444`%%%%`!1110`4444`%%
+M%%`!1110`4444`%%%%`!1110`4444`%%%%`!1110`4444`%%%%`!1110`444
+M4`%%%%`!1110`4444`%%%%`!1110`4444`%%%%`!1110`4444`%%%%`!1110
+M`4444`%%%%`!1110`4444`%%%%`!1110`4444`%%%%`!1110`4444`%%%%`!
+M1110`4444`%%%%`!1110`4444`%%%%`!1110`4444`%%%%`!1110`4444`%%
+M%%`!1110`4444`%%%%`!1110`4444`%%%%`!1110`4444`%%%%`!1110`444
+M4`%%%%`!1110`4444`%%%%`!1110`4444`%%%%`!1110`4444`%%%%`!1110
+M`4444`%%%%`!1110`4444`%%%%`!1110`4444`%%%%`!1110`4444`%%%%`!
+M1110`4444`%%%%`!1110`4444`%%%%`!1110`4444`%%%%`!1110`4444`%%
+M%%`!1110`4444`%%%%`!1110`4444`%%%%`!14%U96UXT#74*RFWE$T6[D*X
+M!`;'J,G'OSU`J6.-8U*J6(+%OF8L<DDGD]N>!T`X'%`#J***`"BBB@`HHHH`
+M****`"BBB@`HHHH`****`"BBB@`HHHH`****`"BBB@`HHHH`****`"BBB@`H
+MHHH`****`"BBB@`HHHH`_]E02P<(%>T[FRH'```J!P``4$L#!!0`"``(`$"K
+M-D`````````````````D````1&]C=6UE;G1S+S$O4&%G97,O7W)E;',O,2YF
+M<&%G92YR96QS99!-3L0P#(7W2-RARCYU0]NA@Z:,IBHCL:WF`E'J_HA)')(4
+M#6=CP9&X`BEBP<_2S\_/G_WQ]K[;7_0Y>4'G9S(U$VG&$C2*^MF,-5O"P"NV
+MO[^^VG5XEB%Z_#1;G\0AXVLVA6#O`+R:4$N?DD43.P,Y+4,LW0A6JB<Y(MQD
+MV0;<SPSV-S4Y23=BJ!FTI!:-)G@0T*&GQ2GT<*15:<K#@SAL!&^K/.-%(8Y\
+MVV:W?%L6Q[P13=Z454I]"`-+'ON:=?&@TZO%?[!Z5HX\#2%5I.%B_<I8PA?F
+M\S([[+G[WLU@985?+XC*)U!+!PCA-I_!Z````#\!``!02P,$%``(``@`0*LV
+M0````````````````!D```!$;V-U;65N=',O,2]086=E<R\Q+F9P86=EU9/-
+M;MP@$,?/S5,@>EZ^;`P.ZTA9;=SVTD:Q5DF.EHUM)!NO#*MN^O3%MK+:-D\0
+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
+MR.;H3"PO#@\6:QPDYQGJ;:0B+WEJ1,\<SP%(]>@DE2&BSR\F)"<Y'U,'4:HG
+MV2$<5]4II)\98C>U:&7JD!L!5W9"?1G4Z-#S/6[&;(2ET80;4=SH1JRS9?L2
+M\8^!LRH%"H9+%1Q,D;;@$\ALL\U,&!-2#OV$"MBO,-,):KA#EEJRA%7^2?W0
+M]J-[]-(.Y>WJ^MNGWN/SKT;`S2">$5^*\*O\?/,!4$L'"+<@\O_S````N0$`
+M`%!+`P04``@`"`!`JS9`````````````````$P```%M#;VYT96YT7U1Y<&5S
+M72YX;6REDL]*Q#`0A^^"[U!RE3;5@XALW8,K@B</OD!,)FW<YL\VTZ4^FP<?
+MR5=PT@K"PK:RWA)F?M\',_/U\;E:#[;-]M!%XUW%+HN29>"D5\;5%>M1YS=L
+M?7=^MGIY#Q`S:G:Q8@UBN.4\R@:LB(4/X*BB?6<%TK>K>1!R*VK@5V5YS:5W
+M"`YS3`R6:!O0HF\Q>QBH,*D[:"/+[J?69*N8"*$U4B#5^=ZI`T_^XR@H.?;$
+MQH1X00V,'W%H%6&W(+&_X"'$7)L!E/*RMY2@=$_3@06)E_]PS+,#94Z`I]@L
+MV"M$_7>P?]5]I!*H/"TE+?8H.FF7P9UQ2#=7C`\T<@OSDWAZ?CR@&IL.[BU`
+M/87X>++T^@902P<(7S5E41$!``#G`@``4$L!`BT`%``(``@`0*LV0'#&B=;`
+M`P``YPT``!,``````````````````````$UE=&%D871A+TIO8E]05"YX;6Q0
+M2P$"+0`4``@`"`!`JS9`MEKQ/=,```#(`0``&@`````````````````!!```
+M365T861A=&$O35A$0U]%;7!T>5]05"YX;6Q02P$"+0`4``@```!`JS9`%>T[
+MFRH'```J!P``*``````````````````<!0``1&]C=6UE;G1S+S$O365T861A
+M=&$O4&%G93%?5&AU;6)N86EL+DI01U!+`0(M`!0`"``(`$"K-D#A-I_!Z```
+M`#\!```D`````````````````)P,``!$;V-U;65N=',O,2]086=E<R]?<F5L
+M<R\Q+F9P86=E+G)E;'-02P$"+0`4``@`"`!`JS9`'L8"JZX!````!```&0``
+M``````````````#6#0``1&]C=6UE;G1S+S$O4&%G97,O,2YF<&%G95!+`0(M
+M`!0`"``(`$"K-D"&SHM0R",``#1%``!&`````````````````,L/``!$;V-U
+M;65N=',O,2]297-O=7)C97,O1F]N=',O0C5!13%!-C$M1#@S,"TT-#%&+3E$
+M,#<M.34T1C-",4(S0C4X+F]D='1F4$L!`BT`%``(``@`0*LV0`0010_%````
+M#0$``"D`````````````````!S0``$1O8W5M96YT<R\Q+U]R96QS+T9I>&5D
+M1&]C=6UE;G0N9F1O8RYR96QS4$L!`BT`%``(``@`0*LV0`R&*CV5````LP``
+M`!X`````````````````(S4``$1O8W5M96YT<R\Q+T9I>&5D1&]C=6UE;G0N
+M9F1O8U!+`0(M`!0`"``(`$"K-D`2N0S*O0````8!```F````````````````
+M``0V``!?<F5L<R]&:7AE9$1O8W5M96YT4V5Q=65N8V4N9F1S97$N<F5L<U!+
+M`0(M`!0`"``(`$"K-D``(B?&F````,X````;`````````````````!4W``!&
+M:7AE9$1O8W5M96YT4V5Q=65N8V4N9F1S97%02P$"+0`4``@`"`!`JS9`MR#R
+M__,```"Y`0``"P````````````````#V-P``7W)E;',O+G)E;'-02P$"+0`4
+M``@`"`!`JS9`7S5E41$!``#G`@``$P`````````````````B.0``6T-O;G1E
+C;G1?5'EP97-=+GAM;%!+!08`````#``,`*8#``!T.@``````
+`
+end
diff --git a/contrib/libarchive/libarchive/test/test_empty_write.c b/contrib/libarchive/libarchive/test/test_empty_write.c
index 9980e3aa8497..0bf04fdce6a9 100644
--- a/contrib/libarchive/libarchive/test/test_empty_write.c
+++ b/contrib/libarchive/libarchive/test/test_empty_write.c
@@ -60,8 +60,8 @@ DEFINE_TEST(test_empty_write)
assertEqualIntA(a, 0, archive_write_data(a, "", 0));
/* Close out the archive. */
- assertA(0 == archive_write_close(a));
- assertA(0 == archive_write_finish(a));
+ assertEqualIntA(a, ARCHIVE_OK, archive_write_close(a));
+ assertEqualInt(ARCHIVE_OK, archive_write_free(a));
}
/*
@@ -90,8 +90,8 @@ DEFINE_TEST(test_empty_write)
assertEqualIntA(a, 0, archive_write_data(a, "", 0));
/* Close out the archive. */
- assertA(0 == archive_write_close(a));
- assertA(0 == archive_write_finish(a));
+ assertEqualIntA(a, ARCHIVE_OK, archive_write_close(a));
+ assertEqualInt(ARCHIVE_OK, archive_write_free(a));
}
/*
@@ -115,6 +115,6 @@ DEFINE_TEST(test_empty_write)
assertEqualIntA(a, 0, archive_write_data(a, "", 0));
/* Close out the archive. */
- assertA(0 == archive_write_close(a));
- assertA(0 == archive_write_finish(a));
+ assertEqualIntA(a, ARCHIVE_OK, archive_write_close(a));
+ assertEqualInt(ARCHIVE_OK, archive_write_free(a));
}
diff --git a/contrib/libarchive/libarchive/test/test_entry.c b/contrib/libarchive/libarchive/test/test_entry.c
index 35ca6e3b1280..16f87da8659b 100644
--- a/contrib/libarchive/libarchive/test/test_entry.c
+++ b/contrib/libarchive/libarchive/test/test_entry.c
@@ -63,6 +63,7 @@ DEFINE_TEST(test_entry)
size_t xsize; /* For xattr tests. */
wchar_t wc;
long l;
+ int i;
assert((e = archive_entry_new()) != NULL);
@@ -111,6 +112,12 @@ DEFINE_TEST(test_entry)
archive_entry_set_atime(e, 13579, 24680);
assertEqualInt(archive_entry_atime(e), 13579);
assertEqualInt(archive_entry_atime_nsec(e), 24680);
+ archive_entry_set_atime(e, 13580, 1000000001L);
+ assertEqualInt(archive_entry_atime(e), 13581);
+ assertEqualInt(archive_entry_atime_nsec(e), 1);
+ archive_entry_set_atime(e, 13580, -7);
+ assertEqualInt(archive_entry_atime(e), 13579);
+ assertEqualInt(archive_entry_atime_nsec(e), 999999993);
archive_entry_unset_atime(e);
assertEqualInt(archive_entry_atime(e), 0);
assertEqualInt(archive_entry_atime_nsec(e), 0);
@@ -120,6 +127,12 @@ DEFINE_TEST(test_entry)
archive_entry_set_birthtime(e, 17579, 24990);
assertEqualInt(archive_entry_birthtime(e), 17579);
assertEqualInt(archive_entry_birthtime_nsec(e), 24990);
+ archive_entry_set_birthtime(e, 17580, 1234567890L);
+ assertEqualInt(archive_entry_birthtime(e), 17581);
+ assertEqualInt(archive_entry_birthtime_nsec(e), 234567890);
+ archive_entry_set_birthtime(e, 17581, -24990);
+ assertEqualInt(archive_entry_birthtime(e), 17580);
+ assertEqualInt(archive_entry_birthtime_nsec(e), 999975010);
archive_entry_unset_birthtime(e);
assertEqualInt(archive_entry_birthtime(e), 0);
assertEqualInt(archive_entry_birthtime_nsec(e), 0);
@@ -129,27 +142,27 @@ DEFINE_TEST(test_entry)
archive_entry_set_ctime(e, 13580, 24681);
assertEqualInt(archive_entry_ctime(e), 13580);
assertEqualInt(archive_entry_ctime_nsec(e), 24681);
+ archive_entry_set_ctime(e, 13581, 2008182348L);
+ assertEqualInt(archive_entry_ctime(e), 13583);
+ assertEqualInt(archive_entry_ctime_nsec(e), 8182348);
+ archive_entry_set_ctime(e, 13582, -24681);
+ assertEqualInt(archive_entry_ctime(e), 13581);
+ assertEqualInt(archive_entry_ctime_nsec(e), 999975319);
archive_entry_unset_ctime(e);
assertEqualInt(archive_entry_ctime(e), 0);
assertEqualInt(archive_entry_ctime_nsec(e), 0);
assert(!archive_entry_ctime_is_set(e));
-#if ARCHIVE_VERSION_NUMBER >= 1009000
/* dev */
+ assert(!archive_entry_dev_is_set(e));
archive_entry_set_dev(e, 235);
+ assert(archive_entry_dev_is_set(e));
assertEqualInt(archive_entry_dev(e), 235);
-#else
- skipping("archive_entry_dev()");
-#endif
/* devmajor/devminor are tested specially below. */
-#if ARCHIVE_VERSION_NUMBER >= 1009000
/* filetype */
archive_entry_set_filetype(e, AE_IFREG);
assertEqualInt(archive_entry_filetype(e), AE_IFREG);
-#else
- skipping("archive_entry_filetype()");
-#endif
/* fflags are tested specially below */
@@ -185,13 +198,17 @@ DEFINE_TEST(test_entry)
archive_entry_copy_hardlink_w(e, NULL);
assertEqualString(archive_entry_hardlink(e), NULL);
assertEqualWString(archive_entry_hardlink_w(e), NULL);
-#if ARCHIVE_VERSION_NUMBER >= 1009000
+
/* ino */
+ assert(!archive_entry_ino_is_set(e));
archive_entry_set_ino(e, 8593);
+ assert(archive_entry_ino_is_set(e));
assertEqualInt(archive_entry_ino(e), 8593);
-#else
- skipping("archive_entry_ino()");
-#endif
+ assertEqualInt(archive_entry_ino64(e), 8593);
+ archive_entry_set_ino64(e, 8594);
+ assert(archive_entry_ino_is_set(e));
+ assertEqualInt(archive_entry_ino(e), 8594);
+ assertEqualInt(archive_entry_ino64(e), 8594);
/* link */
archive_entry_set_hardlink(e, "hardlinkname");
@@ -231,18 +248,20 @@ DEFINE_TEST(test_entry)
archive_entry_set_mtime(e, 13581, 24682);
assertEqualInt(archive_entry_mtime(e), 13581);
assertEqualInt(archive_entry_mtime_nsec(e), 24682);
+ archive_entry_set_mtime(e, 13582, 1358297468);
+ assertEqualInt(archive_entry_mtime(e), 13583);
+ assertEqualInt(archive_entry_mtime_nsec(e), 358297468);
+ archive_entry_set_mtime(e, 13583, -24682);
+ assertEqualInt(archive_entry_mtime(e), 13582);
+ assertEqualInt(archive_entry_mtime_nsec(e), 999975318);
archive_entry_unset_mtime(e);
assertEqualInt(archive_entry_mtime(e), 0);
assertEqualInt(archive_entry_mtime_nsec(e), 0);
assert(!archive_entry_mtime_is_set(e));
-#if ARCHIVE_VERSION_NUMBER >= 1009000
/* nlink */
archive_entry_set_nlink(e, 736);
assertEqualInt(archive_entry_nlink(e), 736);
-#else
- skipping("archive_entry_nlink()");
-#endif
/* pathname */
archive_entry_set_pathname(e, "path");
@@ -260,13 +279,9 @@ DEFINE_TEST(test_entry)
memset(wbuff, 0, sizeof(wbuff));
assertEqualWString(archive_entry_pathname_w(e), L"wpath");
-#if ARCHIVE_VERSION_NUMBER >= 1009000
/* rdev */
archive_entry_set_rdev(e, 532);
assertEqualInt(archive_entry_rdev(e), 532);
-#else
- skipping("archive_entry_rdev()");
-#endif
/* rdevmajor/rdevminor are tested specially below. */
/* size */
@@ -283,13 +298,11 @@ DEFINE_TEST(test_entry)
/* symlink */
archive_entry_set_symlink(e, "symlinkname");
assertEqualString(archive_entry_symlink(e), "symlinkname");
-#if ARCHIVE_VERSION_NUMBER >= 1009000
strcpy(buff, "symlinkname2");
archive_entry_copy_symlink(e, buff);
assertEqualString(archive_entry_symlink(e), "symlinkname2");
memset(buff, 0, sizeof(buff));
assertEqualString(archive_entry_symlink(e), "symlinkname2");
-#endif
archive_entry_copy_symlink_w(e, NULL);
assertEqualWString(archive_entry_symlink_w(e), NULL);
assertEqualString(archive_entry_symlink(e), NULL);
@@ -380,25 +393,17 @@ DEFINE_TEST(test_entry)
archive_entry_set_atime(e, 13579, 24680);
archive_entry_set_birthtime(e, 13779, 24990);
archive_entry_set_ctime(e, 13580, 24681);
-#if ARCHIVE_VERSION_NUMBER >= 1009000
archive_entry_set_dev(e, 235);
-#endif
archive_entry_set_fflags(e, 0x55, 0xAA);
archive_entry_set_gid(e, 204);
archive_entry_set_gname(e, "group");
archive_entry_set_hardlink(e, "hardlinkname");
-#if ARCHIVE_VERSION_NUMBER >= 1009000
archive_entry_set_ino(e, 8593);
-#endif
archive_entry_set_mode(e, 0123456);
archive_entry_set_mtime(e, 13581, 24682);
-#if ARCHIVE_VERSION_NUMBER >= 1009000
archive_entry_set_nlink(e, 736);
-#endif
archive_entry_set_pathname(e, "path");
-#if ARCHIVE_VERSION_NUMBER >= 1009000
archive_entry_set_rdev(e, 532);
-#endif
archive_entry_set_size(e, 987654321);
archive_entry_copy_sourcepath(e, "source");
archive_entry_set_symlink(e, "symlinkname");
@@ -420,36 +425,26 @@ DEFINE_TEST(test_entry)
assertEqualInt(archive_entry_birthtime_nsec(e2), 24990);
assertEqualInt(archive_entry_ctime(e2), 13580);
assertEqualInt(archive_entry_ctime_nsec(e2), 24681);
-#if ARCHIVE_VERSION_NUMBER >= 1009000
assertEqualInt(archive_entry_dev(e2), 235);
-#endif
archive_entry_fflags(e, &set, &clear);
assertEqualInt(clear, 0xAA);
assertEqualInt(set, 0x55);
assertEqualInt(archive_entry_gid(e2), 204);
assertEqualString(archive_entry_gname(e2), "group");
assertEqualString(archive_entry_hardlink(e2), "hardlinkname");
-#if ARCHIVE_VERSION_NUMBER >= 1009000
assertEqualInt(archive_entry_ino(e2), 8593);
-#endif
assertEqualInt(archive_entry_mode(e2), 0123456);
assertEqualInt(archive_entry_mtime(e2), 13581);
assertEqualInt(archive_entry_mtime_nsec(e2), 24682);
-#if ARCHIVE_VERSION_NUMBER >= 1009000
assertEqualInt(archive_entry_nlink(e2), 736);
-#endif
assertEqualString(archive_entry_pathname(e2), "path");
-#if ARCHIVE_VERSION_NUMBER >= 1009000
assertEqualInt(archive_entry_rdev(e2), 532);
-#endif
assertEqualInt(archive_entry_size(e2), 987654321);
assertEqualString(archive_entry_sourcepath(e2), "source");
assertEqualString(archive_entry_symlink(e2), "symlinkname");
assertEqualInt(archive_entry_uid(e2), 83);
assertEqualString(archive_entry_uname(e2), "user");
-#if ARCHIVE_VERSION_NUMBER < 1009000
- skipping("ACL preserved by archive_entry_clone()");
-#else
+
/* Verify ACL was copied. */
assertEqualInt(4, archive_entry_acl_reset(e2,
ARCHIVE_ENTRY_ACL_TYPE_ACCESS));
@@ -487,10 +482,7 @@ DEFINE_TEST(test_entry)
assertEqualInt(tag, ARCHIVE_ENTRY_ACL_USER);
assertEqualInt(qual, 77);
assertEqualString(name, "user77");
-#endif
-#if ARCHIVE_VERSION_NUMBER < 1009000
- skipping("xattr data preserved by archive_entry_clone");
-#else
+
/* Verify xattr was copied. */
assertEqualInt(1, archive_entry_xattr_reset(e2));
assertEqualInt(0, archive_entry_xattr_next(e2, &xname, &xval, &xsize));
@@ -502,34 +494,23 @@ DEFINE_TEST(test_entry)
assertEqualString(xname, NULL);
assertEqualString(xval, NULL);
assertEqualInt((int)xsize, 0);
-#endif
/* Change the original */
archive_entry_set_atime(e, 13580, 24690);
archive_entry_set_birthtime(e, 13980, 24999);
archive_entry_set_ctime(e, 13590, 24691);
-#if ARCHIVE_VERSION_NUMBER >= 1009000
archive_entry_set_dev(e, 245);
-#endif
archive_entry_set_fflags(e, 0x85, 0xDA);
-#if ARCHIVE_VERSION_NUMBER >= 1009000
archive_entry_set_filetype(e, AE_IFLNK);
-#endif
archive_entry_set_gid(e, 214);
archive_entry_set_gname(e, "grouper");
archive_entry_set_hardlink(e, "hardlinkpath");
-#if ARCHIVE_VERSION_NUMBER >= 1009000
archive_entry_set_ino(e, 8763);
-#endif
archive_entry_set_mode(e, 0123654);
archive_entry_set_mtime(e, 18351, 28642);
-#if ARCHIVE_VERSION_NUMBER >= 1009000
archive_entry_set_nlink(e, 73);
-#endif
archive_entry_set_pathname(e, "pathest");
-#if ARCHIVE_VERSION_NUMBER >= 1009000
archive_entry_set_rdev(e, 132);
-#endif
archive_entry_set_size(e, 987456321);
archive_entry_copy_sourcepath(e, "source2");
archive_entry_set_symlink(e, "symlinkpath");
@@ -545,36 +526,26 @@ DEFINE_TEST(test_entry)
assertEqualInt(archive_entry_birthtime_nsec(e2), 24990);
assertEqualInt(archive_entry_ctime(e2), 13580);
assertEqualInt(archive_entry_ctime_nsec(e2), 24681);
-#if ARCHIVE_VERSION_NUMBER >= 1009000
assertEqualInt(archive_entry_dev(e2), 235);
-#endif
archive_entry_fflags(e2, &set, &clear);
assertEqualInt(clear, 0xAA);
assertEqualInt(set, 0x55);
assertEqualInt(archive_entry_gid(e2), 204);
assertEqualString(archive_entry_gname(e2), "group");
assertEqualString(archive_entry_hardlink(e2), "hardlinkname");
-#if ARCHIVE_VERSION_NUMBER >= 1009000
assertEqualInt(archive_entry_ino(e2), 8593);
-#endif
assertEqualInt(archive_entry_mode(e2), 0123456);
assertEqualInt(archive_entry_mtime(e2), 13581);
assertEqualInt(archive_entry_mtime_nsec(e2), 24682);
-#if ARCHIVE_VERSION_NUMBER >= 1009000
assertEqualInt(archive_entry_nlink(e2), 736);
-#endif
assertEqualString(archive_entry_pathname(e2), "path");
-#if ARCHIVE_VERSION_NUMBER >= 1009000
assertEqualInt(archive_entry_rdev(e2), 532);
-#endif
assertEqualInt(archive_entry_size(e2), 987654321);
assertEqualString(archive_entry_sourcepath(e2), "source");
assertEqualString(archive_entry_symlink(e2), "symlinkname");
assertEqualInt(archive_entry_uid(e2), 83);
assertEqualString(archive_entry_uname(e2), "user");
-#if ARCHIVE_VERSION_NUMBER < 1009000
- skipping("ACL held by clone of archive_entry");
-#else
+
/* Verify ACL was unchanged. */
assertEqualInt(4, archive_entry_acl_reset(e2,
ARCHIVE_ENTRY_ACL_TYPE_ACCESS));
@@ -620,13 +591,9 @@ DEFINE_TEST(test_entry)
assertEqualInt(tag, 0);
assertEqualInt(qual, -1);
assertEqualString(name, NULL);
-#endif
-#if ARCHIVE_VERSION_NUMBER < 1009000
- skipping("xattr preserved in archive_entry copy");
-#else
+
/* Verify xattr was unchanged. */
assertEqualInt(1, archive_entry_xattr_reset(e2));
-#endif
/* Release clone. */
archive_entry_free(e2);
@@ -645,9 +612,7 @@ DEFINE_TEST(test_entry)
archive_entry_fflags(e, &set, &clear);
assertEqualInt(clear, 0);
assertEqualInt(set, 0);
-#if ARCHIVE_VERSION_NUMBER >= 1009000
assertEqualInt(archive_entry_filetype(e), 0);
-#endif
assertEqualInt(archive_entry_gid(e), 0);
assertEqualString(archive_entry_gname(e), NULL);
assertEqualString(archive_entry_hardlink(e), NULL);
@@ -655,9 +620,7 @@ DEFINE_TEST(test_entry)
assertEqualInt(archive_entry_mode(e), 0);
assertEqualInt(archive_entry_mtime(e), 0);
assertEqualInt(archive_entry_mtime_nsec(e), 0);
-#if ARCHIVE_VERSION_NUMBER >= 1009000
assertEqualInt(archive_entry_nlink(e), 0);
-#endif
assertEqualString(archive_entry_pathname(e), NULL);
assertEqualInt(archive_entry_rdev(e), 0);
assertEqualInt(archive_entry_size(e), 0);
@@ -702,9 +665,7 @@ DEFINE_TEST(test_entry)
assertEqualInt(archive_entry_ino(e), 234);
assertEqualInt(archive_entry_mode(e), 077777);
assertEqualInt(archive_entry_mtime(e), 234567);
-#if ARCHIVE_VERSION_NUMBER >= 1009000
assertEqualInt(archive_entry_nlink(e), 345);
-#endif
assertEqualInt(archive_entry_size(e), 123456789);
assertEqualInt(archive_entry_uid(e), 23);
#if __FreeBSD__
@@ -724,19 +685,13 @@ DEFINE_TEST(test_entry)
/* Set a bunch of fields individually. */
archive_entry_set_atime(e, 456789, 321);
archive_entry_set_ctime(e, 345678, 432);
-#if ARCHIVE_VERSION_NUMBER >= 1009000
archive_entry_set_dev(e, 123);
-#endif
archive_entry_set_gid(e, 34);
-#if ARCHIVE_VERSION_NUMBER >= 1009000
archive_entry_set_ino(e, 234);
-#endif
archive_entry_set_mode(e, 012345);
archive_entry_set_mode(e, 012345);
archive_entry_set_mtime(e, 234567, 543);
-#if ARCHIVE_VERSION_NUMBER >= 1009000
archive_entry_set_nlink(e, 345);
-#endif
archive_entry_set_size(e, 123456789);
archive_entry_set_uid(e, 23);
/* Retrieve a stat structure. */
@@ -744,18 +699,12 @@ DEFINE_TEST(test_entry)
/* Check that the values match. */
assertEqualInt(pst->st_atime, 456789);
assertEqualInt(pst->st_ctime, 345678);
-#if ARCHIVE_VERSION_NUMBER >= 1009000
assertEqualInt(pst->st_dev, 123);
-#endif
assertEqualInt(pst->st_gid, 34);
-#if ARCHIVE_VERSION_NUMBER >= 1009000
assertEqualInt(pst->st_ino, 234);
-#endif
assertEqualInt(pst->st_mode, 012345);
assertEqualInt(pst->st_mtime, 234567);
-#if ARCHIVE_VERSION_NUMBER >= 1009000
assertEqualInt(pst->st_nlink, 345);
-#endif
assertEqualInt(pst->st_size, 123456789);
assertEqualInt(pst->st_uid, 23);
#ifdef __FreeBSD__
@@ -772,30 +721,24 @@ DEFINE_TEST(test_entry)
archive_entry_set_ctime(e, 345677, 431);
assert((pst = archive_entry_stat(e)) != NULL);
assertEqualInt(pst->st_ctime, 345677);
-#if ARCHIVE_VERSION_NUMBER >= 1009000
archive_entry_set_dev(e, 122);
assert((pst = archive_entry_stat(e)) != NULL);
assertEqualInt(pst->st_dev, 122);
-#endif
archive_entry_set_gid(e, 33);
assert((pst = archive_entry_stat(e)) != NULL);
assertEqualInt(pst->st_gid, 33);
-#if ARCHIVE_VERSION_NUMBER >= 1009000
archive_entry_set_ino(e, 233);
assert((pst = archive_entry_stat(e)) != NULL);
assertEqualInt(pst->st_ino, 233);
-#endif
archive_entry_set_mode(e, 012344);
assert((pst = archive_entry_stat(e)) != NULL);
assertEqualInt(pst->st_mode, 012344);
archive_entry_set_mtime(e, 234566, 542);
assert((pst = archive_entry_stat(e)) != NULL);
assertEqualInt(pst->st_mtime, 234566);
-#if ARCHIVE_VERSION_NUMBER >= 1009000
archive_entry_set_nlink(e, 344);
assert((pst = archive_entry_stat(e)) != NULL);
assertEqualInt(pst->st_nlink, 344);
-#endif
archive_entry_set_size(e, 123456788);
assert((pst = archive_entry_stat(e)) != NULL);
assertEqualInt(pst->st_size, 123456788);
@@ -819,7 +762,6 @@ DEFINE_TEST(test_entry)
* the necessary definitions on every platform.
*/
#if __FreeBSD__
-#if ARCHIVE_VERSION_NUMBER >= 1009000
archive_entry_set_dev(e, 0x12345678);
assertEqualInt(archive_entry_devmajor(e), major(0x12345678));
assertEqualInt(archive_entry_devminor(e), minor(0x12345678));
@@ -839,12 +781,11 @@ DEFINE_TEST(test_entry)
assertEqualInt(archive_entry_rdevminor(e), 0xdcba98);
assertEqualInt(archive_entry_rdev(e), makedev(0xfe, 0xdcba98));
#endif
-#endif
/*
* Exercise the character-conversion logic, if we can.
*/
- if (NULL == LOCALE_UTF8 || NULL == setlocale(LC_ALL, LOCALE_UTF8)) {
+ if (NULL == setlocale(LC_ALL, "en_US.UTF-8")) {
skipping("Can't exercise charset-conversion logic without"
" a suitable locale.");
} else {
@@ -852,8 +793,10 @@ DEFINE_TEST(test_entry)
archive_entry_copy_pathname(e, "abc\314\214mno\374xyz");
failure("Converting invalid chars to Unicode should fail.");
assert(NULL == archive_entry_pathname_w(e));
- //failure("Converting invalid chars to UTF-8 should fail.");
- //assert(NULL == archive_entry_pathname_utf8(e));
+ /*
+ failure("Converting invalid chars to UTF-8 should fail.");
+ assert(NULL == archive_entry_pathname_utf8(e));
+ */
/* A group name that cannot be converted. */
archive_entry_copy_gname(e, "abc\314\214mno\374xyz");
@@ -876,7 +819,6 @@ DEFINE_TEST(test_entry)
assert(NULL == archive_entry_symlink_w(e));
}
-#if HAVE_WCSCPY
l = 0x12345678L;
wc = (wchar_t)l; /* Wide character too big for UTF-8. */
if (NULL == setlocale(LC_ALL, "C") || (long)wc != l) {
@@ -884,19 +826,18 @@ DEFINE_TEST(test_entry)
} else {
/*
* Build the string L"xxx\U12345678yyy\u5678zzz" without
- * using C99 \u#### syntax, which isn't uniformly
- * supported. (GCC 3.4.6, for instance, defaults to
- * "c89 plus GNU extensions.")
+ * using wcscpy or C99 \u#### syntax.
*/
- wcscpy(wbuff, L"xxxAyyyBzzz");
+ name = "xxxAyyyBzzz";
+ for (i = 0; i < (int)strlen(name); ++i)
+ wbuff[i] = name[i];
wbuff[3] = (wchar_t)0x12345678;
wbuff[7] = (wchar_t)0x5678;
- /* A wide filename that cannot be converted to narrow. */
+ /* A Unicode filename that cannot be converted to UTF-8. */
archive_entry_copy_pathname_w(e, wbuff);
failure("Converting wide characters from Unicode should fail.");
assertEqualString(NULL, archive_entry_pathname(e));
}
-#endif
/* Release the experimental entry. */
archive_entry_free(e);
diff --git a/contrib/libarchive/libarchive/test/test_extattr_freebsd.c b/contrib/libarchive/libarchive/test/test_extattr_freebsd.c
index de3ae2a586d1..de74b1408dd6 100644
--- a/contrib/libarchive/libarchive/test/test_extattr_freebsd.c
+++ b/contrib/libarchive/libarchive/test/test_extattr_freebsd.c
@@ -104,6 +104,7 @@ DEFINE_TEST(test_extattr_freebsd)
archive_entry_set_mode(ae, 0755);
archive_entry_xattr_add_entry(ae, "user.foo", "12345", 5);
assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae));
+ assertEqualIntA(a, ARCHIVE_OK, archive_write_finish_entry(a));
archive_entry_free(ae);
/* Another entry; similar but with mode = 0. */
@@ -123,7 +124,7 @@ DEFINE_TEST(test_extattr_freebsd)
assertEqualIntA(a, ARCHIVE_WARN, archive_write_close(a));
else
assertEqualIntA(a, ARCHIVE_OK, archive_write_close(a));
- assertEqualInt(ARCHIVE_OK, archive_write_finish(a));
+ assertEqualInt(ARCHIVE_OK, archive_write_free(a));
/* Verify the data on disk. */
assertEqualInt(0, stat("test0", &st));
@@ -166,7 +167,7 @@ DEFINE_TEST(test_extattr_freebsd)
assertEqualInt(xsize, 5);
assertEqualMem(xval, "12345", xsize);
assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
- assertEqualInt(ARCHIVE_OK, archive_read_finish(a));
+ assertEqualInt(ARCHIVE_OK, archive_read_free(a));
archive_entry_free(ae);
#endif
}
diff --git a/contrib/libarchive/libarchive/test/test_filter_count.c b/contrib/libarchive/libarchive/test/test_filter_count.c
new file mode 100644
index 000000000000..175c88cc255a
--- /dev/null
+++ b/contrib/libarchive/libarchive/test/test_filter_count.c
@@ -0,0 +1,75 @@
+/*-
+ * Copyright (c) 2003-2009 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.
+ */
+#include "test.h"
+__FBSDID("$FreeBSD: head/lib/libarchive/test/test_read_file_nonexistent.c 189473 2009-03-07 02:09:21Z kientzle $");
+
+static void read_test(const char *name);
+static void write_test(void);
+
+static void
+read_test(const char *name)
+{
+ struct archive* a = archive_read_new();
+ if(ARCHIVE_OK != archive_read_support_filter_bzip2(a)) {
+ skipping("bzip2 unsupported");
+ return;
+ }
+
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
+
+ extract_reference_file(name);
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_open_filename(a, name, 2));
+ /* bzip2 and none */
+ assertEqualInt(2, archive_filter_count(a));
+
+ archive_read_free(a);
+}
+
+static void
+write_test(void)
+{
+ char buff[4096];
+ struct archive* a = archive_write_new();
+
+ assertEqualIntA(a, ARCHIVE_OK, archive_write_set_format_ustar(a));
+ assertEqualIntA(a, ARCHIVE_OK, archive_write_set_bytes_per_block(a, 10));
+
+ if(ARCHIVE_OK != archive_write_set_compression_bzip2(a)) {
+ skipping("bzip2 unsupported");
+ return;
+ }
+ assertEqualIntA(a, ARCHIVE_OK, archive_write_open_memory(a, buff, 4096, 0));
+ /* bzip2 and none */
+ assertEqualInt(2, archive_filter_count(a));
+ archive_write_free(a);
+}
+
+DEFINE_TEST(test_filter_count)
+{
+ read_test("test_compat_bzip2_1.tbz");
+ write_test();
+}
+
+
diff --git a/contrib/libarchive/libarchive/test/test_fuzz.c b/contrib/libarchive/libarchive/test/test_fuzz.c
index 8f91fcaf1806..5d2efa816973 100644
--- a/contrib/libarchive/libarchive/test/test_fuzz.c
+++ b/contrib/libarchive/libarchive/test/test_fuzz.c
@@ -52,6 +52,8 @@ static struct {
} files[] = {
{0, "test_fuzz_1.iso.Z"}, /* Exercise compress decompressor. */
{1, "test_fuzz_1.iso.Z"},
+ {0, "test_fuzz.cab"},
+ {0, "test_fuzz.lzh"},
{0, "test_compat_bzip2_1.tbz"}, /* Exercise bzip2 decompressor. */
{1, "test_compat_bzip2_1.tbz"},
{0, "test_compat_gtar_1.tar"},
@@ -60,9 +62,36 @@ static struct {
{0, "test_compat_tar_hardlink_1.tar"},
{0, "test_compat_xz_1.txz"}, /* Exercise xz decompressor. */
{0, "test_compat_zip_1.zip"},
+ {0, "test_read_format_7zip_bzip2.7z"},
+ {0, "test_read_format_7zip_bcj_lzma1.7z"},
+ {0, "test_read_format_7zip_bcj_lzma2.7z"},
+ {0, "test_read_format_7zip_bcj2_lzma1_1.7z"},
+ {0, "test_read_format_7zip_bcj2_lzma1_2.7z"},
+ {0, "test_read_format_7zip_bcj2_lzma2_1.7z"},
+ {0, "test_read_format_7zip_bcj2_lzma2_2.7z"},
+ {0, "test_read_format_7zip_copy.7z"},
+ {0, "test_read_format_7zip_deflate.7z"},
+ {0, "test_read_format_7zip_lzma1.7z"},
+ {0, "test_read_format_7zip_lzma1_lzma2.7z"},
+ {0, "test_read_format_7zip_ppmd.7z"},
{0, "test_read_format_ar.ar"},
{0, "test_read_format_cpio_bin_be.cpio"},
{0, "test_read_format_cpio_svr4_gzip_rpm.rpm"}, /* Test RPM unwrapper */
+ {0, "test_read_format_rar.rar"}, /* Uncompressed RAR test */
+ {0, "test_read_format_rar_binary_data.rar"}, /* RAR file with binary data */
+ {0, "test_read_format_rar_compress_best.rar"}, /* Best Compressed RAR test */
+ {0, "test_read_format_rar_compress_normal.rar"}, /* Normal Compressed RAR
+ * test */
+ {0, "test_read_format_rar_multi_lzss_blocks.rar"}, /* Normal Compressed Multi
+ * LZSS blocks RAR test */
+ {0, "test_read_format_rar_noeof.rar"}, /* RAR with no EOF header */
+ {0, "test_read_format_rar_ppmd_lzss_conversion.rar"}, /* Best Compressed
+ * RAR file with both
+ * PPMd and LZSS
+ * blocks */
+ {0, "test_read_format_rar_sfx.exe"}, /* RAR SFX archive */
+ {0, "test_read_format_rar_subblock.rar"}, /* RAR with subblocks */
+ {0, "test_read_format_rar_unicode.rar"}, /* RAR with Unicode filenames */
{0, "test_read_format_gtar_sparse_1_17_posix10_modified.tar"},
{0, "test_read_format_mtree.mtree"},
{0, "test_read_format_tar_empty_filename.tar"},
@@ -74,7 +103,7 @@ DEFINE_TEST(test_fuzz)
{
const void *blk;
size_t blk_size;
- off_t blk_offset;
+ int64_t blk_offset;
int n;
for (n = 0; files[n].name != NULL; ++n) {
@@ -84,7 +113,7 @@ DEFINE_TEST(test_fuzz)
struct archive *a;
char *rawimage, *image;
size_t size;
- int i;
+ int i, q;
extract_reference_file(filename);
if (files[n].uncompress) {
@@ -92,12 +121,12 @@ DEFINE_TEST(test_fuzz)
/* Use format_raw to decompress the data. */
assert((a = archive_read_new()) != NULL);
assertEqualIntA(a, ARCHIVE_OK,
- archive_read_support_compression_all(a));
+ archive_read_support_filter_all(a));
assertEqualIntA(a, ARCHIVE_OK,
archive_read_support_format_raw(a));
r = archive_read_open_filename(a, filename, 16384);
if (r != ARCHIVE_OK) {
- archive_read_finish(a);
+ archive_read_free(a);
skipping("Cannot uncompress %s", filename);
continue;
}
@@ -108,7 +137,7 @@ DEFINE_TEST(test_fuzz)
assertEqualIntA(a, ARCHIVE_EOF,
archive_read_next_header(a, &ae));
assertEqualInt(ARCHIVE_OK,
- archive_read_finish(a));
+ archive_read_free(a));
assert(size > 0);
failure("Internal buffer is not big enough for "
"uncompressed test file: %s", filename);
@@ -127,24 +156,38 @@ DEFINE_TEST(test_fuzz)
for (i = 0; i < 100; ++i) {
FILE *f;
- int j, numbytes;
+ int j, numbytes, trycnt;
/* Fuzz < 1% of the bytes in the archive. */
memcpy(image, rawimage, size);
- numbytes = (int)(rand() % (size / 100));
+ q = size / 100;
+ if (!q) q = 1;
+ numbytes = (int)(rand() % q);
for (j = 0; j < numbytes; ++j)
image[rand() % size] = (char)rand();
/* Save the messed-up image to a file.
* If we crash, that file will be useful. */
- f = fopen("after.test.failure.send.this.file."
- "to.libarchive.maintainers.with.system.details", "wb");
- fwrite(image, 1, (size_t)size, f);
+ for (trycnt = 0; trycnt < 3; trycnt++) {
+ f = fopen("after.test.failure.send.this.file."
+ "to.libarchive.maintainers.with.system.details", "wb");
+ if (f != NULL)
+ break;
+#if defined(_WIN32) && !defined(__CYGWIN__)
+ /*
+ * Sometimes previous close operation does not completely
+ * end at this time. So we should take a wait while
+ * the operation running.
+ */
+ Sleep(100);
+#endif
+ }
+ assertEqualInt((size_t)size, fwrite(image, 1, (size_t)size, f));
fclose(f);
assert((a = archive_read_new()) != NULL);
assertEqualIntA(a, ARCHIVE_OK,
- archive_read_support_compression_all(a));
+ archive_read_support_filter_all(a));
assertEqualIntA(a, ARCHIVE_OK,
archive_read_support_format_all(a));
@@ -156,7 +199,7 @@ DEFINE_TEST(test_fuzz)
}
archive_read_close(a);
}
- archive_read_finish(a);
+ archive_read_free(a);
}
free(image);
free(rawimage);
diff --git a/contrib/libarchive/libarchive/test/test_fuzz.cab.uu b/contrib/libarchive/libarchive/test/test_fuzz.cab.uu
new file mode 100644
index 000000000000..4cfa4fb7c9dd
--- /dev/null
+++ b/contrib/libarchive/libarchive/test/test_fuzz.cab.uu
@@ -0,0 +1,49 @@
+begin 644 test_fuzz.cab
+M35-#1@`````1"````````"P``````````P$!``0```#X!P``A0````$``Q)K
+M````````````G3U:L2``9FEL90#I!```:P``````G3TYL2``24Y35$%,3```
+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
+H^+5YR;W&3(M6?E57A59NO4H-K"3>576O"ZQ6R!-&3>Z7&K;GPA9\V```
+`
+end
diff --git a/contrib/libarchive/libarchive/test/test_fuzz.lzh.uu b/contrib/libarchive/libarchive/test/test_fuzz.lzh.uu
new file mode 100644
index 000000000000..781ebbbb6052
--- /dev/null
+++ b/contrib/libarchive/libarchive/test/test_fuzz.lzh.uu
@@ -0,0 +1,152 @@
+begin 644 test_fuzz.lzh
+M)L`M;&AD+0```````````$@B[!``!&1I<EP``%4`@5$!`.A!Z0/I`R?X+6QH
+M9"T```````````!((NP0``5D:7(R7```50"!40$`[4'I`^D#.'PM;&AD+0``
+M`````````4@C[!``%F1I<C)<<WEM;&EN:S%\+BY<9FEL93$``%4``J,"`.VA
+MZ0/I`SA^+6QH9"T```````````%((^P0`!9D:7(R7'-Y;6QI;FLR?"XN7&9I
+M;&4R``!5``*C`@#MH>D#Z0,GO2UL:#4M(@```#P`````2"+L(``%9FEL93&D
+MYU4`@5$!`*2!Z0/I`P`80FYIQ>/Z`=-:'>9%#"P%J!\CH0"/GE$,.W6FMSD%
+M*_4G02UL:#4M(@```$X`````2"+L(``%9FEL93+5%54`@5$!`+:!Z0/I`P`8
+M0FYIQV/Z`=.:'.9%#"P%J-\+H0"/'E$,.W6FMSD%*_T9?RUL:&0M&@``````
+M````2"+L(`$```!5!P`"9&ER_P4`4.A!!P!1Z0/I`P<`5(%1`0```!F!+6QH
+M9"T;``````````!((NP@`0```%4(``)D:7(R_P4`4.U!!P!1Z0/I`P<`5(%1
+M`0```!YQ+6QH9"TG``````````%((^P@`05F:6QE,0``510``F1I<C+_<WEM
+M;&EN:S%\+B[_!0!0[:$'`%'I`^D#!P!4`J,"````'G(M;&AD+2<`````````
+M`4@C["`!!69I;&4R``!5%``"9&ER,O]S>6UL:6YK,GPN+O\%`%#MH0<`4>D#
+MZ0,'`%0"HP(````>!BUL:#4M-0```#P`````2"+L(`$%9FEL93&DYU4%`%"D
+M@0<`4>D#Z0,'`%2!40$`````&$)N:<7C^@'36AWF10PL!:@?(Z$`CYY1##MU
+MIK<Y!2OU'G@M;&@U+34```!.`````$@B["`!!69I;&4RU155!0!0MH$'`%'I
+M`^D#!P!4@5$!`````!A";FG'8_H!TYH<YD4,+`6HWPNA`(\>40P[=::W.04K
+M_34`+6QH9"T``````````(%1`0`@`@``504```7>`P`!!P`"9&ER_P4`4.A!
+M!P!1Z0/I`P``-@`M;&AD+0``````````@5$!`"`"``!5!0``")D#``$(``)D
+M:7(R_P4`4.U!!P!1Z0/I`P``1P`M;&AD+0```````````J,"`"`"``!5!0``
+MM*D(``%F:6QE,10``F1I<C+_<WEM;&EN:S%\+B[_!0!0[:$'`%'I`^D#``!'
+M`"UL:&0M```````````"HP(`(`(``%4%``"'[0@``69I;&4R%``"9&ER,O]S
+M>6UL:6YK,GPN+O\%`%#MH0<`4>D#Z0,``#,`+6QH-2TB````/````(%1`0`@
+M`J3G504``/T!"``!9FEL93$%`%"D@0<`4>D#Z0,````80FYIQ>/Z`=-:'>9%
+M#"P%J!\CH0"/GE$,.W6FMSD%*_4S`"UL:#4M(@```$X```"!40$`(`+5%54%
+M```OQ@@``69I;&4R!0!0MH$'`%'I`^D#````&$)N:<=C^@'3FASF10PL!:C?
+M"Z$`CQY1##MUIK<Y!2O]!``M;&AD+0``````````@5$!`"`#``!-?`````D`
+M``!&I`,```4````!"0````)D:7+_!P```$`0`!D```#_[4$`````````````
+M#!7^3$0:_DP=````0<S?4;3^E<L!@-9``*BRG0$`>@_0`9;+`0@`````+J\'
+M``````0`+6QH9"T``````````(%1`0`@`P``37T````)````1J0#```%````
+M`0H````"9&ER,O\'````0!``&0```/_M00`````````````A&OY,1!K^3!T`
+M``!!2H%NNP&6RP&`UD``J+*=`0!Z#]`!ELL!"`````!]%P<`````!``M;&@U
+M+20````\````@5$!`"`#I.=-<0````D```!&I`,```H````!9FEL93$9````
+M_Z2!`````````````,<4_DPC&OY,'0```$$T0J**_I7+`8#60`"HLIT!_G*D
+MO`&6RP$(``````KQ!P``````&4)MD:BT=H!Z:T.IZ9#S:`ZH%CJ$`A]OC1DU
+M4VION(3=>H`$`"UL:#4M)````$X```"!40$`(`/5%4UQ````"0```$:D`P``
+M"@````%F:6QE,AD```#_I($`````````````(1K^3",:_DP=````0?Y%<[L!
+MELL!@-9``*BRG0%8U::\`9;+`0@`````0=X'```````90FV1J.QV@'IS0XGI
+MD/-H#JC&&H0"'F^-&353:F^XA-U^@#4`+6QH9"T``````````(%1`0`@`@``
+M504```7>`P`!!P`"9&ER_P4`4.A!!P!1Z0/I`P``-@`M;&AD+0``````````
+M@5$!`"`"``!5!0``")D#``$(``)D:7(R_P4`4.U!!P!1Z0/I`P``1P`M;&AD
+M+0```````````J,"`"`"``!5!0``M*D(``%F:6QE,10``F1I<C+_<WEM;&EN
+M:S%\+B[_!0!0[:$'`%'I`^D#``!'`"UL:&0M```````````"HP(`(`(``%4%
+M``"'[0@``69I;&4R%``"9&ER,O]S>6UL:6YK,GPN+O\%`%#MH0<`4>D#Z0,`
+M`#,`+6QH,"T\````/````(%1`0`@`J3G504``+DI"``!9FEL93$%`%"D@0<`
+M4>D#Z0,``"`@("`@("`@("`@("`@("`@("`@("`@("`@9FEL92`Q(&-O;G1E
+M;G1S"FAE;&QO"FAE;&QO"FAE;&QO"C,`+6QH,"U.````3@```(%1`0`@`M45
+M504``+T9"``!9FEL93(%`%"V@0<`4>D#Z0,``"`@("`@("`@("`@("`@("`@
+M("`@("`@("`@9FEL92`R(&-O;G1E;G1S"FAE;&QO"FAE;&QO"FAE;&QO"FAE
+M;&QO"FAE;&QO"FAE;&QO"C4`+6QH-2UW`@``Z00``&-,V4L@`H6/504``#-5
+M"@`!24Y35$%,3`4`4*2!!P!1Z0/I`P```FUK=XVV['"Z\`>$(6[`2-EZ5P&P
+M^!J*0MPV*IM]&^L37/)<Y+,0WC;RYN647;X'R_\P`E;2>[SD(6GCE`4$+,RA
+M<%QVYXC%'H1Q`I@_B\H/L@(+W3`0@5CY6X%Q%WW+@7<`8(F7=77U]%5YG?`;
+M3N&I:_6YWA$,3F@?:)>FZ!<!"?.:#C/:',\PG@>:WRP0:TH8%&:/A#VMNUUD
+M[D?+:#XK%3NMR(PSF4;V"^\X0/E3JMRQ46+7\I]S@7ZJNTX[ROSD+=\7\.O#
+MI:W._S>P-B(W4`=N<T/$OT+5];U>*!<4AM0Y$,P.0&OJER*:CF[S6/=2*T4J
+M8HB@[:HC'_0*&[=@,,G+98$J+TE>OL/*B^SJ]0B]?)</$8'E0P=449"^@OSR
+MN>C"QW6ESMD62-#L*]0YO*`ZHY784:YX:>BM^:'>,:IX.=Y*@<AI4WJ=YI(K
+M,Z!G:"X9/4YJ66'7;3VVX#;P[=4G_^M!V=GNAJ]F8GUHS88Q..[_L,.ETV6T
+MD]@*$H$G,/AURJWR/%VN2S0M1ROK^-$D4`#*A2GF2-&>R(+B)*BX24P/1>F-
+M3ODP9D/YS5^9M>8OQ5I-[<^F!_.C?H\HT:!I/ZJ3)U)Z,OC8+[-;X<MC-?,>
+MMPT`HQXE(XTV!J`/FOL'T?3:#:L@[2#Y$F`?BFKE-DN]]H>'CIJ-:^/JCO\T
+M.4`Z,BR&AN^@;&H.P/W[;;[KCY1@;[MRE6MWEA0[SS@BW-=BZ;/992/*144"
+ME)9-=H3.#8,!KW4;K#^:HP[15TP>C!ZQL--2)IGK);'D<;J"O7.2A_4X'"IW
+MB(_W\=@I^.U+$T\Q/F2:*5OSDV<GO^8U0``FP"UL:&0M````````````2"+L
+M$``$9&ER7```50"!40$`Z$'I`^D#)_@M;&AD+0```````````$@B[!``!61I
+M<C)<``!5`(%1`0#M0>D#Z0,X?"UL:&0M```````````!2"/L$``69&ER,EQS
+M>6UL:6YK,7PN+EQF:6QE,0``50`"HP(`[:'I`^D#.'XM;&AD+0``````````
+M`4@C[!``%F1I<C)<<WEM;&EN:S)\+BY<9FEL93(``%4``J,"`.VAZ0/I`R>]
+M+6QH-2TB````/`````!((NP@``5F:6QE,:3G50"!40$`I('I`^D#`!A";FG%
+MX_H!TUH=YD4,+`6H'R.A`(^>40P[=::W.04K]2=!+6QH-2TB````3@````!(
+M(NP@``5F:6QE,M4550"!40$`MH'I`^D#`!A";FG'8_H!TYH<YD4,+`6HWPNA
+M`(\>40P[=::W.04K_0`9?RUL:&0M&@``````````2"+L(`$```!5!P`"9&ER
+M_P4`4.A!!P!1Z0/I`P<`5(%1`0```!F!+6QH9"T;``````````!((NP@`0``
+M`%4(``)D:7(R_P4`4.U!!P!1Z0/I`P<`5(%1`0```!YQ+6QH9"TG````````
+M``%((^P@`05F:6QE,0``510``F1I<C+_<WEM;&EN:S%\+B[_!0!0[:$'`%'I
+M`^D#!P!4`J,"````'G(M;&AD+2<``````````4@C["`!!69I;&4R``!5%``"
+M9&ER,O]S>6UL:6YK,GPN+O\%`%#MH0<`4>D#Z0,'`%0"HP(````>!BUL:#4M
+M-0```#P`````2"+L(`$%9FEL93&DYU4%`%"D@0<`4>D#Z0,'`%2!40$`````
+M&$)N:<7C^@'36AWF10PL!:@?(Z$`CYY1##MUIK<Y!2OU'G@M;&@U+34```!.
+M`````$@B["`!!69I;&4RU155!0!0MH$'`%'I`^D#!P!4@5$!`````!A";FG'
+M8_H!TYH<YD4,+`6HWPNA`(\>40P[=::W.04K_0`U`"UL:&0M``````````"!
+M40$`(`(``%4%```%W@,``0<``F1I<O\%`%#H00<`4>D#Z0,``#8`+6QH9"T`
+M`````````(%1`0`@`@``504```B9`P`!"``"9&ER,O\%`%#M00<`4>D#Z0,`
+M`$<`+6QH9"T```````````*C`@`@`@``504``+2I"``!9FEL93$4``)D:7(R
+M_W-Y;6QI;FLQ?"XN_P4`4.VA!P!1Z0/I`P``1P`M;&AD+0```````````J,"
+M`"`"``!5!0``A^T(``%F:6QE,A0``F1I<C+_<WEM;&EN:S)\+B[_!0!0[:$'
+M`%'I`^D#```S`"UL:#4M(@```#P```"!40$`(`*DYU4%``#]`0@``69I;&4Q
+M!0!0I($'`%'I`^D#````&$)N:<7C^@'36AWF10PL!:@?(Z$`CYY1##MUIK<Y
+M!2OU,P`M;&@U+2(```!.````@5$!`"`"U155!0``+\8(``%F:6QE,@4`4+:!
+M!P!1Z0/I`P```!A";FG'8_H!TYH<YD4,+`6HWPNA`(\>40P[=::W.04K_0`$
+M`"UL:&0M``````````"!40$`(`,``$U\````"0```$:D`P``!0````$)````
+M`F1I<O\'````0!``&0```/_M00`````````````,%?Y,1!K^3!T```!!S-]1
+MM/Z5RP&`UD``J+*=`0!Z#]`!ELL!"``````NKP<`````!``M;&AD+0``````
+M````@5$!`"`#``!-?0````D```!&I`,```4````!"@````)D:7(R_P<```!`
+M$``9````_^U!`````````````"$:_DQ$&OY,'0```$%*@6Z[`9;+`8#60`"H
+MLIT!`'H/T`&6RP$(`````'T7!P`````$`"UL:#4M)````#P```"!40$`(`.D
+MYTUQ````"0```$:D`P``"@````%F:6QE,1D```#_I($`````````````QQ3^
+M3",:_DP=````031"HHK^E<L!@-9``*BRG0'^<J2\`9;+`0@`````"O$'````
+M```90FV1J+1V@'IK0ZGID/-H#J@6.H0"'V^-&353:F^XA-UZ@`0`+6QH-2TD
+M````3@```(%1`0`@`]4537$````)````1J0#```*`````69I;&4R&0```/^D
+M@0`````````````A&OY,(QK^3!T```!!_D5SNP&6RP&`UD``J+*=`5C5IKP!
+MELL!"`````!!W@<``````!E";9&H[':`>G-#B>F0\V@.J,8:A`(>;XT9-5-J
+M;[B$W7Z``#4`+6QH9"T``````````(%1`0`@`@``504```7>`P`!!P`"9&ER
+M_P4`4.A!!P!1Z0/I`P``-@`M;&AD+0``````````@5$!`"`"``!5!0``")D#
+M``$(``)D:7(R_P4`4.U!!P!1Z0/I`P``1P`M;&AD+0```````````J,"`"`"
+M``!5!0``M*D(``%F:6QE,10``F1I<C+_<WEM;&EN:S%\+B[_!0!0[:$'`%'I
+M`^D#``!'`"UL:&0M```````````"HP(`(`(``%4%``"'[0@``69I;&4R%``"
+M9&ER,O]S>6UL:6YK,GPN+O\%`%#MH0<`4>D#Z0,``#,`+6QH,"T\````/```
+M`(%1`0`@`J3G504``+DI"``!9FEL93$%`%"D@0<`4>D#Z0,``"`@("`@("`@
+M("`@("`@("`@("`@("`@("`@9FEL92`Q(&-O;G1E;G1S"FAE;&QO"FAE;&QO
+M"FAE;&QO"C,`+6QH,"U.````3@```(%1`0`@`M45504``+T9"``!9FEL93(%
+M`%"V@0<`4>D#Z0,``"`@("`@("`@("`@("`@("`@("`@("`@("`@9FEL92`R
+M(&-O;G1E;G1S"FAE;&QO"FAE;&QO"FAE;&QO"FAE;&QO"FAE;&QO"FAE;&QO
+M"@`U`"UL:&0M``````````"!40$`(`(``%4%```%W@,``0<``F1I<O\%`%#H
+M00<`4>D#Z0,``#8`+6QH9"T``````````(%1`0`@`@``504```B9`P`!"``"
+M9&ER,O\%`%#M00<`4>D#Z0,``$<`+6QH9"T```````````*C`@`@`@``504`
+M`+2I"``!9FEL93$4``)D:7(R_W-Y;6QI;FLQ?"XN_P4`4.VA!P!1Z0/I`P``
+M1P`M;&AD+0```````````J,"`"`"``!5!0``A^T(``%F:6QE,A0``F1I<C+_
+M<WEM;&EN:S)\+B[_!0!0[:$'`%'I`^D#```S`"UL:#8M(P```#P```"!40$`
+M(`*DYU4%``"-)0@``69I;&4Q!0!0I($'`%'I`^D#````&$)N:<7C^@'36AWF
+M10PL!:@?(Y"`1\\HAAVZTUN<@I7Z@#,`+6QH-BTC````3@```(%1`0`@`M45
+M504``%_B"``!9FEL93(%`%"V@0<`4>D#Z0,````80FYIQV/Z`=.:'.9%#"P%
+MJ-\+D(!'CRB&';K36YR"E?Z``#4`+6QH9"T``````````(%1`0`@`@``504`
+M``7>`P`!!P`"9&ER_P4`4.A!!P!1Z0/I`P``-@`M;&AD+0``````````@5$!
+M`"`"``!5!0``")D#``$(``)D:7(R_P4`4.U!!P!1Z0/I`P``1P`M;&AD+0``
+M`````````J,"`"`"``!5!0``M*D(``%F:6QE,10``F1I<C+_<WEM;&EN:S%\
+M+B[_!0!0[:$'`%'I`^D#``!'`"UL:&0M```````````"HP(`(`(``%4%``"'
+M[0@``69I;&4R%``"9&ER,O]S>6UL:6YK,GPN+O\%`%#MH0<`4>D#Z0,``#,`
+M+6QH-RTC````/````(%1`0`@`J3G504``!R)"``!9FEL93$%`%"D@0<`4>D#
+MZ0,````80FYIQ>/Z`=-:'>9%#"P%J!\CD(!'SRB&';K36YR"E?J`,P`M;&@W
+M+2,```!.````@5$!`"`"U155!0``SDX(``%F:6QE,@4`4+:!!P!1Z0/I`P``
+M`!A";FG'8_H!TYH<YD4,+`6HWPN0@$>/*(8=NM-;G(*5_H``-0`M;&@U+7<"
+M``#I!```8TS92R`"A8]5!0``,U4*``%)3E-404Q,!0!0I($'`%'I`^D#```"
+M;6MWC;;L<+KP!X0A;L!(V7I7`;#X&HI"W#8JFWT;ZQ-<\ESDLQ#>-O+FY91=
+MO@?+_S`"5M)[O.0A:>.4!00LS*%P7';GB,4>A'$"F#^+R@^R`@O=,!"!6/E;
+M@7$7?<N!=P!@B9=U=?7T57F=\!M.X:EK];G>$0Q.:!]HEZ;H%P$)\YH.,]H<
+MSS">!YK?+!!K2A@49H^$/:V[763N1\MH/BL5.ZW(C#.91O8+[SA`^5.JW+%1
+M8M?RGW.!?JJ[3CO*_.0MWQ?PZ\.EK<[_-[`V(C=0!VYS0\2_0M7UO5XH%Q2&
+MU#D0S`Y`:^J7(IJ.;O-8]U(K12IBB*#MJB,?]`H;MV`PR<ME@2HO25Z^P\J+
+M[.KU"+U\EP\1@>5#!U11D+Z"_/*YZ,+'=:7.V19(T.PKU#F\H#JCE=A1KGAI
+MZ*WYH=XQJG@YWDJ!R&E3>IWFDBLSH&=H+AD]3FI98==M/;;@-O#MU2?_ZT'9
+MV>Z&KV9B?6C-AC$X[O^PPZ739;23V`H2@2<P^'7*K?(\7:Y+-"U'*^OXT210
+M`,J%*>9(T9[(@N(DJ+A)3`]%Z8U.^3!F0_G-7YFUYB_%6DWMSZ8'\Z-^CRC1
+MH&D_JI,G4GHR^-@OLUOARV,U\QZW#0"C'B4CC38&H`^:^P?1]-H-JR#M(/D2
+M8!^*:N4V2[WVAX>.FHUKX^J._S0Y0#HR+(:&[Z!L:@[`_?MMONN/E&!ONW*5
+M:W>6%#O/."+<UV+IL]EE(\I%10*4EDUVA,X-@P&O=1NL/YJC#M%73!Z,'K&P
+MTU(FF>LEL>1QNH*]<Y*']3@<*G>(C_?QV"GX[4L33S$^9)HI6_.39R>_YC5`
+!````
+`
+end
diff --git a/contrib/libarchive/libarchive/test/test_gnutar_filename_encoding.c b/contrib/libarchive/libarchive/test/test_gnutar_filename_encoding.c
new file mode 100644
index 000000000000..b22ea407374a
--- /dev/null
+++ b/contrib/libarchive/libarchive/test/test_gnutar_filename_encoding.c
@@ -0,0 +1,414 @@
+/*-
+ * Copyright (c) 2011 Michihiro NAKAJIMA
+ * 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.
+ */
+#include "test.h"
+__FBSDID("$FreeBSD$");
+
+#include <locale.h>
+
+static void
+test_gnutar_filename_encoding_UTF8_CP866(void)
+{
+ struct archive *a;
+ struct archive_entry *entry;
+ char buff[4096];
+ size_t used;
+
+ if (NULL == setlocale(LC_ALL, "en_US.UTF-8")) {
+ skipping("en_US.UTF-8 locale not available on this system.");
+ return;
+ }
+
+ /*
+ * Verify that UTF-8 filenames are correctly translated into CP866
+ * and stored with hdrcharset=CP866 option.
+ */
+ a = archive_write_new();
+ assertEqualInt(ARCHIVE_OK, archive_write_set_format_gnutar(a));
+ if (archive_write_set_options(a, "hdrcharset=CP866") != ARCHIVE_OK) {
+ skipping("This system cannot convert character-set"
+ " from UTF-8 to CP866.");
+ archive_write_free(a);
+ return;
+ }
+ assertEqualInt(ARCHIVE_OK,
+ archive_write_open_memory(a, buff, sizeof(buff), &used));
+
+ entry = archive_entry_new2(a);
+ /* Set a UTF-8 filename. */
+ archive_entry_set_pathname(entry, "\xD0\xBF\xD1\x80\xD0\xB8");
+ archive_entry_set_filetype(entry, AE_IFREG);
+ archive_entry_set_size(entry, 0);
+ assertEqualInt(ARCHIVE_OK, archive_write_header(a, entry));
+ archive_entry_free(entry);
+ assertEqualInt(ARCHIVE_OK, archive_write_free(a));
+
+ /* Above three characters in UTF-8 should translate to the following
+ * three characters in CP866. */
+ assertEqualMem(buff, "\xAF\xE0\xA8", 3);
+}
+
+static void
+test_gnutar_filename_encoding_KOI8R_UTF8(void)
+{
+ struct archive *a;
+ struct archive_entry *entry;
+ char buff[4096];
+ size_t used;
+
+ if (NULL == setlocale(LC_ALL, "ru_RU.KOI8-R")) {
+ skipping("KOI8-R locale not available on this system.");
+ return;
+ }
+
+ /*
+ * Verify that KOI8-R filenames are correctly translated into UTF-8
+ * and stored with hdrcharset=UTF-8 option.
+ */
+ a = archive_write_new();
+ assertEqualInt(ARCHIVE_OK, archive_write_set_format_gnutar(a));
+ if (archive_write_set_options(a, "hdrcharset=UTF-8") != ARCHIVE_OK) {
+ skipping("This system cannot convert character-set"
+ " from KOI8-R to UTF-8.");
+ archive_write_free(a);
+ return;
+ }
+ assertEqualInt(ARCHIVE_OK,
+ archive_write_open_memory(a, buff, sizeof(buff), &used));
+
+ entry = archive_entry_new2(a);
+ /* Set a KOI8-R filename. */
+ archive_entry_set_pathname(entry, "\xD0\xD2\xC9");
+ archive_entry_set_filetype(entry, AE_IFREG);
+ archive_entry_set_size(entry, 0);
+ assertEqualInt(ARCHIVE_OK, archive_write_header(a, entry));
+ archive_entry_free(entry);
+ assertEqualInt(ARCHIVE_OK, archive_write_free(a));
+
+ /* Above three characters in KOI8-R should translate to the following
+ * three characters (two bytes each) in UTF-8. */
+ assertEqualMem(buff, "\xD0\xBF\xD1\x80\xD0\xB8", 6);
+}
+
+static void
+test_gnutar_filename_encoding_KOI8R_CP866(void)
+{
+ struct archive *a;
+ struct archive_entry *entry;
+ char buff[4096];
+ size_t used;
+
+ if (NULL == setlocale(LC_ALL, "ru_RU.KOI8-R")) {
+ skipping("KOI8-R locale not available on this system.");
+ return;
+ }
+
+ /*
+ * Verify that KOI8-R filenames are correctly translated into CP866
+ * and stored with hdrcharset=CP866 option.
+ */
+ a = archive_write_new();
+ assertEqualInt(ARCHIVE_OK, archive_write_set_format_gnutar(a));
+ if (archive_write_set_options(a, "hdrcharset=CP866") != ARCHIVE_OK) {
+ skipping("This system cannot convert character-set"
+ " from KOI8-R to CP866.");
+ archive_write_free(a);
+ return;
+ }
+ assertEqualInt(ARCHIVE_OK,
+ archive_write_open_memory(a, buff, sizeof(buff), &used));
+
+ entry = archive_entry_new2(a);
+ /* Set a KOI8-R filename. */
+ archive_entry_set_pathname(entry, "\xD0\xD2\xC9");
+ archive_entry_set_filetype(entry, AE_IFREG);
+ archive_entry_set_size(entry, 0);
+ assertEqualInt(ARCHIVE_OK, archive_write_header(a, entry));
+ archive_entry_free(entry);
+ assertEqualInt(ARCHIVE_OK, archive_write_free(a));
+
+ /* Above three characters in KOI8-R should translate to the following
+ * three characters in CP866. */
+ assertEqualMem(buff, "\xAF\xE0\xA8", 3);
+}
+
+static void
+test_gnutar_filename_encoding_CP1251_UTF8(void)
+{
+ struct archive *a;
+ struct archive_entry *entry;
+ char buff[4096];
+ size_t used;
+
+ if (NULL == setlocale(LC_ALL, "Russian_Russia") &&
+ NULL == setlocale(LC_ALL, "ru_RU.CP1251")) {
+ skipping("KOI8-R locale not available on this system.");
+ return;
+ }
+
+ /*
+ * Verify that CP1251 filenames are correctly translated into UTF-8
+ * and stored with hdrcharset=UTF-8 option.
+ */
+ a = archive_write_new();
+ assertEqualInt(ARCHIVE_OK, archive_write_set_format_gnutar(a));
+ if (archive_write_set_options(a, "hdrcharset=UTF-8") != ARCHIVE_OK) {
+ skipping("This system cannot convert character-set"
+ " from KOI8-R to UTF-8.");
+ archive_write_free(a);
+ return;
+ }
+ assertEqualInt(ARCHIVE_OK,
+ archive_write_open_memory(a, buff, sizeof(buff), &used));
+
+ entry = archive_entry_new2(a);
+ /* Set a KOI8-R filename. */
+ archive_entry_set_pathname(entry, "\xEF\xF0\xE8");
+ archive_entry_set_filetype(entry, AE_IFREG);
+ archive_entry_set_size(entry, 0);
+ assertEqualInt(ARCHIVE_OK, archive_write_header(a, entry));
+ archive_entry_free(entry);
+ assertEqualInt(ARCHIVE_OK, archive_write_free(a));
+
+ /* Above three characters in CP1251 should translate to the following
+ * three characters (two bytes each) in UTF-8. */
+ assertEqualMem(buff, "\xD0\xBF\xD1\x80\xD0\xB8", 6);
+}
+
+/*
+ * Do not translate CP1251 into CP866 if non Windows platform.
+ */
+static void
+test_gnutar_filename_encoding_ru_RU_CP1251(void)
+{
+ struct archive *a;
+ struct archive_entry *entry;
+ char buff[4096];
+ size_t used;
+
+ if (NULL == setlocale(LC_ALL, "ru_RU.CP1251")) {
+ skipping("KOI8-R locale not available on this system.");
+ return;
+ }
+
+ /*
+ * Verify that CP1251 filenames are not translated into any
+ * other character-set, in particular, CP866.
+ */
+ a = archive_write_new();
+ assertEqualInt(ARCHIVE_OK, archive_write_set_format_gnutar(a));
+ assertEqualInt(ARCHIVE_OK,
+ archive_write_open_memory(a, buff, sizeof(buff), &used));
+
+ entry = archive_entry_new2(a);
+ /* Set a KOI8-R filename. */
+ archive_entry_set_pathname(entry, "\xEF\xF0\xE8");
+ archive_entry_set_filetype(entry, AE_IFREG);
+ archive_entry_set_size(entry, 0);
+ assertEqualInt(ARCHIVE_OK, archive_write_header(a, entry));
+ archive_entry_free(entry);
+ assertEqualInt(ARCHIVE_OK, archive_write_free(a));
+
+ /* Above three characters in CP1251 should not translate to
+ * any other character-set. */
+ assertEqualMem(buff, "\xEF\xF0\xE8", 3);
+}
+
+/*
+ * Other archiver applications on Windows translate CP1251 filenames
+ * into CP866 filenames and store it in the gnutar file.
+ * Test above behavior works well.
+ */
+static void
+test_gnutar_filename_encoding_Russian_Russia(void)
+{
+ struct archive *a;
+ struct archive_entry *entry;
+ char buff[4096];
+ size_t used;
+
+ if (NULL == setlocale(LC_ALL, "Russian_Russia")) {
+ skipping("Russian_Russia locale not available on this system.");
+ return;
+ }
+
+ /*
+ * Verify that Russian_Russia(CP1251) filenames are correctly translated
+ * to CP866.
+ */
+ a = archive_write_new();
+ assertEqualInt(ARCHIVE_OK, archive_write_set_format_gnutar(a));
+ assertEqualInt(ARCHIVE_OK,
+ archive_write_open_memory(a, buff, sizeof(buff), &used));
+
+ entry = archive_entry_new2(a);
+ /* Set a CP1251 filename. */
+ archive_entry_set_pathname(entry, "\xEF\xF0\xE8");
+ archive_entry_set_filetype(entry, AE_IFREG);
+ archive_entry_set_size(entry, 0);
+ assertEqualInt(ARCHIVE_OK, archive_write_header(a, entry));
+ archive_entry_free(entry);
+ assertEqualInt(ARCHIVE_OK, archive_write_free(a));
+
+ /* Above three characters in CP1251 should translate to the following
+ * three characters in CP866. */
+ assertEqualMem(buff, "\xAF\xE0\xA8", 3);
+}
+
+static void
+test_gnutar_filename_encoding_EUCJP_UTF8(void)
+{
+ struct archive *a;
+ struct archive_entry *entry;
+ char buff[4096];
+ size_t used;
+
+ if (NULL == setlocale(LC_ALL, "ja_JP.eucJP")) {
+ skipping("eucJP locale not available on this system.");
+ return;
+ }
+
+ /*
+ * Verify that EUC-JP filenames are correctly translated to UTF-8.
+ */
+ a = archive_write_new();
+ assertEqualInt(ARCHIVE_OK, archive_write_set_format_gnutar(a));
+ if (archive_write_set_options(a, "hdrcharset=UTF-8") != ARCHIVE_OK) {
+ skipping("This system cannot convert character-set"
+ " from eucJP to UTF-8.");
+ archive_write_free(a);
+ return;
+ }
+ assertEqualInt(ARCHIVE_OK,
+ archive_write_open_memory(a, buff, sizeof(buff), &used));
+
+ entry = archive_entry_new2(a);
+ /* Set an EUC-JP filename. */
+ archive_entry_set_pathname(entry, "\xC9\xBD.txt");
+ /* Check the Unicode version. */
+ archive_entry_set_filetype(entry, AE_IFREG);
+ archive_entry_set_size(entry, 0);
+ assertEqualInt(ARCHIVE_OK, archive_write_header(a, entry));
+ archive_entry_free(entry);
+ assertEqualInt(ARCHIVE_OK, archive_write_free(a));
+
+ /* Check UTF-8 version. */
+ assertEqualMem(buff, "\xE8\xA1\xA8.txt", 7);
+}
+
+static void
+test_gnutar_filename_encoding_EUCJP_CP932(void)
+{
+ struct archive *a;
+ struct archive_entry *entry;
+ char buff[4096];
+ size_t used;
+
+ if (NULL == setlocale(LC_ALL, "ja_JP.eucJP")) {
+ skipping("eucJP locale not available on this system.");
+ return;
+ }
+
+ /*
+ * Verify that EUC-JP filenames are correctly translated to CP932.
+ */
+ a = archive_write_new();
+ assertEqualInt(ARCHIVE_OK, archive_write_set_format_gnutar(a));
+ if (archive_write_set_options(a, "hdrcharset=CP932") != ARCHIVE_OK) {
+ skipping("This system cannot convert character-set"
+ " from eucJP to CP932.");
+ archive_write_free(a);
+ return;
+ }
+ assertEqualInt(ARCHIVE_OK,
+ archive_write_open_memory(a, buff, sizeof(buff), &used));
+
+ entry = archive_entry_new2(a);
+ /* Set an EUC-JP filename. */
+ archive_entry_set_pathname(entry, "\xC9\xBD.txt");
+ /* Check the Unicode version. */
+ archive_entry_set_filetype(entry, AE_IFREG);
+ archive_entry_set_size(entry, 0);
+ assertEqualInt(ARCHIVE_OK, archive_write_header(a, entry));
+ archive_entry_free(entry);
+ assertEqualInt(ARCHIVE_OK, archive_write_free(a));
+
+ /* Check CP932 version. */
+ assertEqualMem(buff, "\x95\x5C.txt", 6);
+}
+
+static void
+test_gnutar_filename_encoding_CP932_UTF8(void)
+{
+ struct archive *a;
+ struct archive_entry *entry;
+ char buff[4096];
+ size_t used;
+
+ if (NULL == setlocale(LC_ALL, "Japanese_Japan") &&
+ NULL == setlocale(LC_ALL, "ja_JP.SJIS")) {
+ skipping("CP932/SJIS locale not available on this system.");
+ return;
+ }
+
+ /*
+ * Verify that CP932/SJIS filenames are correctly translated to UTF-8.
+ */
+ a = archive_write_new();
+ assertEqualInt(ARCHIVE_OK, archive_write_set_format_gnutar(a));
+ if (archive_write_set_options(a, "hdrcharset=UTF-8") != ARCHIVE_OK) {
+ skipping("This system cannot convert character-set"
+ " from CP932/SJIS to UTF-8.");
+ archive_write_free(a);
+ return;
+ }
+ assertEqualInt(ARCHIVE_OK,
+ archive_write_open_memory(a, buff, sizeof(buff), &used));
+
+ entry = archive_entry_new2(a);
+ /* Set an CP932/SJIS filename. */
+ archive_entry_set_pathname(entry, "\x95\x5C.txt");
+ /* Check the Unicode version. */
+ archive_entry_set_filetype(entry, AE_IFREG);
+ archive_entry_set_size(entry, 0);
+ assertEqualInt(ARCHIVE_OK, archive_write_header(a, entry));
+ archive_entry_free(entry);
+ assertEqualInt(ARCHIVE_OK, archive_write_free(a));
+
+ /* Check UTF-8 version. */
+ assertEqualMem(buff, "\xE8\xA1\xA8.txt", 7);
+}
+
+DEFINE_TEST(test_gnutar_filename_encoding)
+{
+ test_gnutar_filename_encoding_UTF8_CP866();
+ test_gnutar_filename_encoding_KOI8R_UTF8();
+ test_gnutar_filename_encoding_KOI8R_CP866();
+ test_gnutar_filename_encoding_CP1251_UTF8();
+ test_gnutar_filename_encoding_ru_RU_CP1251();
+ test_gnutar_filename_encoding_Russian_Russia();
+ test_gnutar_filename_encoding_EUCJP_UTF8();
+ test_gnutar_filename_encoding_EUCJP_CP932();
+ test_gnutar_filename_encoding_CP932_UTF8();
+}
diff --git a/contrib/libarchive/libarchive/test/test_open_failure.c b/contrib/libarchive/libarchive/test/test_open_failure.c
index 0a7632a8ad69..06a3a2c1fa35 100644
--- a/contrib/libarchive/libarchive/test/test_open_failure.c
+++ b/contrib/libarchive/libarchive/test/test_open_failure.c
@@ -42,6 +42,8 @@ static ssize_t
my_read(struct archive *a, void *_private, const void **buff)
{
struct my_data *private = (struct my_data *)_private;
+ (void)a; /* UNUSED */
+ (void)buff; /* UNUSED */
assertEqualInt(MAGIC, private->magic);
++private->read_called;
return (private->read_return);
@@ -51,6 +53,9 @@ static ssize_t
my_write(struct archive *a, void *_private, const void *buff, size_t s)
{
struct my_data *private = (struct my_data *)_private;
+ (void)a; /* UNUSED */
+ (void)buff; /* UNUSED */
+ (void)s; /* UNUSED */
assertEqualInt(MAGIC, private->magic);
++private->write_called;
return (private->write_return);
@@ -60,6 +65,7 @@ static int
my_open(struct archive *a, void *_private)
{
struct my_data *private = (struct my_data *)_private;
+ (void)a; /* UNUSED */
assertEqualInt(MAGIC, private->magic);
++private->open_called;
return (private->open_return);
@@ -69,6 +75,7 @@ static int
my_close(struct archive *a, void *_private)
{
struct my_data *private = (struct my_data *)_private;
+ (void)a; /* UNUSED */
assertEqualInt(MAGIC, private->magic);
++private->close_called;
return (private->close_return);
@@ -132,7 +139,7 @@ DEFINE_TEST(test_open_failure)
a = archive_read_new();
assert(a != NULL);
assertEqualInt(ARCHIVE_OK,
- archive_read_support_compression_compress(a));
+ archive_read_support_filter_compress(a));
assertEqualInt(ARCHIVE_OK, archive_read_support_format_tar(a));
assertEqualInt(ARCHIVE_FATAL,
archive_read_open(a, &private, my_open, my_read, my_close));
@@ -153,8 +160,24 @@ DEFINE_TEST(test_open_failure)
archive_write_open(a, &private, my_open, my_write, my_close));
assertEqualInt(1, private.open_called);
assertEqualInt(0, private.write_called);
- // Broken in 2.8, fixed in 3.0
- //assertEqualInt(1, private.close_called);
+ assertEqualInt(1, private.close_called);
+ assertEqualInt(ARCHIVE_OK, archive_write_finish(a));
+ assertEqualInt(1, private.open_called);
+ assertEqualInt(0, private.write_called);
+ assertEqualInt(1, private.close_called);
+
+ memset(&private, 0, sizeof(private));
+ private.magic = MAGIC;
+ private.open_return = ARCHIVE_FATAL;
+ a = archive_write_new();
+ assert(a != NULL);
+ archive_write_add_filter_compress(a);
+ archive_write_set_format_ustar(a);
+ assertEqualInt(ARCHIVE_FATAL,
+ archive_write_open(a, &private, my_open, my_write, my_close));
+ assertEqualInt(1, private.open_called);
+ assertEqualInt(0, private.write_called);
+ assertEqualInt(1, private.close_called);
assertEqualInt(ARCHIVE_OK, archive_write_finish(a));
assertEqualInt(1, private.open_called);
assertEqualInt(0, private.write_called);
@@ -165,14 +188,12 @@ DEFINE_TEST(test_open_failure)
private.open_return = ARCHIVE_FATAL;
a = archive_write_new();
assert(a != NULL);
- archive_write_set_compression_compress(a);
archive_write_set_format_zip(a);
assertEqualInt(ARCHIVE_FATAL,
archive_write_open(a, &private, my_open, my_write, my_close));
assertEqualInt(1, private.open_called);
assertEqualInt(0, private.write_called);
- // Broken in 2.8, fixed in 3.0
- //assertEqualInt(1, private.close_called);
+ assertEqualInt(1, private.close_called);
assertEqualInt(ARCHIVE_OK, archive_write_finish(a));
assertEqualInt(1, private.open_called);
assertEqualInt(0, private.write_called);
@@ -183,13 +204,12 @@ DEFINE_TEST(test_open_failure)
private.open_return = ARCHIVE_FATAL;
a = archive_write_new();
assert(a != NULL);
- archive_write_set_compression_gzip(a);
+ archive_write_add_filter_gzip(a);
assertEqualInt(ARCHIVE_FATAL,
archive_write_open(a, &private, my_open, my_write, my_close));
assertEqualInt(1, private.open_called);
assertEqualInt(0, private.write_called);
- // Broken in 2.8, fixed in 3.0
- //assertEqualInt(1, private.close_called);
+ assertEqualInt(1, private.close_called);
assertEqualInt(ARCHIVE_OK, archive_write_finish(a));
assertEqualInt(1, private.open_called);
assertEqualInt(0, private.write_called);
diff --git a/contrib/libarchive/libarchive/test/test_open_fd.c b/contrib/libarchive/libarchive/test/test_open_fd.c
index 7551dd01a168..764e374eb6d6 100644
--- a/contrib/libarchive/libarchive/test/test_open_fd.c
+++ b/contrib/libarchive/libarchive/test/test_open_fd.c
@@ -79,7 +79,7 @@ DEFINE_TEST(test_open_fd)
/* Close out the archive. */
assertEqualIntA(a, ARCHIVE_OK, archive_write_close(a));
- assertEqualInt(ARCHIVE_OK, archive_write_finish(a));
+ assertEqualInt(ARCHIVE_OK, archive_write_free(a));
/*
* Now, read the data back.
@@ -87,7 +87,7 @@ DEFINE_TEST(test_open_fd)
assert(lseek(fd, 0, SEEK_SET) == 0);
assert((a = archive_read_new()) != NULL);
assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
- assertEqualIntA(a, ARCHIVE_OK, archive_read_support_compression_all(a));
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
assertEqualIntA(a, ARCHIVE_OK, archive_read_open_fd(a, fd, 512));
assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
@@ -110,7 +110,7 @@ DEFINE_TEST(test_open_fd)
/* Verify the end of the archive. */
assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
- assertEqualInt(ARCHIVE_OK, archive_read_finish(a));
+ assertEqualInt(ARCHIVE_OK, archive_read_free(a));
close(fd);
@@ -119,10 +119,10 @@ DEFINE_TEST(test_open_fd)
*/
assert((a = archive_read_new()) != NULL);
assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
- assertEqualIntA(a, ARCHIVE_OK, archive_read_support_compression_all(a));
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
/* FD 100 shouldn't be open. */
assertEqualIntA(a, ARCHIVE_FATAL,
archive_read_open_fd(a, 100, 512));
assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
- assertEqualInt(ARCHIVE_OK, archive_read_finish(a));
+ assertEqualInt(ARCHIVE_OK, archive_read_free(a));
}
diff --git a/contrib/libarchive/libarchive/test/test_open_file.c b/contrib/libarchive/libarchive/test/test_open_file.c
index 7e6c5719a260..9c4611e15966 100644
--- a/contrib/libarchive/libarchive/test/test_open_file.c
+++ b/contrib/libarchive/libarchive/test/test_open_file.c
@@ -67,7 +67,7 @@ DEFINE_TEST(test_open_file)
/* Close out the archive. */
assertEqualIntA(a, ARCHIVE_OK, archive_write_close(a));
- assertEqualInt(ARCHIVE_OK, archive_write_finish(a));
+ assertEqualInt(ARCHIVE_OK, archive_write_free(a));
fclose(f);
/*
@@ -79,7 +79,7 @@ DEFINE_TEST(test_open_file)
return;
assert((a = archive_read_new()) != NULL);
assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
- assertEqualIntA(a, ARCHIVE_OK, archive_read_support_compression_all(a));
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
assertEqualIntA(a, ARCHIVE_OK, archive_read_open_FILE(a, f));
assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
@@ -102,7 +102,7 @@ DEFINE_TEST(test_open_file)
/* Verify the end of the archive. */
assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
- assertEqualInt(ARCHIVE_OK, archive_read_finish(a));
+ assertEqualInt(ARCHIVE_OK, archive_read_free(a));
fclose(f);
}
diff --git a/contrib/libarchive/libarchive/test/test_open_filename.c b/contrib/libarchive/libarchive/test/test_open_filename.c
index b096afcb4ed0..7526298611a4 100644
--- a/contrib/libarchive/libarchive/test/test_open_filename.c
+++ b/contrib/libarchive/libarchive/test/test_open_filename.c
@@ -25,7 +25,8 @@
#include "test.h"
__FBSDID("$FreeBSD$");
-DEFINE_TEST(test_open_filename)
+static void
+test_open_filename_mbs(void)
{
char buff[64];
struct archive_entry *ae;
@@ -62,14 +63,14 @@ DEFINE_TEST(test_open_filename)
/* Close out the archive. */
assertEqualIntA(a, ARCHIVE_OK, archive_write_close(a));
- assertEqualInt(ARCHIVE_OK, archive_write_finish(a));
+ assertEqualInt(ARCHIVE_OK, archive_write_free(a));
/*
* Now, read the data back.
*/
assert((a = archive_read_new()) != NULL);
assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
- assertEqualIntA(a, ARCHIVE_OK, archive_read_support_compression_all(a));
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
assertEqualIntA(a, ARCHIVE_OK,
archive_read_open_filename(a, "test.tar", 512));
@@ -93,17 +94,107 @@ DEFINE_TEST(test_open_filename)
/* Verify the end of the archive. */
assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
- assertEqualInt(ARCHIVE_OK, archive_read_finish(a));
+ assertEqualInt(ARCHIVE_OK, archive_read_free(a));
/*
* Verify some of the error handling.
*/
assert((a = archive_read_new()) != NULL);
assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
- assertEqualIntA(a, ARCHIVE_OK, archive_read_support_compression_all(a));
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
assertEqualIntA(a, ARCHIVE_FATAL,
archive_read_open_filename(a, "nonexistent.tar", 512));
assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
- assertEqualInt(ARCHIVE_OK, archive_read_finish(a));
+ assertEqualInt(ARCHIVE_OK, archive_read_free(a));
+
+}
+
+static void
+test_open_filename_wcs(void)
+{
+ char buff[64];
+ struct archive_entry *ae;
+ struct archive *a;
+
+ /* Write an archive through this FILE *. */
+ assert((a = archive_write_new()) != NULL);
+ assertEqualIntA(a, ARCHIVE_OK, archive_write_set_format_ustar(a));
+ assertEqualIntA(a, ARCHIVE_OK, archive_write_set_compression_none(a));
+ assertEqualIntA(a, ARCHIVE_OK,
+ archive_write_open_filename_w(a, L"test.tar"));
+
+ /*
+ * Write a file to it.
+ */
+ assert((ae = archive_entry_new()) != NULL);
+ archive_entry_set_mtime(ae, 1, 0);
+ archive_entry_copy_pathname_w(ae, L"file");
+ archive_entry_set_mode(ae, S_IFREG | 0755);
+ archive_entry_set_size(ae, 8);
+ assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae));
+ archive_entry_free(ae);
+ assertEqualIntA(a, 8, archive_write_data(a, "12345678", 9));
+ /*
+ * Write a second file to it.
+ */
+ assert((ae = archive_entry_new()) != NULL);
+ archive_entry_copy_pathname_w(ae, L"file2");
+ archive_entry_set_mode(ae, S_IFREG | 0755);
+ archive_entry_set_size(ae, 819200);
+ assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae));
+ archive_entry_free(ae);
+
+ /* Close out the archive. */
+ assertEqualIntA(a, ARCHIVE_OK, archive_write_close(a));
+ assertEqualInt(ARCHIVE_OK, archive_write_free(a));
+
+ /*
+ * Now, read the data back.
+ */
+ assert((a = archive_read_new()) != NULL);
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
+ assertEqualIntA(a, ARCHIVE_OK,
+ archive_read_open_filename_w(a, L"test.tar", 512));
+
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
+ assertEqualInt(1, archive_entry_mtime(ae));
+ assertEqualInt(0, archive_entry_mtime_nsec(ae));
+ assertEqualInt(0, archive_entry_atime(ae));
+ assertEqualInt(0, archive_entry_ctime(ae));
+ assertEqualWString(L"file", archive_entry_pathname_w(ae));
+ assert((S_IFREG | 0755) == archive_entry_mode(ae));
+ assertEqualInt(8, archive_entry_size(ae));
+ assertEqualIntA(a, 8, archive_read_data(a, buff, 10));
+ assertEqualMem(buff, "12345678", 8);
+
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
+ assertEqualWString(L"file2", archive_entry_pathname_w(ae));
+ assert((S_IFREG | 0755) == archive_entry_mode(ae));
+ assertEqualInt(819200, archive_entry_size(ae));
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_data_skip(a));
+
+ /* Verify the end of the archive. */
+ assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
+ assertEqualInt(ARCHIVE_OK, archive_read_free(a));
+
+ /*
+ * Verify some of the error handling.
+ */
+ assert((a = archive_read_new()) != NULL);
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a));
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
+ assertEqualIntA(a, ARCHIVE_FATAL,
+ archive_read_open_filename_w(a, L"nonexistent.tar", 512));
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
+ assertEqualInt(ARCHIVE_OK, archive_read_free(a));
+
+}
+
+DEFINE_TEST(test_open_filename)
+{
+ test_open_filename_mbs();
+ test_open_filename_wcs();
}
diff --git a/contrib/libarchive/libarchive/test/test_pax_filename_encoding.c b/contrib/libarchive/libarchive/test/test_pax_filename_encoding.c
index af0208c4b06b..169f97854283 100644
--- a/contrib/libarchive/libarchive/test/test_pax_filename_encoding.c
+++ b/contrib/libarchive/libarchive/test/test_pax_filename_encoding.c
@@ -58,7 +58,7 @@ test_pax_filename_encoding_1(void)
extract_reference_file(testname);
a = archive_read_new();
assertEqualInt(ARCHIVE_OK, archive_read_support_format_tar(a));
- assertEqualInt(ARCHIVE_OK, archive_read_support_compression_all(a));
+ assertEqualInt(ARCHIVE_OK, archive_read_support_filter_all(a));
assertEqualInt(ARCHIVE_OK,
archive_read_open_filename(a, testname, 10240));
/*
@@ -77,7 +77,7 @@ test_pax_filename_encoding_1(void)
" characters in it without generating a warning");
assertEqualInt(ARCHIVE_OK, archive_read_next_header(a, &entry));
assertEqualString(filename, archive_entry_pathname(entry));
- archive_read_finish(a);
+ archive_read_free(a);
}
/*
@@ -104,13 +104,12 @@ test_pax_filename_encoding_2(void)
/*
* We need a starting locale which has invalid sequences.
- * de_DE.UTF-8 seems to be commonly supported.
+ * en_US.UTF-8 seems to be commonly supported.
*/
/* If it doesn't exist, just warn and return. */
- if (LOCALE_UTF8 == NULL
- || NULL == setlocale(LC_ALL, LOCALE_UTF8)) {
+ if (NULL == setlocale(LC_ALL, "en_US.UTF-8")) {
skipping("invalid encoding tests require a suitable locale;"
- " %s not available on this system", LOCALE_UTF8);
+ " en_US.UTF-8 not available on this system");
return;
}
@@ -151,8 +150,8 @@ test_pax_filename_encoding_2(void)
assertEqualInt(ARCHIVE_WARN, archive_write_header(a, entry));
archive_entry_free(entry);
- assertEqualInt(0, archive_write_close(a));
- assertEqualInt(0, archive_write_finish(a));
+ assertEqualIntA(a, ARCHIVE_OK, archive_write_close(a));
+ assertEqualInt(ARCHIVE_OK, archive_write_free(a));
/*
* Now read the entries back.
@@ -177,10 +176,12 @@ test_pax_filename_encoding_2(void)
assertEqualInt(0, archive_read_next_header(a, &entry));
assertEqualString(longname, archive_entry_pathname(entry));
- assertEqualInt(0, archive_read_close(a));
- assertEqualInt(0, archive_read_finish(a));
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
+ assertEqualInt(ARCHIVE_OK, archive_read_free(a));
}
+#if 0 /* Disable this until Tim check out it. */
+
/*
* Create an entry starting from a wide-character Unicode pathname,
* read it back into "C" locale, which doesn't support the name.
@@ -277,8 +278,8 @@ test_pax_filename_encoding_3(void)
assertEqualInt(ARCHIVE_OK, archive_write_header(a, entry));
archive_entry_free(entry);
- assertEqualInt(0, archive_write_close(a));
- assertEqualInt(0, archive_write_finish(a));
+ assertEqualIntA(a, ARCHIVE_OK, archive_write_close(a));
+ assertEqualInt(ARCHIVE_OK, archive_write_free(a));
/*
* Now read the entries back.
@@ -321,13 +322,280 @@ test_pax_filename_encoding_3(void)
assertEqualInt(ARCHIVE_EOF, archive_read_next_header(a, &entry));
- assertEqualInt(0, archive_read_close(a));
- assertEqualInt(0, archive_read_finish(a));
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
+ assertEqualInt(ARCHIVE_OK, archive_read_free(a));
+}
+#else
+static void
+test_pax_filename_encoding_3(void)
+{
}
+#endif
+
+/*
+ * Verify that KOI8-R filenames are correctly translated to Unicode and UTF-8.
+ */
+static void
+test_pax_filename_encoding_KOI8R(void)
+{
+ struct archive *a;
+ struct archive_entry *entry;
+ char buff[4096];
+ size_t used;
+
+ if (NULL == setlocale(LC_ALL, "ru_RU.KOI8-R")) {
+ skipping("KOI8-R locale not available on this system.");
+ return;
+ }
+
+ /* Check if the paltform completely supports the string conversion. */
+ a = archive_write_new();
+ assertEqualInt(ARCHIVE_OK, archive_write_set_format_pax(a));
+ if (archive_write_set_options(a, "hdrcharset=UTF-8") != ARCHIVE_OK) {
+ skipping("This system cannot convert character-set"
+ " from KOI8-R to UTF-8.");
+ archive_write_free(a);
+ return;
+ }
+ archive_write_free(a);
+
+ /* Re-create a write archive object since filenames should be written
+ * in UTF-8 by default. */
+ a = archive_write_new();
+ assertEqualInt(ARCHIVE_OK, archive_write_set_format_pax(a));
+ assertEqualInt(ARCHIVE_OK,
+ archive_write_open_memory(a, buff, sizeof(buff), &used));
+
+ entry = archive_entry_new2(a);
+ archive_entry_set_pathname(entry, "\xD0\xD2\xC9");
+ archive_entry_set_filetype(entry, AE_IFREG);
+ archive_entry_set_size(entry, 0);
+ assertEqualInt(ARCHIVE_OK, archive_write_header(a, entry));
+ archive_entry_free(entry);
+ assertEqualInt(ARCHIVE_OK, archive_write_free(a));
+
+ /* Above three characters in KOI8-R should translate to the following
+ * three characters (two bytes each) in UTF-8. */
+ assertEqualMem(buff + 512, "15 path=\xD0\xBF\xD1\x80\xD0\xB8\x0A", 15);
+}
+
+/*
+ * Verify that CP1251 filenames are correctly translated to Unicode and UTF-8.
+ */
+static void
+test_pax_filename_encoding_CP1251(void)
+{
+ struct archive *a;
+ struct archive_entry *entry;
+ char buff[4096];
+ size_t used;
+
+ if (NULL == setlocale(LC_ALL, "Russian_Russia") &&
+ NULL == setlocale(LC_ALL, "ru_RU.CP1251")) {
+ skipping("KOI8-R locale not available on this system.");
+ return;
+ }
+
+ /* Check if the paltform completely supports the string conversion. */
+ a = archive_write_new();
+ assertEqualInt(ARCHIVE_OK, archive_write_set_format_pax(a));
+ if (archive_write_set_options(a, "hdrcharset=UTF-8") != ARCHIVE_OK) {
+ skipping("This system cannot convert character-set"
+ " from KOI8-R to UTF-8.");
+ archive_write_free(a);
+ return;
+ }
+ archive_write_free(a);
+
+ /* Re-create a write archive object since filenames should be written
+ * in UTF-8 by default. */
+ a = archive_write_new();
+ assertEqualInt(ARCHIVE_OK, archive_write_set_format_pax(a));
+ assertEqualInt(ARCHIVE_OK,
+ archive_write_open_memory(a, buff, sizeof(buff), &used));
+
+ entry = archive_entry_new2(a);
+ archive_entry_set_pathname(entry, "\xef\xf0\xe8");
+ archive_entry_set_filetype(entry, AE_IFREG);
+ archive_entry_set_size(entry, 0);
+ assertEqualInt(ARCHIVE_OK, archive_write_header(a, entry));
+ archive_entry_free(entry);
+ assertEqualInt(ARCHIVE_OK, archive_write_free(a));
+
+ /* Above three characters in KOI8-R should translate to the following
+ * three characters (two bytes each) in UTF-8. */
+ assertEqualMem(buff + 512, "15 path=\xD0\xBF\xD1\x80\xD0\xB8\x0A", 15);
+}
+
+/*
+ * Verify that EUC-JP filenames are correctly translated to Unicode and UTF-8.
+ */
+static void
+test_pax_filename_encoding_EUCJP(void)
+{
+ struct archive *a;
+ struct archive_entry *entry;
+ char buff[4096];
+ size_t used;
+
+ if (NULL == setlocale(LC_ALL, "ja_JP.eucJP")) {
+ skipping("eucJP locale not available on this system.");
+ return;
+ }
+
+ /* Check if the paltform completely supports the string conversion. */
+ a = archive_write_new();
+ assertEqualInt(ARCHIVE_OK, archive_write_set_format_pax(a));
+ if (archive_write_set_options(a, "hdrcharset=UTF-8") != ARCHIVE_OK) {
+ skipping("This system cannot convert character-set"
+ " from eucJP to UTF-8.");
+ archive_write_free(a);
+ return;
+ }
+ archive_write_free(a);
+
+ /* Re-create a write archive object since filenames should be written
+ * in UTF-8 by default. */
+ a = archive_write_new();
+ assertEqualInt(ARCHIVE_OK, archive_write_set_format_pax(a));
+ assertEqualInt(ARCHIVE_OK,
+ archive_write_open_memory(a, buff, sizeof(buff), &used));
+
+ entry = archive_entry_new2(a);
+ archive_entry_set_pathname(entry, "\xC9\xBD.txt");
+ /* Check the Unicode version. */
+ archive_entry_set_filetype(entry, AE_IFREG);
+ archive_entry_set_size(entry, 0);
+ assertEqualInt(ARCHIVE_OK, archive_write_header(a, entry));
+ archive_entry_free(entry);
+ assertEqualInt(ARCHIVE_OK, archive_write_free(a));
+
+ /* Check UTF-8 version. */
+ assertEqualMem(buff + 512, "16 path=\xE8\xA1\xA8.txt\x0A", 16);
+
+}
+
+/*
+ * Verify that CP932/SJIS filenames are correctly translated to Unicode and UTF-8.
+ */
+static void
+test_pax_filename_encoding_CP932(void)
+{
+ struct archive *a;
+ struct archive_entry *entry;
+ char buff[4096];
+ size_t used;
+
+ if (NULL == setlocale(LC_ALL, "Japanese_Japan") &&
+ NULL == setlocale(LC_ALL, "ja_JP.SJIS")) {
+ skipping("eucJP locale not available on this system.");
+ return;
+ }
+
+ /* Check if the paltform completely supports the string conversion. */
+ a = archive_write_new();
+ assertEqualInt(ARCHIVE_OK, archive_write_set_format_pax(a));
+ if (archive_write_set_options(a, "hdrcharset=UTF-8") != ARCHIVE_OK) {
+ skipping("This system cannot convert character-set"
+ " from CP932/SJIS to UTF-8.");
+ archive_write_free(a);
+ return;
+ }
+ archive_write_free(a);
+
+ /* Re-create a write archive object since filenames should be written
+ * in UTF-8 by default. */
+ a = archive_write_new();
+ assertEqualInt(ARCHIVE_OK, archive_write_set_format_pax(a));
+ assertEqualInt(ARCHIVE_OK,
+ archive_write_open_memory(a, buff, sizeof(buff), &used));
+
+ entry = archive_entry_new2(a);
+ archive_entry_set_pathname(entry, "\x95\x5C.txt");
+ /* Check the Unicode version. */
+ archive_entry_set_filetype(entry, AE_IFREG);
+ archive_entry_set_size(entry, 0);
+ assertEqualInt(ARCHIVE_OK, archive_write_header(a, entry));
+ archive_entry_free(entry);
+ assertEqualInt(ARCHIVE_OK, archive_write_free(a));
+
+ /* Check UTF-8 version. */
+ assertEqualMem(buff + 512, "16 path=\xE8\xA1\xA8.txt\x0A", 16);
+
+}
+
+/*
+ * Verify that KOI8-R filenames are not translated to Unicode and UTF-8
+ * when using hdrcharset=BINARY option.
+ */
+static void
+test_pax_filename_encoding_KOI8R_BINARY(void)
+{
+ struct archive *a;
+ struct archive_entry *entry;
+ char buff[4096];
+ size_t used;
+
+ if (NULL == setlocale(LC_ALL, "ru_RU.KOI8-R")) {
+ skipping("KOI8-R locale not available on this system.");
+ return;
+ }
+
+ a = archive_write_new();
+ assertEqualInt(ARCHIVE_OK, archive_write_set_format_pax(a));
+ /* BINARY mode should be accepted. */
+ assertEqualInt(ARCHIVE_OK,
+ archive_write_set_options(a, "hdrcharset=BINARY"));
+ assertEqualInt(ARCHIVE_OK,
+ archive_write_open_memory(a, buff, sizeof(buff), &used));
+
+ entry = archive_entry_new2(a);
+ archive_entry_set_pathname(entry, "\xD0\xD2\xC9");
+ archive_entry_set_filetype(entry, AE_IFREG);
+ archive_entry_set_size(entry, 0);
+ assertEqualInt(ARCHIVE_OK, archive_write_header(a, entry));
+ archive_entry_free(entry);
+ assertEqualInt(ARCHIVE_OK, archive_write_free(a));
+
+ /* "hdrcharset=BINARY" pax attribute should be written. */
+ assertEqualMem(buff + 512, "21 hdrcharset=BINARY\x0A", 21);
+ /* Above three characters in KOI8-R should not translate to any
+ * character-set. */
+ assertEqualMem(buff + 512+21, "12 path=\xD0\xD2\xC9\x0A", 12);
+}
+
+/*
+ * Pax format writer only accepts both BINARY and UTF-8.
+ * If other character-set name is specified, you will get ARCHIVE_FAILED.
+ */
+static void
+test_pax_filename_encoding_KOI8R_CP1251(void)
+{
+ struct archive *a;
+
+ if (NULL == setlocale(LC_ALL, "ru_RU.KOI8-R")) {
+ skipping("KOI8-R locale not available on this system.");
+ return;
+ }
+
+ a = archive_write_new();
+ assertEqualInt(ARCHIVE_OK, archive_write_set_format_pax(a));
+ /* pax format writer only accepts both BINARY and UTF-8. */
+ assertEqualInt(ARCHIVE_FAILED,
+ archive_write_set_options(a, "hdrcharset=CP1251"));
+ assertEqualInt(ARCHIVE_OK, archive_write_free(a));
+}
+
DEFINE_TEST(test_pax_filename_encoding)
{
test_pax_filename_encoding_1();
test_pax_filename_encoding_2();
test_pax_filename_encoding_3();
+ test_pax_filename_encoding_KOI8R();
+ test_pax_filename_encoding_CP1251();
+ test_pax_filename_encoding_EUCJP();
+ test_pax_filename_encoding_CP932();
+ test_pax_filename_encoding_KOI8R_BINARY();
+ test_pax_filename_encoding_KOI8R_CP1251();
}
diff --git a/contrib/libarchive/libarchive/test/test_read_compress_program.c b/contrib/libarchive/libarchive/test/test_read_compress_program.c
index 12e6afc2cc12..3e98db872766 100644
--- a/contrib/libarchive/libarchive/test/test_read_compress_program.c
+++ b/contrib/libarchive/libarchive/test/test_read_compress_program.c
@@ -43,9 +43,9 @@ DEFINE_TEST(test_read_compress_program)
* program is requested.
*/
assert((a = archive_read_new()) != NULL);
- r = archive_read_support_compression_program(a, "nonexistent");
+ r = archive_read_support_filter_program(a, "nonexistent");
if (r == ARCHIVE_FATAL) {
- skipping("archive_read_support_compression_program() "
+ skipping("archive_read_support_filter_program() "
"unsupported on this platform");
return;
}
@@ -55,7 +55,7 @@ DEFINE_TEST(test_read_compress_program)
assertEqualIntA(a, ARCHIVE_FATAL,
archive_read_open_memory(a, archive, sizeof(archive)));
assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
- assertEqualInt(ARCHIVE_OK, archive_read_finish(a));
+ assertEqualInt(ARCHIVE_OK, archive_read_free(a));
/*
* If we have "gzip -d", try using that.
@@ -66,9 +66,9 @@ DEFINE_TEST(test_read_compress_program)
}
assert((a = archive_read_new()) != NULL);
assertEqualIntA(a, ARCHIVE_OK,
- archive_read_support_compression_none(a));
+ archive_read_support_filter_none(a));
assertEqualIntA(a, ARCHIVE_OK,
- archive_read_support_compression_program(a, "gunzip"));
+ archive_read_support_filter_program(a, "gunzip"));
assertEqualIntA(a, ARCHIVE_OK,
archive_read_support_format_all(a));
assertEqualIntA(a, ARCHIVE_OK,
@@ -78,7 +78,7 @@ DEFINE_TEST(test_read_compress_program)
assertEqualInt(archive_compression(a), ARCHIVE_COMPRESSION_PROGRAM);
assertEqualInt(archive_format(a), ARCHIVE_FORMAT_TAR_USTAR);
assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
- assertEqualInt(ARCHIVE_OK, archive_read_finish(a));
+ assertEqualInt(ARCHIVE_OK, archive_read_free(a));
}
diff --git a/contrib/libarchive/libarchive/test/test_read_data_large.c b/contrib/libarchive/libarchive/test/test_read_data_large.c
index 2dacb50f3b82..2a4e1302fc87 100644
--- a/contrib/libarchive/libarchive/test/test_read_data_large.c
+++ b/contrib/libarchive/libarchive/test/test_read_data_large.c
@@ -72,34 +72,26 @@ DEFINE_TEST(test_read_data_large)
assertA((int)sizeof(buff2) == archive_write_data(a, buff2, sizeof(buff2)));
/* Close out the archive. */
- assertA(0 == archive_write_close(a));
-#if ARCHIVE_VERSION_NUMBER < 2000000
- archive_write_finish(a);
-#else
- assertA(0 == archive_write_finish(a));
-#endif
+ assertEqualIntA(a, ARCHIVE_OK, archive_write_close(a));
+ assertEqualInt(ARCHIVE_OK, archive_write_free(a));
/* Check that archive_read_data can handle 10*10^6 at a pop. */
assert((a = archive_read_new()) != NULL);
assertA(0 == archive_read_support_format_all(a));
- assertA(0 == archive_read_support_compression_all(a));
+ assertA(0 == archive_read_support_filter_all(a));
assertA(0 == archive_read_open_memory(a, buff1, sizeof(buff1)));
assertA(0 == archive_read_next_header(a, &ae));
failure("Wrote 10MB, but didn't read the same amount");
assertEqualIntA(a, sizeof(buff2),archive_read_data(a, buff3, sizeof(buff3)));
failure("Read expected 10MB, but data read didn't match what was written");
- assert(0 == memcmp(buff2, buff3, sizeof(buff3)));
- assert(0 == archive_read_close(a));
-#if ARCHIVE_VERSION_NUMBER < 2000000
- archive_read_finish(a);
-#else
- assert(0 == archive_read_finish(a));
-#endif
+ assertEqualMem(buff2, buff3, sizeof(buff3));
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
+ assertEqualInt(ARCHIVE_OK, archive_read_free(a));
/* Check archive_read_data_into_fd */
assert((a = archive_read_new()) != NULL);
assertA(0 == archive_read_support_format_all(a));
- assertA(0 == archive_read_support_compression_all(a));
+ assertA(0 == archive_read_support_filter_all(a));
assertA(0 == archive_read_open_memory(a, buff1, sizeof(buff1)));
assertA(0 == archive_read_next_header(a, &ae));
#if defined(__BORLANDC__)
@@ -109,17 +101,13 @@ DEFINE_TEST(test_read_data_large)
#endif
assert(tmpfilefd != 0);
assertEqualIntA(a, 0, archive_read_data_into_fd(a, tmpfilefd));
- assert(0 == archive_read_close(a));
-#if ARCHIVE_VERSION_NUMBER < 2000000
- archive_read_finish(a);
-#else
- assert(0 == archive_read_finish(a));
-#endif
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
+ assertEqualInt(ARCHIVE_OK, archive_read_free(a));
close(tmpfilefd);
f = fopen(tmpfilename, "rb");
assert(f != NULL);
assertEqualInt(sizeof(buff3), fread(buff3, 1, sizeof(buff3), f));
fclose(f);
- assert(0 == memcmp(buff2, buff3, sizeof(buff3)));
+ assertEqualMem(buff2, buff3, sizeof(buff3));
}
diff --git a/contrib/libarchive/libarchive/test/test_read_disk.c b/contrib/libarchive/libarchive/test/test_read_disk.c
index 5666656d5389..0dc1f79aeb7f 100644
--- a/contrib/libarchive/libarchive/test/test_read_disk.c
+++ b/contrib/libarchive/libarchive/test/test_read_disk.c
@@ -34,7 +34,7 @@ gname_cleanup(void *d)
}
static const char *
-gname_lookup(void *d, gid_t g)
+gname_lookup(void *d, int64_t g)
{
int *mp = d;
assertEqualInt(*mp, 0x13579);
@@ -52,7 +52,7 @@ uname_cleanup(void *d)
}
static const char *
-uname_lookup(void *d, uid_t u)
+uname_lookup(void *d, int64_t u)
{
int *mp = d;
assertEqualInt(*mp, 0x1234);
@@ -164,7 +164,7 @@ DEFINE_TEST(test_read_disk)
&umagic, &uname_lookup, &uname_cleanup));
/* Destroy the archive. */
- assertEqualInt(ARCHIVE_OK, archive_read_finish(a));
+ assertEqualInt(ARCHIVE_OK, archive_read_free(a));
/* Verify our cleanup functions got called. */
assertEqualInt(gmagic, 0x2468);
diff --git a/contrib/libarchive/libarchive/test/test_read_disk_directory_traversals.c b/contrib/libarchive/libarchive/test/test_read_disk_directory_traversals.c
new file mode 100644
index 000000000000..6741ee1b48be
--- /dev/null
+++ b/contrib/libarchive/libarchive/test/test_read_disk_directory_traversals.c
@@ -0,0 +1,1060 @@
+/*-
+ * Copyright (c) 2010 Michihiro NAKAJIMA
+ * 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.
+ */
+#include "test.h"
+__FBSDID("$FreeBSD$");
+
+#include <limits.h>
+#if defined(_WIN32) && !defined(__CYGWIN__)
+# if !defined(__BORLANDC__)
+# define getcwd _getcwd
+# endif
+#endif
+
+/*
+ * Test if the current filesytem is mounted with noatime option.
+ */
+static int
+atimeIsUpdated(void)
+{
+ const char *fn = "fs_noatime";
+ struct stat st;
+
+ if (!assertMakeFile(fn, 0666, "a"))
+ return (0);
+ if (!assertUtimes(fn, 1, 0, 1, 0))
+ return (0);
+ /* Test the file contents in order to update its atime. */
+ if (!assertTextFileContents("a", fn))
+ return (0);
+ if (stat(fn, &st) != 0)
+ return (0);
+ /* Is atime updated? */
+ if (st.st_atime > 1)
+ return (1);
+ return (0);
+}
+
+static void
+test_basic(void)
+{
+ struct archive *a;
+ struct archive_entry *ae;
+ const void *p;
+ char *initial_cwd, *cwd;
+ size_t size;
+ int64_t offset;
+ int file_count;
+
+ assertMakeDir("dir1", 0755);
+ assertMakeFile("dir1/file1", 0644, "0123456789");
+ assertMakeFile("dir1/file2", 0644, "hello world");
+ assertMakeDir("dir1/sub1", 0755);
+ assertMakeFile("dir1/sub1/file1", 0644, "0123456789");
+ assertMakeDir("dir1/sub2", 0755);
+ assertMakeFile("dir1/sub2/file1", 0644, "0123456789");
+ assertMakeFile("dir1/sub2/file2", 0644, "0123456789");
+ assertMakeDir("dir1/sub2/sub1", 0755);
+ assertMakeDir("dir1/sub2/sub2", 0755);
+ assertMakeDir("dir1/sub2/sub3", 0755);
+ assertMakeFile("dir1/sub2/sub3/file", 0644, "xyz");
+ file_count = 12;
+
+ assert((ae = archive_entry_new()) != NULL);
+ assert((a = archive_read_disk_new()) != NULL);
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_disk_open(a, "dir1"));
+
+ while (file_count--) {
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header2(a, ae));
+ if (strcmp(archive_entry_pathname(ae), "dir1") == 0) {
+ assertEqualInt(archive_entry_filetype(ae), AE_IFDIR);
+ } else if (strcmp(archive_entry_pathname(ae),
+ "dir1/file1") == 0) {
+ assertEqualInt(archive_entry_filetype(ae), AE_IFREG);
+ assertEqualInt(archive_entry_size(ae), 10);
+ assertEqualIntA(a, ARCHIVE_OK,
+ archive_read_data_block(a, &p, &size, &offset));
+ assertEqualInt((int)size, 10);
+ assertEqualInt((int)offset, 0);
+ assertEqualMem(p, "0123456789", 10);
+ assertEqualInt(ARCHIVE_EOF,
+ archive_read_data_block(a, &p, &size, &offset));
+ assertEqualInt((int)size, 0);
+ assertEqualInt((int)offset, 10);
+ } else if (strcmp(archive_entry_pathname(ae),
+ "dir1/file2") == 0) {
+ assertEqualInt(archive_entry_filetype(ae), AE_IFREG);
+ assertEqualInt(archive_entry_size(ae), 11);
+ assertEqualIntA(a, ARCHIVE_OK,
+ archive_read_data_block(a, &p, &size, &offset));
+ assertEqualInt((int)size, 11);
+ assertEqualInt((int)offset, 0);
+ assertEqualMem(p, "hello world", 11);
+ assertEqualInt(ARCHIVE_EOF,
+ archive_read_data_block(a, &p, &size, &offset));
+ assertEqualInt((int)size, 0);
+ assertEqualInt((int)offset, 11);
+ } else if (strcmp(archive_entry_pathname(ae),
+ "dir1/sub1") == 0) {
+ assertEqualInt(archive_entry_filetype(ae), AE_IFDIR);
+ } else if (strcmp(archive_entry_pathname(ae),
+ "dir1/sub1/file1") == 0) {
+ assertEqualInt(archive_entry_filetype(ae), AE_IFREG);
+ assertEqualInt(archive_entry_size(ae), 10);
+ assertEqualIntA(a, ARCHIVE_OK,
+ archive_read_data_block(a, &p, &size, &offset));
+ assertEqualInt((int)size, 10);
+ assertEqualInt((int)offset, 0);
+ assertEqualMem(p, "0123456789", 10);
+ assertEqualInt(ARCHIVE_EOF,
+ archive_read_data_block(a, &p, &size, &offset));
+ assertEqualInt((int)size, 0);
+ assertEqualInt((int)offset, 10);
+ } else if (strcmp(archive_entry_pathname(ae),
+ "dir1/sub2") == 0) {
+ assertEqualInt(archive_entry_filetype(ae), AE_IFDIR);
+ } else if (strcmp(archive_entry_pathname(ae),
+ "dir1/sub2/file1") == 0) {
+ assertEqualInt(archive_entry_filetype(ae), AE_IFREG);
+ assertEqualInt(archive_entry_size(ae), 10);
+ assertEqualIntA(a, ARCHIVE_OK,
+ archive_read_data_block(a, &p, &size, &offset));
+ assertEqualInt((int)size, 10);
+ assertEqualInt((int)offset, 0);
+ assertEqualMem(p, "0123456789", 10);
+ assertEqualInt(ARCHIVE_EOF,
+ archive_read_data_block(a, &p, &size, &offset));
+ assertEqualInt((int)size, 0);
+ assertEqualInt((int)offset, 10);
+ } else if (strcmp(archive_entry_pathname(ae),
+ "dir1/sub2/file2") == 0) {
+ assertEqualInt(archive_entry_filetype(ae), AE_IFREG);
+ assertEqualInt(archive_entry_size(ae), 10);
+ assertEqualIntA(a, ARCHIVE_OK,
+ archive_read_data_block(a, &p, &size, &offset));
+ assertEqualInt((int)size, 10);
+ assertEqualInt((int)offset, 0);
+ assertEqualMem(p, "0123456789", 10);
+ assertEqualInt(ARCHIVE_EOF,
+ archive_read_data_block(a, &p, &size, &offset));
+ assertEqualInt((int)size, 0);
+ assertEqualInt((int)offset, 10);
+ } else if (strcmp(archive_entry_pathname(ae),
+ "dir1/sub2/sub1") == 0) {
+ assertEqualInt(archive_entry_filetype(ae), AE_IFDIR);
+ } else if (strcmp(archive_entry_pathname(ae),
+ "dir1/sub2/sub2") == 0) {
+ assertEqualInt(archive_entry_filetype(ae), AE_IFDIR);
+ } else if (strcmp(archive_entry_pathname(ae),
+ "dir1/sub2/sub3") == 0) {
+ assertEqualInt(archive_entry_filetype(ae), AE_IFDIR);
+ } else if (strcmp(archive_entry_pathname(ae),
+ "dir1/sub2/sub3/file") == 0) {
+ assertEqualInt(archive_entry_filetype(ae), AE_IFREG);
+ assertEqualInt(archive_entry_size(ae), 3);
+ assertEqualIntA(a, ARCHIVE_OK,
+ archive_read_data_block(a, &p, &size, &offset));
+ assertEqualInt((int)size, 3);
+ assertEqualInt((int)offset, 0);
+ assertEqualMem(p, "xyz", 3);
+ assertEqualInt(ARCHIVE_EOF,
+ archive_read_data_block(a, &p, &size, &offset));
+ assertEqualInt((int)size, 0);
+ assertEqualInt((int)offset, 3);
+ }
+ if (archive_entry_filetype(ae) == AE_IFDIR) {
+ /* Descend into the current object */
+ assertEqualIntA(a, ARCHIVE_OK,
+ archive_read_disk_descend(a));
+ }
+ }
+ /* There is no entry. */
+ assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header2(a, ae));
+
+ /* Close the disk object. */
+ assertEqualInt(ARCHIVE_OK, archive_read_close(a));
+
+ /*
+ * Test that call archive_read_disk_open_w, wchar_t version.
+ */
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_disk_open_w(a, L"dir1"));
+
+ file_count = 12;
+ while (file_count--) {
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header2(a, ae));
+ if (wcscmp(archive_entry_pathname_w(ae), L"dir1") == 0) {
+ assertEqualInt(archive_entry_filetype(ae), AE_IFDIR);
+ } else if (wcscmp(archive_entry_pathname_w(ae),
+ L"dir1/file1") == 0) {
+ assertEqualInt(archive_entry_filetype(ae), AE_IFREG);
+ assertEqualInt(archive_entry_size(ae), 10);
+ assertEqualIntA(a, ARCHIVE_OK,
+ archive_read_data_block(a, &p, &size, &offset));
+ assertEqualInt((int)size, 10);
+ assertEqualInt((int)offset, 0);
+ assertEqualMem(p, "0123456789", 10);
+ assertEqualInt(ARCHIVE_EOF,
+ archive_read_data_block(a, &p, &size, &offset));
+ assertEqualInt((int)size, 0);
+ assertEqualInt((int)offset, 10);
+ } else if (wcscmp(archive_entry_pathname_w(ae),
+ L"dir1/file2") == 0) {
+ assertEqualInt(archive_entry_filetype(ae), AE_IFREG);
+ assertEqualInt(archive_entry_size(ae), 11);
+ assertEqualIntA(a, ARCHIVE_OK,
+ archive_read_data_block(a, &p, &size, &offset));
+ assertEqualInt((int)size, 11);
+ assertEqualInt((int)offset, 0);
+ assertEqualMem(p, "hello world", 11);
+ assertEqualInt(ARCHIVE_EOF,
+ archive_read_data_block(a, &p, &size, &offset));
+ assertEqualInt((int)size, 0);
+ assertEqualInt((int)offset, 11);
+ } else if (wcscmp(archive_entry_pathname_w(ae),
+ L"dir1/sub1") == 0) {
+ assertEqualInt(archive_entry_filetype(ae), AE_IFDIR);
+ } else if (wcscmp(archive_entry_pathname_w(ae),
+ L"dir1/sub1/file1") == 0) {
+ assertEqualInt(archive_entry_filetype(ae), AE_IFREG);
+ assertEqualInt(archive_entry_size(ae), 10);
+ assertEqualIntA(a, ARCHIVE_OK,
+ archive_read_data_block(a, &p, &size, &offset));
+ assertEqualInt((int)size, 10);
+ assertEqualInt((int)offset, 0);
+ assertEqualMem(p, "0123456789", 10);
+ assertEqualInt(ARCHIVE_EOF,
+ archive_read_data_block(a, &p, &size, &offset));
+ assertEqualInt((int)size, 0);
+ assertEqualInt((int)offset, 10);
+ } else if (wcscmp(archive_entry_pathname_w(ae),
+ L"dir1/sub2") == 0) {
+ assertEqualInt(archive_entry_filetype(ae), AE_IFDIR);
+ } else if (wcscmp(archive_entry_pathname_w(ae),
+ L"dir1/sub2/file1") == 0) {
+ assertEqualInt(archive_entry_filetype(ae), AE_IFREG);
+ assertEqualInt(archive_entry_size(ae), 10);
+ assertEqualIntA(a, ARCHIVE_OK,
+ archive_read_data_block(a, &p, &size, &offset));
+ assertEqualInt((int)size, 10);
+ assertEqualInt((int)offset, 0);
+ assertEqualMem(p, "0123456789", 10);
+ assertEqualInt(ARCHIVE_EOF,
+ archive_read_data_block(a, &p, &size, &offset));
+ assertEqualInt((int)size, 0);
+ assertEqualInt((int)offset, 10);
+ } else if (wcscmp(archive_entry_pathname_w(ae),
+ L"dir1/sub2/file2") == 0) {
+ assertEqualInt(archive_entry_filetype(ae), AE_IFREG);
+ assertEqualInt(archive_entry_size(ae), 10);
+ assertEqualIntA(a, ARCHIVE_OK,
+ archive_read_data_block(a, &p, &size, &offset));
+ assertEqualInt((int)size, 10);
+ assertEqualInt((int)offset, 0);
+ assertEqualMem(p, "0123456789", 10);
+ assertEqualInt(ARCHIVE_EOF,
+ archive_read_data_block(a, &p, &size, &offset));
+ assertEqualInt((int)size, 0);
+ assertEqualInt((int)offset, 10);
+ } else if (wcscmp(archive_entry_pathname_w(ae),
+ L"dir1/sub2/sub1") == 0) {
+ assertEqualInt(archive_entry_filetype(ae), AE_IFDIR);
+ } else if (wcscmp(archive_entry_pathname_w(ae),
+ L"dir1/sub2/sub2") == 0) {
+ assertEqualInt(archive_entry_filetype(ae), AE_IFDIR);
+ } else if (wcscmp(archive_entry_pathname_w(ae),
+ L"dir1/sub2/sub3") == 0) {
+ assertEqualInt(archive_entry_filetype(ae), AE_IFDIR);
+ } else if (wcscmp(archive_entry_pathname_w(ae),
+ L"dir1/sub2/sub3/file") == 0) {
+ assertEqualInt(archive_entry_filetype(ae), AE_IFREG);
+ assertEqualInt(archive_entry_size(ae), 3);
+ assertEqualIntA(a, ARCHIVE_OK,
+ archive_read_data_block(a, &p, &size, &offset));
+ assertEqualInt((int)size, 3);
+ assertEqualInt((int)offset, 0);
+ assertEqualMem(p, "xyz", 3);
+ assertEqualInt(ARCHIVE_EOF,
+ archive_read_data_block(a, &p, &size, &offset));
+ assertEqualInt((int)size, 0);
+ assertEqualInt((int)offset, 3);
+ }
+ if (archive_entry_filetype(ae) == AE_IFDIR) {
+ /* Descend into the current object */
+ assertEqualIntA(a, ARCHIVE_OK,
+ archive_read_disk_descend(a));
+ }
+ }
+ /* There is no entry. */
+ assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header2(a, ae));
+
+ /* Close the disk object. */
+ assertEqualInt(ARCHIVE_OK, archive_read_close(a));
+
+ /*
+ * Test that call archive_read_disk_open with a regular file.
+ */
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_disk_open(a, "dir1/file1"));
+
+ /* dir1/file1 */
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header2(a, ae));
+ assertEqualString(archive_entry_pathname(ae), "dir1/file1");
+ assertEqualInt(archive_entry_filetype(ae), AE_IFREG);
+ assertEqualInt(archive_entry_size(ae), 10);
+ assertEqualIntA(a, ARCHIVE_OK,
+ archive_read_data_block(a, &p, &size, &offset));
+ assertEqualInt((int)size, 10);
+ assertEqualInt((int)offset, 0);
+ assertEqualMem(p, "0123456789", 10);
+
+ /* There is no entry. */
+ assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header2(a, ae));
+
+ /* Close the disk object. */
+ assertEqualInt(ARCHIVE_OK, archive_read_close(a));
+
+
+#if defined(_WIN32) && !defined(__CYGWIN__)
+ /*
+ * Test for wildcard '*' or '?'
+ */
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_disk_open(a, "dir1/*1"));
+
+ /* dir1/file1 */
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header2(a, ae));
+ assertEqualString(archive_entry_pathname(ae), "dir1/file1");
+ assertEqualInt(archive_entry_filetype(ae), AE_IFREG);
+ assertEqualInt(archive_entry_size(ae), 10);
+ assertEqualIntA(a, ARCHIVE_OK,
+ archive_read_data_block(a, &p, &size, &offset));
+ assertEqualInt((int)size, 10);
+ assertEqualInt((int)offset, 0);
+ assertEqualMem(p, "0123456789", 10);
+
+ /* dir1/sub1 */
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header2(a, ae));
+ assertEqualString(archive_entry_pathname(ae), "dir1/sub1");
+ assertEqualInt(archive_entry_filetype(ae), AE_IFDIR);
+
+ /* Descend into the current object */
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_disk_descend(a));
+
+ /* dir1/sub1/file1 */
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header2(a, ae));
+ assertEqualString(archive_entry_pathname(ae), "dir1/sub1/file1");
+ assertEqualInt(archive_entry_filetype(ae), AE_IFREG);
+ assertEqualInt(archive_entry_size(ae), 10);
+ assertEqualIntA(a, ARCHIVE_OK,
+ archive_read_data_block(a, &p, &size, &offset));
+ assertEqualInt((int)size, 10);
+ assertEqualInt((int)offset, 0);
+ assertEqualMem(p, "0123456789", 10);
+
+ /* There is no entry. */
+ assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header2(a, ae));
+
+ /* Close the disk object. */
+ assertEqualInt(ARCHIVE_OK, archive_read_close(a));
+#endif
+
+ /*
+ * We should be on the initial directory where we performed
+ * archive_read_disk_new() after we perfome archive_read_free()
+ * even if we broke off the directory traversals.
+ */
+
+ /* Save current working directory. */
+#ifdef PATH_MAX
+ initial_cwd = getcwd(NULL, PATH_MAX);/* Solaris getcwd needs the size. */
+#else
+ initial_cwd = getcwd(NULL, 0);
+#endif
+
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_disk_open(a, "dir1"));
+
+ /* Step in a deep directory. */
+ file_count = 12;
+ while (file_count--) {
+ assertEqualIntA(a, ARCHIVE_OK,
+ archive_read_next_header2(a, ae));
+ if (strcmp(archive_entry_pathname(ae),
+ "dir1/sub1/file1") == 0)
+ /*
+ * We are on an another directory at this time.
+ */
+ break;
+ if (archive_entry_filetype(ae) == AE_IFDIR) {
+ /* Descend into the current object */
+ assertEqualIntA(a, ARCHIVE_OK,
+