The branch stable/13 has been updated by mm: URL: https://cgit.FreeBSD.org/src/commit/?id=d2131c8276f3c05a521ce971b6dda194ab417adc
commit d2131c8276f3c05a521ce971b6dda194ab417adc Author: Martin Matuska <[email protected]> AuthorDate: 2025-11-19 13:33:40 +0000 Commit: Martin Matuska <[email protected]> CommitDate: 2026-01-15 21:25:45 +0000 libarchive: merge from vendor branch libarchive 3.8.3 Important bugfixes: #2753 lib: Create temporary files in the target directory #2768 lha: Fix for an out-of-bounds buffer overrun when using p[H_LEVEL_OFFSET] #2769 7-zip: Fix a buffer overrun when reading truncated 7zip headers #2771 lz4 and zstd: Support both lz4 and zstd data with leading skippable frames Obtained from: libarchive Vendor commit: 1368b08875351df8aa268237b882c8f4ceb0882d MFC after: 1 week (cherry picked from commit 007679a138089676aadc9a712277f4004403b905) --- contrib/libarchive/NEWS | 2 + contrib/libarchive/libarchive/archive.h | 4 +- contrib/libarchive/libarchive/archive_entry.h | 2 +- contrib/libarchive/libarchive/archive_entry_stat.3 | 2 +- .../libarchive/archive_read_disk_entry_from_file.c | 10 +- .../libarchive/archive_read_disk_posix.c | 10 +- .../libarchive/archive_read_support_filter_lz4.c | 82 +- .../libarchive/archive_read_support_filter_zstd.c | 67 +- .../libarchive/archive_read_support_format_7zip.c | 8 +- .../libarchive/archive_read_support_format_lha.c | 2 +- .../libarchive/archive_read_support_format_tar.c | 1 + .../libarchive/archive_read_support_format_zip.c | 28 +- contrib/libarchive/libarchive/archive_string.c | 20 + contrib/libarchive/libarchive/archive_string.h | 4 + .../libarchive/archive_write_disk_posix.c | 20 +- .../libarchive/archive_write_open_filename.c | 2 + contrib/libarchive/libarchive/module.modulemap | 34 + .../libarchive/test/test_archive_string.c | 38 + .../libarchive/libarchive/test/test_compat_lz4.c | 2 + .../test_compat_lz4_skippable_frames_B4.tar.lz4.uu | 6739 ++++++++++++++++++++ .../test/test_read_format_7zip_issue2765.7z.uu | 5 + .../test/test_read_format_7zip_issue2765.c | 51 + .../libarchive/tar/test/test_option_safe_writes.c | 1 + contrib/libarchive/tar/util.c | 5 +- contrib/libarchive/test_utils/test_main.c | 27 +- lib/libarchive/tests/Makefile | 3 + 26 files changed, 7109 insertions(+), 60 deletions(-) diff --git a/contrib/libarchive/NEWS b/contrib/libarchive/NEWS index f2dd4102fa04..971ae8e441e1 100644 --- a/contrib/libarchive/NEWS +++ b/contrib/libarchive/NEWS @@ -1,3 +1,5 @@ +Nov 17, 2026: libarchive 3.8.3 released + Oct 15, 2026: libarchive 3.8.2 released Jun 01, 2026: libarchive 3.8.1 released diff --git a/contrib/libarchive/libarchive/archive.h b/contrib/libarchive/libarchive/archive.h index 98d7674e18f1..9794dced6ca9 100644 --- a/contrib/libarchive/libarchive/archive.h +++ b/contrib/libarchive/libarchive/archive.h @@ -34,7 +34,7 @@ * assert that ARCHIVE_VERSION_NUMBER >= 2012108. */ /* Note: Compiler will complain if this does not match archive_entry.h! */ -#define ARCHIVE_VERSION_NUMBER 3008002 +#define ARCHIVE_VERSION_NUMBER 3008003 #include <sys/stat.h> #include <stddef.h> /* for wchar_t */ @@ -177,7 +177,7 @@ __LA_DECL int archive_version_number(void); /* * Textual name/version of the library, useful for version displays. */ -#define ARCHIVE_VERSION_ONLY_STRING "3.8.2" +#define ARCHIVE_VERSION_ONLY_STRING "3.8.3" #define ARCHIVE_VERSION_STRING "libarchive " ARCHIVE_VERSION_ONLY_STRING __LA_DECL const char * archive_version_string(void); diff --git a/contrib/libarchive/libarchive/archive_entry.h b/contrib/libarchive/libarchive/archive_entry.h index 344f33bffac2..924b67a301cf 100644 --- a/contrib/libarchive/libarchive/archive_entry.h +++ b/contrib/libarchive/libarchive/archive_entry.h @@ -28,7 +28,7 @@ #define ARCHIVE_ENTRY_H_INCLUDED /* Note: Compiler will complain if this does not match archive.h! */ -#define ARCHIVE_VERSION_NUMBER 3008002 +#define ARCHIVE_VERSION_NUMBER 3008003 /* * Note: archive_entry.h is for use outside of libarchive; the diff --git a/contrib/libarchive/libarchive/archive_entry_stat.3 b/contrib/libarchive/libarchive/archive_entry_stat.3 index 29a53f75607f..2f4a1920eb64 100644 --- a/contrib/libarchive/libarchive/archive_entry_stat.3 +++ b/contrib/libarchive/libarchive/archive_entry_stat.3 @@ -207,7 +207,7 @@ for setting is recommended. The function .Fn archive_entry_size returns the file size, if it has been set, and 0 otherwise. -.Fn archive_entry_size +.Fn archive_entry_size_is_set can be used to query that status. .Fn archive_entry_set_size and diff --git a/contrib/libarchive/libarchive/archive_read_disk_entry_from_file.c b/contrib/libarchive/libarchive/archive_read_disk_entry_from_file.c index 42af4034b07e..121af19872e9 100644 --- a/contrib/libarchive/libarchive/archive_read_disk_entry_from_file.c +++ b/contrib/libarchive/libarchive/archive_read_disk_entry_from_file.c @@ -358,12 +358,10 @@ setup_mac_metadata(struct archive_read_disk *a, return (ARCHIVE_OK); archive_string_init(&tempfile); - if (__archive_get_tempdir(&tempfile) != ARCHIVE_OK) { - ret = ARCHIVE_WARN; - goto cleanup; - } - archive_strcat(&tempfile, "tar.md.XXXXXX"); - tempfd = mkstemp(tempfile.s); + archive_strcpy(&tempfile, name); + archive_string_dirname(&tempfile); + archive_strcat(&tempfile, "/tar.XXXXXXXX"); + tempfd = __archive_mkstemp(tempfile.s); if (tempfd < 0) { archive_set_error(&a->archive, errno, "Could not open extended attribute file"); diff --git a/contrib/libarchive/libarchive/archive_read_disk_posix.c b/contrib/libarchive/libarchive/archive_read_disk_posix.c index 54a8e66188f8..7cd292f259ff 100644 --- a/contrib/libarchive/libarchive/archive_read_disk_posix.c +++ b/contrib/libarchive/libarchive/archive_read_disk_posix.c @@ -107,6 +107,8 @@ #define O_CLOEXEC 0 #endif +#define MAX_FILESYSTEM_ID 1000000 + #if defined(__hpux) && !defined(HAVE_DIRFD) #define dirfd(x) ((x)->__dd_fd) #define HAVE_DIRFD @@ -1412,8 +1414,12 @@ update_current_filesystem(struct archive_read_disk *a, int64_t dev) * This is the new filesystem which we have to generate a new ID for. */ fid = t->max_filesystem_id++; + if (fid > MAX_FILESYSTEM_ID) { + archive_set_error(&a->archive, ENOMEM, "Too many filesystems"); + return (ARCHIVE_FATAL); + } if (t->max_filesystem_id > t->allocated_filesystem) { - size_t s; + int s; void *p; s = t->max_filesystem_id * 2; @@ -1693,8 +1699,6 @@ setup_current_filesystem(struct archive_read_disk *a) #endif t->current_filesystem->noatime = 0; - /* Set maximum filename length. */ - t->current_filesystem->name_max = svfs.f_namemax; return (ARCHIVE_OK); } diff --git a/contrib/libarchive/libarchive/archive_read_support_filter_lz4.c b/contrib/libarchive/libarchive/archive_read_support_filter_lz4.c index 760e6d938d2a..144572ef2362 100644 --- a/contrib/libarchive/libarchive/archive_read_support_filter_lz4.c +++ b/contrib/libarchive/libarchive/archive_read_support_filter_lz4.c @@ -49,9 +49,12 @@ #include "archive_xxhash.h" #define LZ4_MAGICNUMBER 0x184d2204 -#define LZ4_SKIPPABLED 0x184d2a50 #define LZ4_LEGACY 0x184c2102 +// Note: LZ4 and zstd share the same skippable frame format with the same magic numbers. +#define LZ4_SKIPPABLE_START 0x184D2A50 +#define LZ4_SKIPPABLE_MASK 0xFFFFFFF0 + #if defined(HAVE_LIBLZ4) struct private_data { enum { SELECT_STREAM, @@ -141,19 +144,67 @@ lz4_reader_bid(struct archive_read_filter_bidder *self, { const unsigned char *buffer; ssize_t avail; - int bits_checked; - uint32_t number; + int bits_checked = 0; + ssize_t min_lz4_archive_size = 11; + + // LZ4 skippable frames contain a 4 byte magic number followed by + // a 4 byte frame data size, then that number of bytes of data. Regular + // frames contain a 4 byte magic number followed by a 2-14 byte frame + // header, some data, and a 3 byte end marker. + ssize_t min_lz4_frame_size = 8; + + ssize_t offset_in_buffer = 0; + ssize_t max_lookahead = 64 * 1024; - (void)self; /* UNUSED */ + (void)self; // UNUSED - /* Minimal lz4 archive is 11 bytes. */ - buffer = __archive_read_filter_ahead(filter, 11, &avail); + // Zstd and LZ4 skippable frame magic numbers are identical. To + // differentiate these two, we need to look for a non-skippable + // frame. + + // Minimal lz4 archive is 11 bytes. + buffer = __archive_read_filter_ahead(filter, min_lz4_archive_size, &avail); if (buffer == NULL) return (0); - /* First four bytes must be LZ4 magic numbers. */ - bits_checked = 0; - if ((number = archive_le32dec(buffer)) == LZ4_MAGICNUMBER) { + uint32_t magic_number = archive_le32dec(buffer); + + while ((magic_number & LZ4_SKIPPABLE_MASK) == LZ4_SKIPPABLE_START) { + + offset_in_buffer += 4; // Skip over the magic number + + // Ensure that we can read another 4 bytes. + if (offset_in_buffer + 4 > avail) { + buffer = __archive_read_filter_ahead(filter, offset_in_buffer + 4, &avail); + if (buffer == NULL) + return (0); + } + + uint32_t frame_data_size = archive_le32dec(buffer + offset_in_buffer); + + // Skip over the 4 frame data size bytes, plus the value stored there. + offset_in_buffer += 4 + frame_data_size; + + // There should be at least one more frame if this is LZ4 data. + if (offset_in_buffer + min_lz4_frame_size > avail) { // TODO: should this be >= ? + if (offset_in_buffer + min_lz4_frame_size > max_lookahead) + return (0); + + buffer = __archive_read_filter_ahead(filter, offset_in_buffer + min_lz4_frame_size, &avail); + if (buffer == NULL) + return (0); + } + + magic_number = archive_le32dec(buffer + offset_in_buffer); + } + + // We have skipped over any skippable frames. Either a regular LZ4 frame + // follows, or this isn't LZ4 data. + + bits_checked = offset_in_buffer; + buffer = buffer + offset_in_buffer; + + if (magic_number == LZ4_MAGICNUMBER) { unsigned char flag, BD; bits_checked += 32; @@ -175,11 +226,16 @@ lz4_reader_bid(struct archive_read_filter_bidder *self, if (BD & ~0x70) return (0); bits_checked += 8; - } else if (number == LZ4_LEGACY) { + + return (bits_checked); + } + + if (magic_number == LZ4_LEGACY) { bits_checked += 32; + return (bits_checked); } - - return (bits_checked); + + return (0); } #if !defined(HAVE_LIBLZ4) @@ -342,7 +398,7 @@ lz4_filter_read(struct archive_read_filter *self, const void **p) return lz4_filter_read_default_stream(self, p); else if (number == LZ4_LEGACY) return lz4_filter_read_legacy_stream(self, p); - else if ((number & ~0xF) == LZ4_SKIPPABLED) { + else if ((number & LZ4_SKIPPABLE_MASK) == LZ4_SKIPPABLE_START) { read_buf = __archive_read_filter_ahead( self->upstream, 4, NULL); if (read_buf == NULL) { diff --git a/contrib/libarchive/libarchive/archive_read_support_filter_zstd.c b/contrib/libarchive/libarchive/archive_read_support_filter_zstd.c index 9a1dd71abdf6..da7c540dbcd9 100644 --- a/contrib/libarchive/libarchive/archive_read_support_filter_zstd.c +++ b/contrib/libarchive/libarchive/archive_read_support_filter_zstd.c @@ -110,24 +110,67 @@ zstd_bidder_bid(struct archive_read_filter_bidder *self, { const unsigned char *buffer; ssize_t avail; - unsigned prefix; - /* Zstd frame magic values */ - unsigned zstd_magic = 0xFD2FB528U; - unsigned zstd_magic_skippable_start = 0x184D2A50U; - unsigned zstd_magic_skippable_mask = 0xFFFFFFF0; + // Zstandard skippable frames contain a 4 byte magic number followed by + // a 4 byte frame data size, then that number of bytes of data. Regular + // frames contain a 4 byte magic number followed by a 2-14 byte frame + // header, some data, and a 3 byte end marker. + ssize_t min_zstd_frame_size = 8; - (void) self; /* UNUSED */ + ssize_t offset_in_buffer = 0; + ssize_t max_lookahead = 64 * 1024; - buffer = __archive_read_filter_ahead(filter, 4, &avail); + // Zstd regular frame magic number. + uint32_t zstd_magic = 0xFD2FB528U; + + // Note: Zstd and LZ4 skippable frame magic numbers are identical. + // To differentiate these two, we need to look for a non-skippable + // frame. + uint32_t zstd_magic_skippable_start = 0x184D2A50; + uint32_t zstd_magic_skippable_mask = 0xFFFFFFF0; + + (void) self; // UNUSED + + buffer = __archive_read_filter_ahead(filter, min_zstd_frame_size, &avail); if (buffer == NULL) return (0); - prefix = archive_le32dec(buffer); - if (prefix == zstd_magic) - return (32); - if ((prefix & zstd_magic_skippable_mask) == zstd_magic_skippable_start) - return (32); + uint32_t magic_number = archive_le32dec(buffer); + + while ((magic_number & zstd_magic_skippable_mask) == zstd_magic_skippable_start) { + + offset_in_buffer += 4; // Skip over the magic number + + // Ensure that we can read another 4 bytes. + if (offset_in_buffer + 4 > avail) { + buffer = __archive_read_filter_ahead(filter, offset_in_buffer + 4, &avail); + if (buffer == NULL) + return (0); + } + + uint32_t frame_data_size = archive_le32dec(buffer + offset_in_buffer); + + // Skip over the 4 frame data size bytes, plus the value stored there. + offset_in_buffer += 4 + frame_data_size; + + // There should be at least one more frame if this is zstd data. + if (offset_in_buffer + min_zstd_frame_size > avail) { + if (offset_in_buffer + min_zstd_frame_size > max_lookahead) + return (0); + + buffer = __archive_read_filter_ahead(filter, offset_in_buffer + min_zstd_frame_size, &avail); + if (buffer == NULL) + return (0); + } + + magic_number = archive_le32dec(buffer + offset_in_buffer); + } + + // We have skipped over any skippable frames. Either a regular zstd frame + // follows, or this isn't zstd data. + + if (magic_number == zstd_magic) + return (offset_in_buffer + 4); return (0); } diff --git a/contrib/libarchive/libarchive/archive_read_support_format_7zip.c b/contrib/libarchive/libarchive/archive_read_support_format_7zip.c index 595462733104..330d5515dd50 100644 --- a/contrib/libarchive/libarchive/archive_read_support_format_7zip.c +++ b/contrib/libarchive/libarchive/archive_read_support_format_7zip.c @@ -744,6 +744,7 @@ find_elf_data_sec(struct archive_read *a) const char *h; char big_endian, format_64; ssize_t bytes, min_addr = SFX_MIN_ADDR; + ssize_t request; uint64_t e_shoff, strtab_offset, strtab_size; uint16_t e_shentsize, e_shnum, e_shstrndx; uint16_t (*dec16)(const void *); @@ -796,7 +797,12 @@ find_elf_data_sec(struct archive_read *a) if (__archive_read_seek(a, e_shoff, SEEK_SET) < 0) { break; } - h = __archive_read_ahead(a, (size_t)e_shnum * (size_t)e_shentsize, NULL); + if (format_64) { + request = (size_t)e_shnum * (size_t)e_shentsize + 0x28; + } else { + request = (size_t)e_shnum * (size_t)e_shentsize + 0x18; + } + h = __archive_read_ahead(a, request, &bytes); if (h == NULL) { break; } diff --git a/contrib/libarchive/libarchive/archive_read_support_format_lha.c b/contrib/libarchive/libarchive/archive_read_support_format_lha.c index 2a84ad9dd307..abf8b8799636 100644 --- a/contrib/libarchive/libarchive/archive_read_support_format_lha.c +++ b/contrib/libarchive/libarchive/archive_read_support_format_lha.c @@ -689,7 +689,7 @@ archive_read_format_lha_read_header(struct archive_read *a, * a pathname and a symlink has '\' character, a directory * separator in DOS/Windows. So we should convert it to '/'. */ - if (p[H_LEVEL_OFFSET] == 0) + if (lha->level == 0) lha_replace_path_separator(lha, entry); archive_entry_set_mode(entry, lha->mode); diff --git a/contrib/libarchive/libarchive/archive_read_support_format_tar.c b/contrib/libarchive/libarchive/archive_read_support_format_tar.c index eeb2c725f6eb..98f7d699570a 100644 --- a/contrib/libarchive/libarchive/archive_read_support_format_tar.c +++ b/contrib/libarchive/libarchive/archive_read_support_format_tar.c @@ -2311,6 +2311,7 @@ pax_attribute_read_number(struct archive_read *a, size_t value_length, int64_t * archive_string_init(&as); r = read_bytes_to_string(a, &as, value_length, &unconsumed); if (tar_flush_unconsumed(a, &unconsumed) != ARCHIVE_OK) { + *result = 0; return (ARCHIVE_FATAL); } if (r < ARCHIVE_OK) { diff --git a/contrib/libarchive/libarchive/archive_read_support_format_zip.c b/contrib/libarchive/libarchive/archive_read_support_format_zip.c index 9abd55709e3f..0c86ce935e26 100644 --- a/contrib/libarchive/libarchive/archive_read_support_format_zip.c +++ b/contrib/libarchive/libarchive/archive_read_support_format_zip.c @@ -78,6 +78,12 @@ #include "archive_crc32.h" #endif +/* length of local file header, not including filename and extra */ +#define ZIP_LOCHDR_LEN 30U + +/* maximum length of Mac metadata in MiB */ +#define ZIP_MAX_METADATA 10U + struct zip_entry { struct archive_rb_node node; struct zip_entry *next; @@ -933,7 +939,7 @@ zip_read_local_file_header(struct archive_read *a, struct archive_entry *entry, zip->init_default_conversion = 1; } - if ((p = __archive_read_ahead(a, 30, NULL)) == NULL) { + if ((p = __archive_read_ahead(a, ZIP_LOCHDR_LEN, NULL)) == NULL) { archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT, "Truncated ZIP file header"); return (ARCHIVE_FATAL); @@ -969,7 +975,7 @@ zip_read_local_file_header(struct archive_read *a, struct archive_entry *entry, filename_length = archive_le16dec(p + 26); extra_length = archive_le16dec(p + 28); - __archive_read_consume(a, 30); + __archive_read_consume(a, ZIP_LOCHDR_LEN); /* Read the filename. */ if ((h = __archive_read_ahead(a, filename_length, NULL)) == NULL) { @@ -3637,7 +3643,7 @@ read_eocd(struct zip *zip, const char *p, int64_t current_offset) { uint16_t disk_num; uint32_t cd_size, cd_offset; - + disk_num = archive_le16dec(p + 4); cd_size = archive_le32dec(p + 12); cd_offset = archive_le32dec(p + 16); @@ -4097,7 +4103,7 @@ zip_get_local_file_header_size(struct archive_read *a, size_t extra) const char *p; ssize_t filename_length, extra_length; - if ((p = __archive_read_ahead(a, extra + 30, NULL)) == NULL) { + if ((p = __archive_read_ahead(a, extra + ZIP_LOCHDR_LEN, NULL)) == NULL) { archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT, "Truncated ZIP file header"); return (ARCHIVE_WARN); @@ -4111,7 +4117,7 @@ zip_get_local_file_header_size(struct archive_read *a, size_t extra) filename_length = archive_le16dec(p + 26); extra_length = archive_le16dec(p + 28); - return (30 + filename_length + extra_length); + return (ZIP_LOCHDR_LEN + filename_length + extra_length); } static int @@ -4148,16 +4154,16 @@ zip_read_mac_metadata(struct archive_read *a, struct archive_entry *entry, return (ARCHIVE_WARN); } - if (rsrc->uncompressed_size > (4 * 1024 * 1024)) { + if (rsrc->uncompressed_size > ZIP_MAX_METADATA * 1048576U) { archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT, - "Mac metadata is too large: %jd > 4M bytes", - (intmax_t)rsrc->uncompressed_size); + "Mac metadata is too large: %jd > %u MiB", + (intmax_t)rsrc->uncompressed_size, ZIP_MAX_METADATA); return (ARCHIVE_WARN); } - if (rsrc->compressed_size > (4 * 1024 * 1024)) { + if (rsrc->compressed_size > ZIP_MAX_METADATA * 1048576U) { archive_set_error(&a->archive, ARCHIVE_ERRNO_FILE_FORMAT, - "Mac metadata is too large: %jd > 4M bytes", - (intmax_t)rsrc->compressed_size); + "Mac metadata is too large: %jd > %u MiB", + (intmax_t)rsrc->compressed_size, ZIP_MAX_METADATA); return (ARCHIVE_WARN); } diff --git a/contrib/libarchive/libarchive/archive_string.c b/contrib/libarchive/libarchive/archive_string.c index 3bb978335eb8..740308b6e4e3 100644 --- a/contrib/libarchive/libarchive/archive_string.c +++ b/contrib/libarchive/libarchive/archive_string.c @@ -2054,6 +2054,26 @@ archive_strncat_l(struct archive_string *as, const void *_p, size_t n, return (r); } +struct archive_string * +archive_string_dirname(struct archive_string *as) +{ + /* strip trailing separators */ + while (as->length > 1 && as->s[as->length - 1] == '/') + as->length--; + /* strip final component */ + while (as->length > 0 && as->s[as->length - 1] != '/') + as->length--; + /* empty path -> cwd */ + if (as->length == 0) + return (archive_strcat(as, ".")); + /* strip separator(s) */ + while (as->length > 1 && as->s[as->length - 1] == '/') + as->length--; + /* terminate */ + as->s[as->length] = '\0'; + return (as); +} + #if HAVE_ICONV /* diff --git a/contrib/libarchive/libarchive/archive_string.h b/contrib/libarchive/libarchive/archive_string.h index e8987867d3ce..d5f5c03aca30 100644 --- a/contrib/libarchive/libarchive/archive_string.h +++ b/contrib/libarchive/libarchive/archive_string.h @@ -192,6 +192,10 @@ void archive_string_vsprintf(struct archive_string *, const char *, void archive_string_sprintf(struct archive_string *, const char *, ...) __LA_PRINTF(2, 3); +/* Equivalent to dirname(3) */ +struct archive_string * +archive_string_dirname(struct archive_string *); + /* Translates from MBS to Unicode. */ /* Returns non-zero if conversion failed in any way. */ int archive_wstring_append_from_mbs(struct archive_wstring *dest, diff --git a/contrib/libarchive/libarchive/archive_write_disk_posix.c b/contrib/libarchive/libarchive/archive_write_disk_posix.c index aeb27e1270ad..d69f041dde7e 100644 --- a/contrib/libarchive/libarchive/archive_write_disk_posix.c +++ b/contrib/libarchive/libarchive/archive_write_disk_posix.c @@ -412,12 +412,14 @@ static ssize_t _archive_write_disk_data_block(struct archive *, const void *, static int la_mktemp(struct archive_write_disk *a) { + struct archive_string *tmp = &a->_tmpname_data; int oerrno, fd; mode_t mode; - archive_string_empty(&a->_tmpname_data); - archive_string_sprintf(&a->_tmpname_data, "%s.XXXXXX", a->name); - a->tmpname = a->_tmpname_data.s; + archive_strcpy(tmp, a->name); + archive_string_dirname(tmp); + archive_strcat(tmp, "/tar.XXXXXXXX"); + a->tmpname = tmp->s; fd = __archive_mkstemp(a->tmpname); if (fd == -1) @@ -4287,8 +4289,10 @@ create_tempdatafork(struct archive_write_disk *a, const char *pathname) int tmpfd; archive_string_init(&tmpdatafork); - archive_strcpy(&tmpdatafork, "tar.md.XXXXXX"); - tmpfd = mkstemp(tmpdatafork.s); + archive_strcpy(&tmpdatafork, pathname); + archive_string_dirname(&tmpdatafork); + archive_strcat(&tmpdatafork, "/tar.XXXXXXXX"); + tmpfd = __archive_mkstemp(tmpdatafork.s); if (tmpfd < 0) { archive_set_error(&a->archive, errno, "Failed to mkstemp"); @@ -4367,8 +4371,10 @@ set_mac_metadata(struct archive_write_disk *a, const char *pathname, * silly dance of writing the data to disk just so that * copyfile() can read it back in again. */ archive_string_init(&tmp); - archive_strcpy(&tmp, "tar.mmd.XXXXXX"); - fd = mkstemp(tmp.s); + archive_strcpy(&tmp, pathname); + archive_string_dirname(&tmp); + archive_strcat(&tmp, "/tar.XXXXXXXX"); + fd = __archive_mkstemp(tmp.s); if (fd < 0) { archive_set_error(&a->archive, errno, diff --git a/contrib/libarchive/libarchive/archive_write_open_filename.c b/contrib/libarchive/libarchive/archive_write_open_filename.c index 7d0f9bde1dbb..430de21fde14 100644 --- a/contrib/libarchive/libarchive/archive_write_open_filename.c +++ b/contrib/libarchive/libarchive/archive_write_open_filename.c @@ -191,6 +191,8 @@ file_open(struct archive *a, void *client_data) archive_set_error(a, errno, "Couldn't stat '%s'", mbs); else archive_set_error(a, errno, "Couldn't stat '%ls'", wcs); + close(mine->fd); + mine->fd = -1; return (ARCHIVE_FATAL); } diff --git a/contrib/libarchive/libarchive/module.modulemap b/contrib/libarchive/libarchive/module.modulemap new file mode 100644 index 000000000000..70f70fc3a1a2 --- /dev/null +++ b/contrib/libarchive/libarchive/module.modulemap @@ -0,0 +1,34 @@ +/* + * Clang Module Map for libarchive + * + * What this is: + * This file tells the Clang compiler how to treat libarchive as a "module" - + * a self-contained unit of code that can be imported all at once instead of + * including individual header files. Think of it like a package definition. + * + * How it works: + * - When you write `@import CArchive` (Objective-C) or `import CArchive` (Swift), + * the compiler uses this file to know which headers belong to libarchive + * - Instead of processing each #include separately, the compiler can load a + * pre-compiled version of the entire library, making builds faster + * - This also provides better dependency tracking and can catch issues like + * conflicting macro definitions between libraries + * + * When to update: + * Update this file whenever: + * - New public header files are added to libarchive's libarchive/ directory + * - Public headers are removed or renamed + * - The library's API structure changes significantly + * + * You typically don't need to update this for: + * - Internal implementation changes + * - Private/internal header modifications + * - Documentation updates + * + * NOTE: This only affects projects using Clang with modules enabled. Traditional + * #include-based builds will continue to work normally with or without this file. + */ +module CArchive { + header "archive.h" + header "archive_entry.h" +} diff --git a/contrib/libarchive/libarchive/test/test_archive_string.c b/contrib/libarchive/libarchive/test/test_archive_string.c index 30f7a800eae8..bf822c0d5e82 100644 --- a/contrib/libarchive/libarchive/test/test_archive_string.c +++ b/contrib/libarchive/libarchive/test/test_archive_string.c @@ -353,6 +353,43 @@ test_archive_string_sprintf(void) archive_string_free(&s); } +static void +test_archive_string_dirname(void) +{ + static struct pair { const char *str, *exp; } pairs[] = { + { "", "." }, + { "/", "/" }, + { "//", "/" }, + { "///", "/" }, + { "./", "." }, + { ".", "." }, + { "..", "." }, + { "foo", "." }, + { "foo/", "." }, + { "foo//", "." }, + { "foo/bar", "foo" }, + { "foo/bar/", "foo" }, + { "foo/bar//", "foo" }, + { "foo//bar", "foo" }, + { "foo//bar/", "foo" }, + { "foo//bar//", "foo" }, + { "/foo", "/" }, + { "//foo", "/" }, + { "//foo/", "/" }, + { "//foo//", "/" }, + { 0 }, + }; + struct pair *pair; + struct archive_string s; + + archive_string_init(&s); + for (pair = pairs; pair->str; pair++) { + archive_strcpy(&s, pair->str); + archive_string_dirname(&s); + assertEqualString(pair->exp, s.s); + } +} + DEFINE_TEST(test_archive_string) { test_archive_string_ensure(); @@ -364,6 +401,7 @@ DEFINE_TEST(test_archive_string) test_archive_string_concat(); test_archive_string_copy(); test_archive_string_sprintf(); + test_archive_string_dirname(); } static const char *strings[] = diff --git a/contrib/libarchive/libarchive/test/test_compat_lz4.c b/contrib/libarchive/libarchive/test/test_compat_lz4.c index 9e309a9fbd20..8ab9208b0918 100644 --- a/contrib/libarchive/libarchive/test/test_compat_lz4.c +++ b/contrib/libarchive/libarchive/test/test_compat_lz4.c @@ -98,6 +98,8 @@ DEFINE_TEST(test_compat_lz4) verify("test_compat_lz4_3.tar.lz4.uu", n); /* This sample has been compressed with -B4 option. */ verify("test_compat_lz4_B4.tar.lz4.uu", n2); + /* This sample has been compresed with -B4, and has two skippable frames at the start. */ + verify("test_compat_lz4_skippable_frames_B4.tar.lz4.uu", n2); /* This sample has been compressed with -B5 option. */ verify("test_compat_lz4_B5.tar.lz4.uu", n2); /* This sample has been compressed with -B6 option. */ diff --git a/contrib/libarchive/libarchive/test/test_compat_lz4_skippable_frames_B4.tar.lz4.uu b/contrib/libarchive/libarchive/test/test_compat_lz4_skippable_frames_B4.tar.lz4.uu new file mode 100644 index 000000000000..f45b1ac8f8dd --- /dev/null +++ b/contrib/libarchive/libarchive/test/test_compat_lz4_skippable_frames_B4.tar.lz4.uu @@ -0,0 +1,6739 @@ +begin 664 test_compat_lz4_skippable_frames_B4.tar.lz4.uu +M4"I-&`````!1*DT8"@`````!`@,$!08'"`D$(DT89$"GE1$``&]X9FEL90`! +M`$OA,#`P-C0T(``P,#`W-C4(`"(P,A``(C(P`0#_!R`Q,C,U,S4U,S4Q,B`P +M,3(P,C,`(#"7`$L"`@"O=7-T87(`,#!C=0<!"U)S=&%F9C,`#P(``@/(``#E +M`$\P,#`@)``"#P(`@/8T4D5!1$U%(&9O<B!L:6)A<F-H:79E(&)U;F1L92X* +M"E%U97-T:6]N<S\@($ES<W5E<S\*("`@*B!H='1P.B\O=W=W+C@`\0$N;W)G +M(&ES('1H92!H;VUE5P!P;VYG;VEN9S<`&"!D`/`,9&5V96QO<&UE;G0L(&EN +M8VQU9&EN9R!D;V-U%``087<`5"P@86YD.@!A;FMS('1O70`'JP!`;6%I;#@` +M8&QI<W1S+BP`\`$J(%1O(')E<&]R="!A;B!IMP!1+"!U<V4[``$/`+`@=')A +M8VME<B!A=#(`%"#/`/8#8V]D92YG;V]G;&4N8V]M+W`O:@`1+SH`(',O:0`` +M-0`!9P!1<W5B;6EG`'!E;FAA;F-ENP``I@`&.`"#+"!P;&5A<V4L```[`,`@ +M(&$@<'5L;"!R97%A`;$@=FEA($=I=$AU8L(``I``H7,Z+R]G:71H=6*,``92 +M``B5``!'`/`!<PH*5&AI<R!D:7-T<FEB=3H!`\,!`UD!$F64`6!F;VQL;W<N +M`;!C;VUP;VYE;G1S.I$`%RJ9`3`Z(&$.`$%R87)YP`$Q<F5AF0&`86YD('=R +M:70_`&!S=')E86T*``,R`A)S1@!!=&%R.OX!\`$G8G-D=&%R)R!P<F]G<F%M +M%@+P`F$@9G5L;"UF96%T=7)E9"`G(0``.``#`@!3<F5P;&%"`8!B=6EL="!O +M;HH``V,``"H`9BH@8W!I;V,```X`"V0`\`=D:69F97)E;G0@:6YT97)F86-E +M('1O/0`#`@"Q97-S96YT:6%L;'FK`"!S8:D",'5N8S<!4&%L:71Y+0!7*B!C +M871I`"MA=&@`8'-I;7!L96@"!;4`0'1O;VPS`0!```,"`')Z8V%T+"!B!P`2 +M>`<``$D!0'-U8V@G`%`J(&5X84D`0',Z(%,R`U1S;6%L;!4`!#X!`+X!\`!A +M="!Y;W4@;6%Y(&9I;F30`C%F=6PO`@9%`%$O;6EN:84!$6'C`5%A8W0@<V`` +MH2!D96UO;G-T<F'!`0`.`R=O9EX!`TD`,&-O;D,"\`(Z("!687)I;W5S(&ET +M96US(#,!`-<"0&UE(&(W`<!I<F0@<&%R=&EE<SO(``,"``/J`@!&``![```* +M`O$"875T:&]R<R!W:71H(&%N>2#R`@!3!%`N"@I4:)T!,'`M;`P$HB!D:7)E +M8W1O<GE!`"!I;O@`"+8"86EN9F]R;1H$$""X!@2]`O`)3D574R`M(&AI9VAL +M:6=H=',@;V8@<F5C!@)48VAA;F>@`K1#3U!924Y'("T@=U$!8F-A;B!D;Y\` +M,W1H:2D`\@))3E-404Q,("T@:6YS=&%L;'4```T`(7)U*@(#*0`#0`41+3P` +M`94```\!`4D!@&9I9W5R92`MS@`!#``"1`"U<V-R:7!T+"!S965G``!_!61D +M971A:6S#!&%#36%K94S4!#%T>'2(`#!P=71>`H$@(F-M86ME(B0#:60@=&]O +M;$T``E8!!NL#`2D!,2!I;DP!#VT!`3!A<F5.`A)DV@$T90HGL``C92>M``,D +M!`"3``!.`/4!+F%M+"!A8VQO8V%L+FTT+.$`0&4N86/_```"`!(M5``D=&^H +M``RB!+(L(&]N;'D@;F5E9'P`,6UA:?8!(V5R7`$%<``D:6YD`/(#+F@N:6X* +M"2T@=&5M<&QA=&5S9P`18C0"`68!$V6U`&`*"D=U:63S`"@@1%0&!-(!`G4` +M`;<!LG-Y<W1E;3H*("H@N`1U+C$@97AP;(,"`R\#`$(!`B$`!)H#`S,``(@$ +M#S0`"P`B``PU`"]A=#0`#"AA=#,`!@$&@"XS(&=I=F5SWP:`;W9E<G9I97?S +M`@"@``2[!1!A<04P=VAOD0(C*B#9!X5?<F5A9"XS+!```-$%'641`%%?9&ES +M:Q8``GX'"#X``QP``)D`$'9?`0*W`F%E9"!C86R)!Q!SU`9!;F-E<ZT"`),` +M`'4``!<"`/D$`7$`6"!!4$ESEP!S96YT<GDN,TT``O<#$B)K`P6K``$D`%`B +M('5T::0%62!C;&%S1``![P5&;F%L<YT`,',@<U0%86EN<VEG:!$&")D'$2=G +M`@0W`!(@;P``0`(`J``P;W!E*P4P;VXNJ``&>P$2+8($-7,N-:H(`J\``!D# +M`/(`@&UA=',@<W5P?P@$8P(%E@$`3```"@*0+C4L(&UT<F5E"0``;P!>=&%R +M+C54`0CQ!$%A8F]U4P4@<V5-`71P;W!U;&%R'P$$>P`(2PF!:&%R9"UT;RTP +M!@1;`0%'``!!`&%M;V1E<FZ/``#H`;`@=&%R('9A<FEA;D@)`)H%L6UA;G5A +M;"!P86=E.``A=F4L!`/Z`0">``%4!%<G9&]C)[T%L&EN"F$@;G5M8F5RE0(& +MD0<$.P'P`0H*66]U('-H;W5L9"!A;'.N"2%A9$P`,6-O<'8&0&-O;6V>"`"X +M!!,BO0(R+F@BJ0"`:&4*<V]U<F,O`!!DZP0"9P(#Z08#<@@"?P(T;6]RHP)2 +M<RX@(%"*";)L970@=7,*:VYO=Q`!`9D&\`!E<G)O<G,@;W(@;VUI<W.C!@%S +M!P`_`6`N"@I#=7)7"#!L>2R"```[!P$C"4!A=71ODP8`_P(0><$",&5C=)D# +M$635``,<`@5X"1!F+``!MP91*B!'3E5U`0(U`B8@*`0+`!H`06QO;F=0!F)N +M86UE<RP0```%"Q,@$0``8P!2<W!A<G-\`B%S*54`\`!3;VQA<FES(#D@97AT +M96ZG`0#9`0YD`#-!0TPS`&%/;&0@5C>+``-J`0`9`X$J(%!/4TE8("`-`5L` +M`A``,G!A>%H)`ED'`W@"!R$`P&]C=&5T+6]R:65N=!<$('!I?@G&*B!35E(T +M($%30TE)%``"4P`/,@`%84)I;F%R>2X`P"`H8FEG+65N9&EA;J(!8VQI='1L +M91$``OH`\0))4T\Y-C8P($-$+5)/32!I;;<"$2AX""!O<,L#P&%L(%)O8VMR +M:61G944`8DIO;&EE="D!`>\!`DD`-%I)4%8#!$``('5N3@DP<F5S)P<`@P<P +M9&5F?@81(F8)`Q@``*$$(VEE50$`PP$`H@&%0E-$("=A<B=2``$J`1$G_0,8 +M)ST!6C<M6FEP)@#836EC<F]S;V9T($-!0BP`,4Q(00H#.DQ:2#(`.E)!4A$` +M&%@1``%O"04@!@!X`PBO`F!H86YD;&6[`A!YMP,`M@0&10@P8F5F2@-2979A +M;'5""@`@``.9`P`?"#`J('7V!1!O<0(`"P4"0P(!"@`"7`FQ4E!-('=R87!P +M97(#`45G>FEP/@$Q:6]N%0!=8GII<#(6``1\`4TO3%I7'0"B;'IM82P@;'II +M<!,#+WAZ(P``&304``D(`0``"E5C<F5A=,\``74$#P8!`@*J`P._`P*\`@\? +M`Q@P(G)EH`U18W1E9")'`P)/`,0L('=H:6-H('=I;&R*``%6``7*`6$@97AC +M97!`!0"Y!01I`E$@=&AA=$,.,6ER95$``?,#`<H"("`H%@4!-`0`A`$#,P0` +M]`-@+"!E=&,I[PL"^@,`J0(&(@0!A@$"V@`/E@,%`<@#82)N97=C(IL#`3,` +M)W-HL``!$@`/1@-C!`4$`EL!`8D`#UD#``H6`S-7:&4#`@C1#@+F!6%R97-U +M;'0E`A%B:`4@=&6[#@%5!`\C`@$*"P,!@``/Z0)4,`I.;PX+`L\&`)T#!>D# +M`*4#(71EVPAA.@H*("H@+1`0:2`*<&AE879I;'G\"#9E86VU!0(1"W`N("!4 +M:&5R-!$S(&YOX@<`@@(#WP@`DP1!(&EN+;</@B!M;V1I9FECY0SP`&]R(')A +M;F1O;2!A8V-E<_0'`7D`!I<``+`04V5S:6=N)0P298@%`$`$`5X!.&YE=[4# +M`/`$`'L``W,$`'L``8<)`:,``DH,`$T1(FER@A$0:7D'$F$)`0(,`B$@8C<) +M`)4',6%B;``&`(P*`0P``2P+`M00`&@``CL`0F5A8V@]`2%V97,#$WE#`%!I +M;F1E<*H`)6YT(@$`&`D`#P\08T(%$F]L#08U"E0@5VEK:5(,`PP3,&AO=U$/ +M`;,#$&1."`/:``(J`2%/;C\(`/<,`F`&`P,!`_@``8@)8V%L=V%Y<W,(*F5D +MB@@"1P!P22=V92!A="T-`(P','1O("$0LFUI>F4@<W1A=&EC4@A!<&]L;#82 +M42X@($EF]0A!9&]N)QP3D&5X<&QI8VET;-D)0'9O:V6\$@'K``%_"@/.$2`@ +M*-(0)2!A^PH`J0`@(&&R`0$G$`(M``C-`!1OE0AP*2P@:70@=W``02!G9709 +M$P%="@"D!#<@26YN`#<L(&F>``%1`0.;`")E;LD!!RT``'P`"W$`*&1E$0`# +MQ@(1+/```H```(T.`)8!`!8!`$``,&%G8?,/`?$)D6-O<G)E<W!O;@X3"$D` +M#5H``GL#(FEES0\!;P,#YPH@9'49#0"?`Q!SA0$C;V:(`0".$A`M=@``,PP` +M]P@1:;0/`(0`<F5N=FER;VX/"Q%WD`,!H`(0;=@!$W):`P4P`@!;``)_`!%Y +M>P,1<#4`T6%T979E<B!B;&]C:W/P``#N!S$@:71D`3)9;W7G$P'$#4!B86-K +MKQ,Q9G)E/0\R<&%SL@`%5P`P(&)Y+@=Q="!A('1I;5<#<6]R(&UM87`I`0!> +M$P$/`P),%@`&"1!G5180:2(3`2(`!4H``.,3(6-EA0`A3VZ0`QMEPP`"Y`(R +M<')O.@$!A0%18W1L>2W,`))E9"!O=71P=73O`@!@!/$#;V)J96-T+7-T>6QE +M(&%P<')OR`,`^10"^@#0=&\@:&%V92!M=6QT:<,3!*D``@$$`+D(52!O<&5N +MG@`3(!40`&H0``H!$6DA"&-I=',@(D`\`!(BO001<S`.`F,%!E@`8&ET<V5L +M9E,!4')E860OY@!@=&5N('5S;P8`-PP!<@$$@A0"-`(`(0TB8V$%!#4@86Z( +M!`(C$U!L>2!F<EP%`)(20"UM96TT$R!B=?D4$B`D"`!E``!Z``#-`G!A('-O +M8VME9A<"/@-)=VES:+H$`28/`UD/`',"!8P``#\``^\-4"!E87-Y3@X`#!$1 +M(B$!`%H(("PB4`B@+"!C87!A8FEL:1(4!@,!!?$``O,/`;<$"/8%`9<!@"!I +M;F1I=FED;`X#VP@`A0``.A("0@``K`L`T0``-@$A=&^L#3!D8737```%#A8Z +M+@$"R`D`/0`28>P"`,D*`2L`,VEN("<!`(\",&%D9'0$`$P`"/<,`:D*`QX/ +M469I<G-TD@(`I@$187`2$6_Q#0#V`!8N=``#V0,"IP$`OP`"G`$!A0`&N`$` +M=@``PP``O`,299,``NX4`(46!J,!!H`%,7=A;G\%$G0=#P$V`@%;`P$:!!!T +MC@<A<VLL`P%K`P"?!)EN=F5N:65N8V7``0")```P%`*!$U)E<W!E8_P6`-`! +M`JH!`#H(,#H@(I,*`0X1"=H-$R*Y`@#>#B)A;N@"`*4'!C0*$"QC`$!D97-P +MH@``;`0!Y`,`<PIS('-A>7,N"B05$6:X#0]D&O______________________ +M____________________________________________________________ +M____________________________________________________________ +M____________________________________________________________ +M____________________________________________________________ +M_________________________________________UM09"!O<B!,$0``\2PB +M9&5F;&%T92(@8V]M<')E<W-E9"!E;G1R:65S*0H@("H@1TY5(&%N9"!"4T0@ +M)V%R)R!A<F-H:79E<QX`X2=M=')E92<@9F]R;6%T$P!X25-/.38V,!,`6C<M +M6FEP.0`V6$%2$0#E"E=H96X@8W)E871I;F<8`/$9+"!T:&4@<F5S=6QT(&-A +M;B!B92!F:6QT97)E9"!W:71H(&%N>2!O9B<`H69O;&QO=VEN9SJ&`(%U=65N +M8V]D90T`16=Z:7#A`#%I;VX5`%UB>FEP,A8`!`<!32],6E<=`+%L>FUA+"!L +M>FEP+!0!*7AZ(P#!"DYO=&5S(&%B;W5TE`!R;&EB<F%R>=$`\"YT96-T=7)E +M.@H*("H@5&AI<R!I<R!A(&AE879I;'D@<W1R96%M+6]R:65N=&5D('-Y<W1E +M;2X@(%1H97)E+`"`;F\@9&ER96-G`8`@<W5P<&]R=&8!\QD@:6XM<&QA8V4@ +M;6]D:69I8V%T:6]N(&]R(')A;F1O;2!A8V-E<W,N>0`&EP#@:7,@9&5S:6=N +M960@=&]>`61E>'1E;F1>`3AN97?@``#S`#(*("#.`!!V<@$`]`$2<Z,`\`(@ +M;VYL>2!R97%U:7)E;65N=+(`,G1H80D!`BL`("!BCP&0(')E861A8FQEH@!! +M=W)I=`P`$&$,`0($`0!H``([`$5E86-H;P``E@(3>4,`4&EN9&5PJ@`B;G1_ +M`$%R92!A!`"4=&EC;&5S(&]N@0$#KP+P`2!7:6MI(&5X<&QA:6YI;F?)`#!H +M;W?X``+U``<L``(J`2%/;JH`'"P#`0!S`3)M871P`$!L=V%Y1@$`W0'R`65D +M(&%U=&]M871I8V%L;'E'`+!))W9E(&%T=&5M<-<!X'1O(&UI;FEM:7IE('-T +M*P"P(&QI;FL@<&]L;'6X`>$N("!)9B!Y;W4@9&]N)^P!`+8`\0)I8VET;'D@ +M:6YV;VME(&$@<.L`@'5L87(@9F5A60)`("AS=2\!&7,<`A!AZ0`'+0`$YP,# +M(@("F0%P*2P@:70@=W``\``@9V5T('!U;&QE9"!I;BX^`"=);FX`-RP@:9X` +M`5$!`YL`(F5NR0$'+0``/@`+<0`H9&41``/&`A$L\``"@``B;F6.`@`6`0!` +M`&)A9V%I;G-'`J!C;W)R97-P;VYD)P0(20`-6@`">P,Q:65SPP`!;P.P86QS +M;R!R961U8V6;`C!E('.%`2-O9H@!`+,!$"UV`&%E9"!B:6X]`"`@:2P$@"!E +M;G9I<F]NUP(Q<R!W;@(!H`(0;=@!$W):`P4P`@!;``)_`!%Y>P,1<#4`T6%T +M979E<B!B;&]C:W/P`!!H5P4A:72A`$%9;W5R;P(0(#L"0&)A8VM``T!F<F5E +MH@(R<&%SL@`%5P!`(&)Y=%<"82!A('1I;5<#<6]R(&UM87#X`D%E;G1I#P,! +MJP4!40-`9VEV9>8!(71O(@`%2@!A="!O;F-EA0`A3VZ0`QMEPP`"Y`(R<')O +M.@$!A0%18W1L>2W,`))E9"!O=71P=73O`@!@!/$#;V)J96-T+7-T>6QE(&%P +M<')OR`,`H`4"^@#@=&\@:&%V92!M=6QT:7`E``.E`P(!!`!;!E4@;W!E;IX` +ML2`@8G-D=&%R('5SO`$`/06#;B!I=',@(D#E`!(BR`-&<VEO;HH``QP``"H` +M,&5L9E,!`'T$$"_F`&%T96X@=7-(`@1R`4!F=6YC@P,"-`(Q66]U=08`,@`U +M(&%NI``"A`50;'D@9G)<!1!N?P7P`6UE;6]R>2!B=69F97(@;W*Y`@!E``1R +M`85A('-O8VME=#X#27=I<VBZ!,!S;VUE('5T:6QI='D^``6,``$``O$%<F]V +M:61E(&5A<WDM=&\M=7-E("(A`?`"9FEL92PB(&5T8RP@8V%P86)!``'V`@)F +M!A%E50(!\0!A92!!4$ESMP0(]@4!EP&T(&EN9&EV:61U86S^!P"%``(5!@$! +M`0.L!0`V`2%T;W@',&1A=-<`5G5R8V4Z+@$!Q0<!D`(28>P"`*`'`2L`,VEN +M("<!`/@"(&%D_`(`W0`@82#9`02J`0#7!R%O=?<$469I<G-TD@(`I@$@82!# +M!1%O4`<`]@`6+G0``]D#`J<!`B<&`)P!`,(`![@!`'8``I0!`*$#`9,``D\' +M(FQYAP`"HP$&@`4Q=V%NB``0=#8$!44!`&``$&F%`@".!R%S:RP#`6L#`)\$ +MF6YV96YI96YC9<`!`(D`,&UA:WD`D&ES(&5S<&5C:6X$`=`!`JH!`#H(\P,Z +M(")P87@@:6YT97)C:&%N9V5K!A,BN0(@;&P\`0+H`@"E!P`X`0+!!1`L8P!` +M9&5S<.<!`&P$`>0#\`)N86UE('-A>7,N"E)%041-15``!^@&X2!B=6YD;&4N +M"@I1=65S^@*@/R`@27-S=65S/U(`URH@:'1T<#HO+W=W=RX@!S!O<F>3``!( +M`1!HN`*#9F]R(&]N9V]8!Q@@9`!P9&5V96QO<#P%<2P@:6YC;'6]!4!D;V-U +M%``!K`@!3@D`<0``.@`A;FM=`0!=``9S`%`@;6%I;`<"0FQI<W2@`S`J(%29 +M`0$&"4!A;B!IMP`0+"$$`?P``0\`D2!T<F%C:V5R()L*)"`@SP``&0KF+F=O +M;V=L92YC;VTO<"]J`!$O.@`@<R]I``"3``%G`%%S=6)M:6<`8F5N:&%N8^(( +M`:8&$V*Z`H,L('!L96%S92P``#L```0#`$L'`1<)X65S="!V:6$@1VET2'5B +M<`4"D`"A<SHO+V=I=&AU8HP`!E(`")4``$<`,7,*"L@&<61I<W1R:6(N"`/# +M`0-9`0"7`A!HCP$`U`,`+@$`(P=@;VYE;G1S%@LG("J9`3`Z(&$.``)0`Q)O +M?08`,P`$)P,`#``"CP4`"@`#Y0`!F@40*K$#$3IJ`!(GEP40)Z($0&=R86T6 +M`G-A(&9U;&PME@AR9"`G=&%R)P\!`0(`(7)EK0H`_0%0(&)U:6R!!@"*``-C +M```J`&8J(&-P:6]C```.``MD`"!D:6L%`6@*`#`#0V9A8V5J`P,"``#+#")N +M=&@#`$P"$',-`P26`Q1A9P57*B!C871I`"MA=&@`,'-I;:$&"+4`0'1O;VPS +M`0"J``,"`')Z8V%T+"!B!P`2>`<``$D!`)()`"<`4"H@97AA20!`<SH@4S(# +M5'-M86QL%0`$/@$`4@,A870<""!M8>8$(&YDT`(Q9G5L+P(&10`0+T,*`84! +M$6&>"E%A8W0@<V``DB!D96UO;G-T<DH-`"D&)V]F7@$#20`P8V]N0P+P`CH@ +M(%9A<FEO=7,@:71E;7,@,P$`?0-`;64@8C<!,FER9,\),&5S.\@``P(``^H" +M`$8``'L``%\!=F%U=&AO<G.7#0'R`@)-!Q`*B`90=&]P+6P,!`/%#``P!P%! +M`!!IY`8)M@(B:6[6!`"D"@#K!02]`O`"3D574R`M(&AI9VAL:6=H='-<!C!R +M96,&`@(Q!0.@`I)#3U!924Y'("T,!0!-"V)C86X@9&^?``"'!0#.`,`J($E. +M4U1!3$P@+2!D"C)A;&QU```-`")R=0P(`BD``T`%$2T\``"%#@'C!@%)`85F +M:6=U<F4@+0P``D0`M7-C<FEP="P@<V5E9P``*`5D9&5T86ELPP1A0TUA:V5, +MU`0Q='ATB``B<'76#2`B8S0&$2(D`P`X#"EO;$T``E8!!NL#`2D!`!8)`(X! +M#VT!`0"B!A!UWP\!V@$T90HGL``C92>M``,D!`"3``!.`/``+F%M+"!A8VQO +M8V%L+FTT"0T#[0`P+F%C%P$``@`0+:("`)\`!*@``-D."*($$BP:#@#7"P!9 +M"Q!YR@4!]@$C97*N`05P`"1I;F0`@2YH+FEN"@DM]`<`H!`2<V<`$6(T`@*% +M``.U`&`*"D=U:63S`"@@1%0&!-(!`G4``;<!`E,/$#H:"0*X!"$N,<$,`&$, +M`3<!`R\#``L``B$`!)H#`S,``(@$#S0`"P`B``PU`"]A=#0`#"AA=#,`!@$& +M(2XSM@L0<V4*@&]V97)V:65W\P(`H``%P`L`<050=VAO;&6D``-$!81?<F5A +M9"XS++0*$5_X"`T1`%%?9&ES:Q8``GX'"#X``QP``)D``7L*`K<"$F6@#``2 +M!D!S97%UZ@@0<PL%`3X!`'4``!<"`/D$`7$``7$*")<``#P),WDN,TT``.\$ +M,F4@(FL#!:L``20`%"(+"UD@8VQA<T0``1\)1FYA;'.=`!)S/@MA:6YS:6=H +M$08(F0<1)V<"!#<``&@1,'5C=+(#`*@`,&]P92L%`#0,"1X'$BV"!#5S+C6J +M"`*O```9`P#R`#5M871I#P1C`@66`0"P```*`D$N-2P@(1,`"0``;P!>=&%R +M+C54`0CQ!`4^$A%S8P0Q<&]PY0\#G`$$>P`(2PE`:&%R9!8,`3`&!%L!`4<` +M`(X!86UO9&5R;H\``.@!`+P'<"!V87)I86Y("0":!3!M86[X"T%P86=E.``` +M,0XD<F6F``">``'?`5<G9&]C)[T%D&EN"F$@;G5M8O(,%V:1!P0[`<<*"EEO +M=2!S:&]U;&2D"P`H`3%C;W!V!D!C;VUMG@@`N`03(@4.,BYH(JD`,FAE"E\, +M$""P"0#Z```4``3I!@-R"`)_`C1M;W*C`E)S+B`@4(H)LVQE="!U<PIK;F]W +ME1,`,!1@97)R;W)S?1)`;VUI<S`.`I4.`#\!P2X*"D-U<G)E;G1L>=H+`#L' +M`2,)"=H1`,$",&5C=)D#$61A#0,<`@2#%"`@9@82`;<&`D$5!JH+)B`H!`L` +M6Q4@;&\O`#!I;&6M"R)S+!````4+$R`1``!C`%)S<&%R<WP"`Y85GU-O;&%R +M:7,@.0X,`0AD`#-!0TPS`&%/;&0@5C<``@-J`0`9`[$J(%!/4TE8('5S=+`1 +M!!``#XH,`P$Y%0(Q`%9O8W1E=*\4`&`"`1X`H5-64C0@05-#24ET`@$4``\R +M``L00FT1$7DN`+$@*&)I9RUE;F1I8=018VQI='1L91$``I`6!%\6D4-$+5)/ +M32!I;;<"$"@X#C`@;W#+`\!A;"!2;V-K<FED9V7G`6)*;VQI970I`0'O`0)) +M`#1:25!U!`1``"!U;C$+`P87/V]R(!X70`\+%P#036EC<F]S;V9T($-!0N<" +M!$H7,4Q(00H#-4Q:2*H``5`!&%(]%P"T`0I.%P#5`P4@!@#U$@BO`@!V$@`B +M%0`+`P-,!@9%"#!B969*`U)E=F%L=4(*`*X#`R\"`!\(!ED7$62V`@)_```5 +M!0/[";%24$T@=W)A<'!E<JL`#WL75`":`#%L>C0."P#``0#E%P$A"00(`0`` +M"@*<$`5+`0!U!`\&`0("@P$#OP,"O`(/'P,8,")R9:`-`!`6$2)'`P)/`,(L +M('=H:6-H('=I;&SK&`!P"``9!`-?`4!S(&5X+10``@(`N04$B1$""Q<#6A<! +M40`%Z1(P<R`H4PH!-`0`A`$#,P0`]`-@+"!E=&,I[PL"^@,`;`0`;0`"C0`! +MFP$"V@`/R`,*82)N97=C(IL#`3,`)W-HL``!$@`/1@-C!`4$!\X`#UD#``H6 +M`P]D&O______________________________________________________ +M____________________________________________________________ +M____________________________________________________________ +M____________________________________________________________ +M____________________________________________________________ +M___________B4&5T86EL6A$``/4><R!T:&4@(G-T<G5C="!A<F-H:79E7V5N +M=')Y(B!U=&EL:71Y(&-L87-S"B`J(`#S&VEN=&5R;F%L<RXS('!R;W9I9&5S +M('-O;64@:6YS:6=H="!I;G1O(&QI8E(`4"=S"B`@%0`!-P`2(&\`\`-U<F4@ +M86YD(&]P97)A=&EO;BYD``8U`/($+69O<FUA=',N-2!D;V-U;65N=*\`4V9I +M;&4@'0#1('-U<'!O<G1E9"!B><T`<&QI8G)A<GE,`-!C<&EO+C4L(&UT<F5E +M"0``;P!4=&%R+C6W`,(@9&5T86EL960@:6Y2`)!I;VX@86)O=71-`"!S9;@` +M='!O<'5L87+_``1[`/,)+"!I;F-L=61I;F<@:&%R9"UT;RUF:6YD5``2<T<` +M`$$`86UO9&5R;H\``?(`\0YT87(@=F%R:6%N=',N"E1H92!M86YU86P@<&%G +M93@`9'9E(&%R9:8``)X``(\`]!H@)V1O8R<@9&ER96-T;W)Y(&EN"F$@;G5M +M8F5R(&]F(&1I9F9E<F5N=*,`\0@N"@I9;W4@<VAO=6QD(&%L<V\@<F5A9$P` +MLF-O<&EO=7,@8V]M6P%#:6X@(@(",BYH(JD`@&AE"G-O=7)C+P`19'4!`!0` +M82!S86UP;)\`4&=R86US;P!4(&UO<F7[`/(&+B`@4&QE87-E(&QE="!U<PIK +M;F]W$`'P#B!A;GD@97)R;W)S(&]R(&]M:7-S:6]N<R!Y;W4@/P%@+@H*0W5R +MQ@`Q;'DL;@`#T@'@(&%U=&]M871I8V%L;'EK`$%E8W1SJ```U0`#'`)0;VQL +M;W>3`1!F+`"A<SH*("`J($=.574!`E(")B`HN0$`&@!!;&]N9U4"8FYA;65S +M+!``4VQI;FL@$0``-P)2<W!A<G-\`B%S*54`\`!3;VQA<FES(#D@97AT96ZG +M`0]D``,S04-,,P!A3VQD(%8WBP`#:@$`&0/1*B!03U-)6"!U<W1A<EL``A`` +M,G!A>#0#46-H86YG?@$W;6%T(0"P;V-T970M;W)I96X!`P!@`@$>`*%35E(T +M($%30TE)=`(!%``"4P`/,@`%84)I;F%R>2X`P"`H8FEG+65N9&EA;J(!8VQI +M='1L91$``OH`\0))4T\Y-C8P($-$+5)/32!I;;<"@"AW:71H(&]PRP/`86P@ +M4F]C:W)I9&=E10!B2F]L:65T*0$![P$"20`T6DE05@,$0`#`=6YC;VUP<F5S +M<V5D.@"0(F1E9FQA=&4BJ0($&```H00C:655`0##`0"B`85"4T0@)V%R)U(` +M`?@`$2?]`Q`GHP($/0%:-RU::7`F`-A-:6-R;W-O9G0@0T%"+``Q3$A!8@(Z +M3%I(,@`Z4D%2$0`86!$``=4#!;@"`'@#"*\"8&AA;F1L9;L"$'FW`P"#!0:X +M`C!B969*`W!E=F%L=6%TR@(`(``#F0,"SP)`=75E;I`#$62V`@)#`@#``B%S +M((,!HE)032!W<F%P<&5.`D5G>FEP/@$Q:6]N&`%=8GII<#(6``1\`4TO3%I7 +M'0"B;'IM82P@;'II<!,#+WAZ(P``&304``D(`95C86X@8W)E873/``%U!`\& +M`0("KP$#OP,"O`(/'P,8P2)R97-T<FEC=&5D(D<#`D\`Q"P@=VAI8V@@=VEL +M;(H``58`!<H!82!E>&-E<$`%`+D%!&D"L"!T:&%T(')E<75IE@4G87C*`E(@ +M*&9O<C0$`(0!`S,$`/0#<2P@971C*2YO`0#Z`P"I`@8B!`$7``+:``^6`P4! +MR`-A(FYE=V,BFP,!,P`G<VBP``$2``]&`V,$!00"6P$!B0`/60,`"A8#,U=H +M90,"`-@"`]0"$G/F!6%R97-U;'0E`A%B:`52=&5R9632`@\C`@$*"P,!@``/ +MZ0)40@I.;W2G!P(F"`#I"`!S"`)&`B%T9=L(\`@Z"@H@*B!4:&ES(&ES(&$@ +M:&5A=FEL>?P(-F5A;;4%X'-Y<W1E;2X@(%1H97)E+``C;F_B!P""`@/?"`"3 +M!/("(&EN+7!L86-E(&UO9&EF:6.M"/,";W(@<F%N9&]M(&%C8V5S<RYY``:` +M!/(":7,@9&5S:6=N960@=&\@8F6^`@!`!`$P!#AN97>U`P#P!`![``-S!`![ +M``&'"0&C`%0@;VYL>0H#`#@(`+(``1X#`*8$`@P"(2!B-PEQ<F5A9&%B;``& +M07=R:70,`!!A#`$"!`$`:``".P!"96%C:#T!(79E<P,3>4,`4&EN9&5PJ@`E +M;G0B`0`8"5!A<G1I8_`$)&]N(@@$K@#P`%=I:VD@97AP;&%I;FEN9\D`,&AO +M=_@``J8'`*T!`RP``BH!(4]N%`D<+`,!`_@``8@)4&%L=V%Y1@$`W0$J962* +M"`)'`+!))W9E(&%T=&5M<(P'X'1O(&UI;FEM:7IE('-TM0@"4@A0<&]L;'4B +M!U$N("!)9O4(0&1O;B?6!P&V`%!I8VET;-D)@79O:V4@82!PZP`!?PHQ9F5A +M-`LP*'-U+P$%^PH`J0`@(&'I``<M``0M!P#/"A1O^0AP*2P@:70@=W``@B!G +M970@<'5L^PH`I`0W($EN;@`W+"!IG@`(FP`B96[)`0<M``!\``MQ`"AD91$` +M`\8"$2SP``*``")N98X"`!8!`$``8F%G86EN<T<"D6-O<G)E<W!O;EP+"$D` +M#5H``F0',6EE<\,``6\#`^<*,61U8[D%,&4@<X4!(V]FB`$`/0H0+78``#,, +M`/<($6F'!@"$`'!E;G9I<F]NUP(Q<R!WD`,!H`(0;=@!$W):`P4P`@!;``)_ +M`!%Y>P,1<#4`T6%T979E<B!B;&]C:W/P``#N!S$@:72A`$%9;W5R;P(0(,4* +M0&)A8VM``T!F<F5EH@(P<&%S30,'5P`P(&)Y+@=Q="!A('1I;5<#`&L+,6UA +M</@",&5N=)$&`]`"`5$#0&=I=F7F`2%T;R(`!:$`870@;VYC984`(4]ND`,; +M9<,``N0",G!R;SH!`84!46-T;'DMS```C@E2=71P=73O`@!@!/$#;V)J96-T *** 6665 LINES SKIPPED ***
