MFV r310622:
Sync libarchive with vendor. Vendor bugfixes (relevant to FreeBSD): PR 846: Spelling fixes PR 850: Fix issues with reading certain jar files OSS-Fuzz 286: Bugfix in archive_strncat_l()
This commit is contained in:
commit
7105995c64
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=310623
@ -38,7 +38,7 @@ static const int root_gids[] = { 0, 1 };
|
|||||||
* its primary group membership depends on how the user set up
|
* its primary group membership depends on how the user set up
|
||||||
* their /etc/passwd. Likely values are 513 (None), 545 (Users),
|
* their /etc/passwd. Likely values are 513 (None), 545 (Users),
|
||||||
* or 544 (Administrators). Just check for one of those...
|
* or 544 (Administrators). Just check for one of those...
|
||||||
* TODO: Handle non-English localizations...e.g. French 'Administrateur'
|
* TODO: Handle non-English localizations... e.g. French 'Administrateur'
|
||||||
* Use CreateWellKnownSID() and LookupAccountName()?
|
* Use CreateWellKnownSID() and LookupAccountName()?
|
||||||
*/
|
*/
|
||||||
#define ROOT "Administrator"
|
#define ROOT "Administrator"
|
||||||
|
@ -764,7 +764,7 @@ archive_read_header_position(struct archive *_a)
|
|||||||
* we cannot say whether there are encrypted entries, then
|
* we cannot say whether there are encrypted entries, then
|
||||||
* ARCHIVE_READ_FORMAT_ENCRYPTION_DONT_KNOW is returned.
|
* ARCHIVE_READ_FORMAT_ENCRYPTION_DONT_KNOW is returned.
|
||||||
* In general, this function will return values below zero when the
|
* In general, this function will return values below zero when the
|
||||||
* reader is uncertain or totally uncapable of encryption support.
|
* reader is uncertain or totally incapable of encryption support.
|
||||||
* When this function returns 0 you can be sure that the reader
|
* When this function returns 0 you can be sure that the reader
|
||||||
* supports encryption detection but no encrypted entries have
|
* supports encryption detection but no encrypted entries have
|
||||||
* been found yet.
|
* been found yet.
|
||||||
|
@ -1026,7 +1026,7 @@ next_entry(struct archive_read_disk *a, struct tree *t,
|
|||||||
|
|
||||||
/* Save the times to be restored. This must be in before
|
/* Save the times to be restored. This must be in before
|
||||||
* calling archive_read_disk_descend() or any chance of it,
|
* calling archive_read_disk_descend() or any chance of it,
|
||||||
* especially, invokng a callback. */
|
* especially, invoking a callback. */
|
||||||
t->restore_time.mtime = archive_entry_mtime(entry);
|
t->restore_time.mtime = archive_entry_mtime(entry);
|
||||||
t->restore_time.mtime_nsec = archive_entry_mtime_nsec(entry);
|
t->restore_time.mtime_nsec = archive_entry_mtime_nsec(entry);
|
||||||
t->restore_time.atime = archive_entry_atime(entry);
|
t->restore_time.atime = archive_entry_atime(entry);
|
||||||
|
@ -293,7 +293,7 @@ lzma_bidder_bid(struct archive_read_filter_bidder *self,
|
|||||||
/* Second through fifth bytes are dictionary size, stored in
|
/* Second through fifth bytes are dictionary size, stored in
|
||||||
* little-endian order. The minimum dictionary size is
|
* little-endian order. The minimum dictionary size is
|
||||||
* 1 << 12(4KiB) which the lzma of LZMA SDK uses with option
|
* 1 << 12(4KiB) which the lzma of LZMA SDK uses with option
|
||||||
* -d12 and the maxinam dictionary size is 1 << 27(128MiB)
|
* -d12 and the maximum dictionary size is 1 << 27(128MiB)
|
||||||
* which the one uses with option -d27.
|
* which the one uses with option -d27.
|
||||||
* NOTE: A comment of LZMA SDK source code says this dictionary
|
* NOTE: A comment of LZMA SDK source code says this dictionary
|
||||||
* range is from 1 << 12 to 1 << 30. */
|
* range is from 1 << 12 to 1 << 30. */
|
||||||
@ -584,9 +584,7 @@ lzip_init(struct archive_read_filter *self)
|
|||||||
return (ARCHIVE_FATAL);
|
return (ARCHIVE_FATAL);
|
||||||
}
|
}
|
||||||
ret = lzma_raw_decoder(&(state->stream), filters);
|
ret = lzma_raw_decoder(&(state->stream), filters);
|
||||||
#if LZMA_VERSION < 50010000
|
|
||||||
free(filters[0].options);
|
free(filters[0].options);
|
||||||
#endif
|
|
||||||
if (ret != LZMA_OK) {
|
if (ret != LZMA_OK) {
|
||||||
set_error(self, ret);
|
set_error(self, ret);
|
||||||
return (ARCHIVE_FATAL);
|
return (ARCHIVE_FATAL);
|
||||||
|
@ -263,22 +263,22 @@ struct _7zip {
|
|||||||
/*
|
/*
|
||||||
* Decompressor controllers.
|
* Decompressor controllers.
|
||||||
*/
|
*/
|
||||||
/* Decording LZMA1 and LZMA2 data. */
|
/* Decoding LZMA1 and LZMA2 data. */
|
||||||
#ifdef HAVE_LZMA_H
|
#ifdef HAVE_LZMA_H
|
||||||
lzma_stream lzstream;
|
lzma_stream lzstream;
|
||||||
int lzstream_valid;
|
int lzstream_valid;
|
||||||
#endif
|
#endif
|
||||||
/* Decording bzip2 data. */
|
/* Decoding bzip2 data. */
|
||||||
#if defined(HAVE_BZLIB_H) && defined(BZ_CONFIG_ERROR)
|
#if defined(HAVE_BZLIB_H) && defined(BZ_CONFIG_ERROR)
|
||||||
bz_stream bzstream;
|
bz_stream bzstream;
|
||||||
int bzstream_valid;
|
int bzstream_valid;
|
||||||
#endif
|
#endif
|
||||||
/* Decording deflate data. */
|
/* Decoding deflate data. */
|
||||||
#ifdef HAVE_ZLIB_H
|
#ifdef HAVE_ZLIB_H
|
||||||
z_stream stream;
|
z_stream stream;
|
||||||
int stream_valid;
|
int stream_valid;
|
||||||
#endif
|
#endif
|
||||||
/* Decording PPMd data. */
|
/* Decoding PPMd data. */
|
||||||
int ppmd7_stat;
|
int ppmd7_stat;
|
||||||
CPpmd7 ppmd7_context;
|
CPpmd7 ppmd7_context;
|
||||||
CPpmd7z_RangeDec range_dec;
|
CPpmd7z_RangeDec range_dec;
|
||||||
@ -1056,10 +1056,7 @@ init_decompression(struct archive_read *a, struct _7zip *zip,
|
|||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
lzma_options_delta delta_opt;
|
lzma_options_delta delta_opt;
|
||||||
lzma_filter filters[LZMA_FILTERS_MAX];
|
lzma_filter filters[LZMA_FILTERS_MAX], *ff;
|
||||||
#if LZMA_VERSION < 50010000
|
|
||||||
lzma_filter *ff;
|
|
||||||
#endif
|
|
||||||
int fi = 0;
|
int fi = 0;
|
||||||
|
|
||||||
if (zip->lzstream_valid) {
|
if (zip->lzstream_valid) {
|
||||||
@ -1144,9 +1141,7 @@ init_decompression(struct archive_read *a, struct _7zip *zip,
|
|||||||
else
|
else
|
||||||
filters[fi].id = LZMA_FILTER_LZMA1;
|
filters[fi].id = LZMA_FILTER_LZMA1;
|
||||||
filters[fi].options = NULL;
|
filters[fi].options = NULL;
|
||||||
#if LZMA_VERSION < 50010000
|
|
||||||
ff = &filters[fi];
|
ff = &filters[fi];
|
||||||
#endif
|
|
||||||
r = lzma_properties_decode(&filters[fi], NULL,
|
r = lzma_properties_decode(&filters[fi], NULL,
|
||||||
coder1->properties, (size_t)coder1->propertiesSize);
|
coder1->properties, (size_t)coder1->propertiesSize);
|
||||||
if (r != LZMA_OK) {
|
if (r != LZMA_OK) {
|
||||||
@ -1158,9 +1153,7 @@ init_decompression(struct archive_read *a, struct _7zip *zip,
|
|||||||
filters[fi].id = LZMA_VLI_UNKNOWN;
|
filters[fi].id = LZMA_VLI_UNKNOWN;
|
||||||
filters[fi].options = NULL;
|
filters[fi].options = NULL;
|
||||||
r = lzma_raw_decoder(&(zip->lzstream), filters);
|
r = lzma_raw_decoder(&(zip->lzstream), filters);
|
||||||
#if LZMA_VERSION < 50010000
|
|
||||||
free(ff->options);
|
free(ff->options);
|
||||||
#endif
|
|
||||||
if (r != LZMA_OK) {
|
if (r != LZMA_OK) {
|
||||||
set_error(a, r);
|
set_error(a, r);
|
||||||
return (ARCHIVE_FAILED);
|
return (ARCHIVE_FAILED);
|
||||||
|
@ -326,7 +326,7 @@ archive_read_format_cpio_options(struct archive_read *a,
|
|||||||
|
|
||||||
cpio = (struct cpio *)(a->format->data);
|
cpio = (struct cpio *)(a->format->data);
|
||||||
if (strcmp(key, "compat-2x") == 0) {
|
if (strcmp(key, "compat-2x") == 0) {
|
||||||
/* Handle filnames as libarchive 2.x */
|
/* Handle filenames as libarchive 2.x */
|
||||||
cpio->init_default_conversion = (val != NULL)?1:0;
|
cpio->init_default_conversion = (val != NULL)?1:0;
|
||||||
return (ARCHIVE_OK);
|
return (ARCHIVE_OK);
|
||||||
} else if (strcmp(key, "hdrcharset") == 0) {
|
} else if (strcmp(key, "hdrcharset") == 0) {
|
||||||
|
@ -864,29 +864,33 @@ zip_read_local_file_header(struct archive_read *a, struct archive_entry *entry,
|
|||||||
zip_entry->mode |= AE_IFREG;
|
zip_entry->mode |= AE_IFREG;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((zip_entry->mode & AE_IFMT) == 0) {
|
/* If the mode is totally empty, set some sane default. */
|
||||||
/* Especially in streaming mode, we can end up
|
if (zip_entry->mode == 0) {
|
||||||
here without having seen proper mode information.
|
zip_entry->mode |= 0664;
|
||||||
Guess from the filename. */
|
}
|
||||||
|
|
||||||
|
/* Make sure that entries with a trailing '/' are marked as directories
|
||||||
|
* even if the External File Attributes contains bogus values. If this
|
||||||
|
* is not a directory and there is no type, assume regularfile. */
|
||||||
|
if ((zip_entry->mode & AE_IFMT) != AE_IFDIR) {
|
||||||
|
int has_slash;
|
||||||
|
|
||||||
wp = archive_entry_pathname_w(entry);
|
wp = archive_entry_pathname_w(entry);
|
||||||
if (wp != NULL) {
|
if (wp != NULL) {
|
||||||
len = wcslen(wp);
|
len = wcslen(wp);
|
||||||
if (len > 0 && wp[len - 1] == L'/')
|
has_slash = len > 0 && wp[len - 1] == L'/';
|
||||||
zip_entry->mode |= AE_IFDIR;
|
|
||||||
else
|
|
||||||
zip_entry->mode |= AE_IFREG;
|
|
||||||
} else {
|
} else {
|
||||||
cp = archive_entry_pathname(entry);
|
cp = archive_entry_pathname(entry);
|
||||||
len = (cp != NULL)?strlen(cp):0;
|
len = (cp != NULL)?strlen(cp):0;
|
||||||
if (len > 0 && cp[len - 1] == '/')
|
has_slash = len > 0 && cp[len - 1] == '/';
|
||||||
zip_entry->mode |= AE_IFDIR;
|
|
||||||
else
|
|
||||||
zip_entry->mode |= AE_IFREG;
|
|
||||||
}
|
}
|
||||||
if (zip_entry->mode == AE_IFDIR) {
|
/* Correct file type as needed. */
|
||||||
zip_entry->mode |= 0775;
|
if (has_slash) {
|
||||||
} else if (zip_entry->mode == AE_IFREG) {
|
zip_entry->mode &= ~AE_IFMT;
|
||||||
zip_entry->mode |= 0664;
|
zip_entry->mode |= AE_IFDIR;
|
||||||
|
zip_entry->mode |= 0111;
|
||||||
|
} else if ((zip_entry->mode & AE_IFMT) == 0) {
|
||||||
|
zip_entry->mode |= AE_IFREG;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1827,7 +1827,7 @@ archive_string_conversion_set_opt(struct archive_string_conv *sc, int opt)
|
|||||||
* A filename in UTF-8 was made with libarchive 2.x in a wrong
|
* A filename in UTF-8 was made with libarchive 2.x in a wrong
|
||||||
* assumption that wchar_t was Unicode.
|
* assumption that wchar_t was Unicode.
|
||||||
* This option enables simulating the assumption in order to read
|
* This option enables simulating the assumption in order to read
|
||||||
* that filname correctly.
|
* that filename correctly.
|
||||||
*/
|
*/
|
||||||
case SCONV_SET_OPT_UTF8_LIBARCHIVE2X:
|
case SCONV_SET_OPT_UTF8_LIBARCHIVE2X:
|
||||||
#if (defined(_WIN32) && !defined(__CYGWIN__)) \
|
#if (defined(_WIN32) && !defined(__CYGWIN__)) \
|
||||||
@ -1939,12 +1939,19 @@ archive_strncat_l(struct archive_string *as, const void *_p, size_t n,
|
|||||||
struct archive_string_conv *sc)
|
struct archive_string_conv *sc)
|
||||||
{
|
{
|
||||||
const void *s;
|
const void *s;
|
||||||
size_t length;
|
size_t length = 0;
|
||||||
int i, r = 0, r2;
|
int i, r = 0, r2;
|
||||||
|
|
||||||
|
if (_p != NULL && n > 0) {
|
||||||
|
if (sc != NULL && (sc->flag & SCONV_FROM_UTF16))
|
||||||
|
length = utf16nbytes(_p, n);
|
||||||
|
else
|
||||||
|
length = mbsnbytes(_p, n);
|
||||||
|
}
|
||||||
|
|
||||||
/* We must allocate memory even if there is no data for conversion
|
/* We must allocate memory even if there is no data for conversion
|
||||||
* or copy. This simulates archive_string_append behavior. */
|
* or copy. This simulates archive_string_append behavior. */
|
||||||
if (_p == NULL || n == 0) {
|
if (length == 0) {
|
||||||
int tn = 1;
|
int tn = 1;
|
||||||
if (sc != NULL && (sc->flag & SCONV_TO_UTF16))
|
if (sc != NULL && (sc->flag & SCONV_TO_UTF16))
|
||||||
tn = 2;
|
tn = 2;
|
||||||
@ -1960,16 +1967,11 @@ archive_strncat_l(struct archive_string *as, const void *_p, size_t n,
|
|||||||
* If sc is NULL, we just make a copy.
|
* If sc is NULL, we just make a copy.
|
||||||
*/
|
*/
|
||||||
if (sc == NULL) {
|
if (sc == NULL) {
|
||||||
length = mbsnbytes(_p, n);
|
|
||||||
if (archive_string_append(as, _p, length) == NULL)
|
if (archive_string_append(as, _p, length) == NULL)
|
||||||
return (-1);/* No memory */
|
return (-1);/* No memory */
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sc->flag & SCONV_FROM_UTF16)
|
|
||||||
length = utf16nbytes(_p, n);
|
|
||||||
else
|
|
||||||
length = mbsnbytes(_p, n);
|
|
||||||
s = _p;
|
s = _p;
|
||||||
i = 0;
|
i = 0;
|
||||||
if (sc->nconverter > 1) {
|
if (sc->nconverter > 1) {
|
||||||
|
@ -680,7 +680,7 @@ struct iso9660 {
|
|||||||
/* The creation time of ISO image. */
|
/* The creation time of ISO image. */
|
||||||
time_t birth_time;
|
time_t birth_time;
|
||||||
/* A file stream of a temporary file, which file contents
|
/* A file stream of a temporary file, which file contents
|
||||||
* save to until ISO iamge can be created. */
|
* save to until ISO image can be created. */
|
||||||
int temp_fd;
|
int temp_fd;
|
||||||
|
|
||||||
struct isofile *cur_file;
|
struct isofile *cur_file;
|
||||||
@ -1995,7 +1995,7 @@ iso9660_close(struct archive_write *a)
|
|||||||
* Write an ISO 9660 image.
|
* Write an ISO 9660 image.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* Switc to start using wbuff as file buffer. */
|
/* Switch to start using wbuff as file buffer. */
|
||||||
iso9660->wbuff_remaining = wb_buffmax();
|
iso9660->wbuff_remaining = wb_buffmax();
|
||||||
iso9660->wbuff_type = WB_TO_STREAM;
|
iso9660->wbuff_type = WB_TO_STREAM;
|
||||||
iso9660->wbuff_offset = 0;
|
iso9660->wbuff_offset = 0;
|
||||||
@ -4558,7 +4558,7 @@ write_file_descriptors(struct archive_write *a)
|
|||||||
file->cur_content = &(file->content);
|
file->cur_content = &(file->content);
|
||||||
do {
|
do {
|
||||||
blocks += file->cur_content->blocks;
|
blocks += file->cur_content->blocks;
|
||||||
/* Next fragument */
|
/* Next fragment */
|
||||||
file->cur_content = file->cur_content->next;
|
file->cur_content = file->cur_content->next;
|
||||||
} while (file->cur_content != NULL);
|
} while (file->cur_content != NULL);
|
||||||
}
|
}
|
||||||
@ -4748,7 +4748,7 @@ isofile_gen_utility_names(struct archive_write *a, struct isofile *file)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Converte a filename to UTF-16BE.
|
* Convert a filename to UTF-16BE.
|
||||||
*/
|
*/
|
||||||
if (0 > archive_entry_pathname_l(file->entry, &u16, &u16len,
|
if (0 > archive_entry_pathname_l(file->entry, &u16, &u16len,
|
||||||
iso9660->sconv_to_utf16be)) {
|
iso9660->sconv_to_utf16be)) {
|
||||||
@ -5512,7 +5512,7 @@ isoent_setup_file_location(struct iso9660 *iso9660, int location)
|
|||||||
file->cur_content->location = location;
|
file->cur_content->location = location;
|
||||||
location += file->cur_content->blocks;
|
location += file->cur_content->blocks;
|
||||||
total_block += file->cur_content->blocks;
|
total_block += file->cur_content->blocks;
|
||||||
/* Next fragument */
|
/* Next fragment */
|
||||||
file->cur_content = file->cur_content->next;
|
file->cur_content = file->cur_content->next;
|
||||||
} while (file->cur_content != NULL);
|
} while (file->cur_content != NULL);
|
||||||
}
|
}
|
||||||
@ -6164,7 +6164,7 @@ isoent_gen_iso9660_identifier(struct archive_write *a, struct isoent *isoent,
|
|||||||
np->id_len = l = ext_off + np->ext_len;
|
np->id_len = l = ext_off + np->ext_len;
|
||||||
|
|
||||||
/* Make an offset of the number which is used to be set
|
/* Make an offset of the number which is used to be set
|
||||||
* hexadecimal number to avoid duplicate identififier. */
|
* hexadecimal number to avoid duplicate identifier. */
|
||||||
if (iso9660->opt.iso_level == 1) {
|
if (iso9660->opt.iso_level == 1) {
|
||||||
if (ext_off >= 5)
|
if (ext_off >= 5)
|
||||||
noff = 5;
|
noff = 5;
|
||||||
@ -6742,7 +6742,7 @@ isoent_rr_move(struct archive_write *a)
|
|||||||
int r;
|
int r;
|
||||||
|
|
||||||
pt = &(iso9660->primary.pathtbl[MAX_DEPTH-1]);
|
pt = &(iso9660->primary.pathtbl[MAX_DEPTH-1]);
|
||||||
/* Theare aren't level 8 directories reaching a deepr level. */
|
/* There aren't level 8 directories reaching a deeper level. */
|
||||||
if (pt->cnt == 0)
|
if (pt->cnt == 0)
|
||||||
return (ARCHIVE_OK);
|
return (ARCHIVE_OK);
|
||||||
|
|
||||||
@ -6813,7 +6813,7 @@ _compare_path_table(const void *v1, const void *v2)
|
|||||||
if (cmp != 0)
|
if (cmp != 0)
|
||||||
return (cmp);
|
return (cmp);
|
||||||
|
|
||||||
/* Compare indetifier */
|
/* Compare identifier */
|
||||||
s1 = p1->identifier;
|
s1 = p1->identifier;
|
||||||
s2 = p2->identifier;
|
s2 = p2->identifier;
|
||||||
l = p1->ext_off;
|
l = p1->ext_off;
|
||||||
@ -6855,7 +6855,7 @@ _compare_path_table_joliet(const void *v1, const void *v2)
|
|||||||
if (cmp != 0)
|
if (cmp != 0)
|
||||||
return (cmp);
|
return (cmp);
|
||||||
|
|
||||||
/* Compare indetifier */
|
/* Compare identifier */
|
||||||
s1 = (const unsigned char *)p1->identifier;
|
s1 = (const unsigned char *)p1->identifier;
|
||||||
s2 = (const unsigned char *)p2->identifier;
|
s2 = (const unsigned char *)p2->identifier;
|
||||||
l = p1->ext_off;
|
l = p1->ext_off;
|
||||||
|
@ -500,8 +500,8 @@ test_basic(void)
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* We should be on the initial directory where we performed
|
* We should be on the initial directory where we performed
|
||||||
* archive_read_disk_new() after we perfome archive_read_free()
|
* archive_read_disk_new() after we perform archive_read_free()
|
||||||
* even if we broke off the directory traversals.
|
* even if we broke off the directory traversals.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* Save current working directory. */
|
/* Save current working directory. */
|
||||||
@ -1565,11 +1565,11 @@ DEFINE_TEST(test_read_disk_directory_traversals)
|
|||||||
{
|
{
|
||||||
/* Basic test. */
|
/* Basic test. */
|
||||||
test_basic();
|
test_basic();
|
||||||
/* Test hybird mode; follow symlink initially, then not. */
|
/* Test hybrid mode; follow symlink initially, then not. */
|
||||||
test_symlink_hybrid();
|
test_symlink_hybrid();
|
||||||
/* Test logcal mode; follow all symlinks. */
|
/* Test logical mode; follow all symlinks. */
|
||||||
test_symlink_logical();
|
test_symlink_logical();
|
||||||
/* Test logcal mode; prevent loop in symlinks. */
|
/* Test logical mode; prevent loop in symlinks. */
|
||||||
test_symlink_logical_loop();
|
test_symlink_logical_loop();
|
||||||
/* Test to restore atime. */
|
/* Test to restore atime. */
|
||||||
test_restore_atime();
|
test_restore_atime();
|
||||||
|
@ -0,0 +1,59 @@
|
|||||||
|
/*-
|
||||||
|
* Copyright (c) 2016 Peter Wu
|
||||||
|
* 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$");
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Issue 822: jar files have an empty External File Attributes field which
|
||||||
|
* is misinterpreted as regular file type due to OS MS-DOS.
|
||||||
|
*/
|
||||||
|
|
||||||
|
DEFINE_TEST(test_read_format_zip_jar)
|
||||||
|
{
|
||||||
|
const char *refname = "test_read_format_zip_jar.jar";
|
||||||
|
char *p;
|
||||||
|
size_t s;
|
||||||
|
struct archive *a;
|
||||||
|
struct archive_entry *ae;
|
||||||
|
char data[16];
|
||||||
|
|
||||||
|
extract_reference_file(refname);
|
||||||
|
p = slurpfile(&s, refname);
|
||||||
|
|
||||||
|
assert((a = archive_read_new()) != NULL);
|
||||||
|
assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_zip_seekable(a));
|
||||||
|
assertEqualIntA(a, ARCHIVE_OK, read_open_memory_seek(a, p, s, 1));
|
||||||
|
|
||||||
|
assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
|
||||||
|
assertEqualString("somedir/", archive_entry_pathname(ae));
|
||||||
|
assertEqualInt(AE_IFDIR | 0775, archive_entry_mode(ae));
|
||||||
|
assertEqualInt(0, archive_entry_size(ae));
|
||||||
|
assertEqualIntA(a, 0, archive_read_data(a, data, 16));
|
||||||
|
|
||||||
|
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);
|
||||||
|
}
|
@ -0,0 +1,6 @@
|
|||||||
|
begin 640 test_read_format_zip_jar.jar
|
||||||
|
M4$L#! H @ $AQETD ( 0 <V]M961I<B_^R@ 4$L!
|
||||||
|
M @H "@ " 2'&720 @ ! '-O
|
||||||
|
@;65D:7(O_LH %!+!08 0 ! #H J
|
||||||
|
|
||||||
|
end
|
@ -144,7 +144,7 @@ DEFINE_TEST(test_write_disk_appledouble)
|
|||||||
assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
|
assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
|
||||||
assertEqualString("./file3", archive_entry_pathname(ae));
|
assertEqualString("./file3", archive_entry_pathname(ae));
|
||||||
assertEqualIntA(a, ARCHIVE_OK, archive_read_extract2(a, ae, ad));
|
assertEqualIntA(a, ARCHIVE_OK, archive_read_extract2(a, ae, ad));
|
||||||
/* Extract ._file3 which will be merged into file3 as medtadata. */
|
/* Extract ._file3 which will be merged into file3 as metadata. */
|
||||||
assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
|
assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
|
||||||
assertEqualString("./._file3", archive_entry_pathname(ae));
|
assertEqualString("./._file3", archive_entry_pathname(ae));
|
||||||
assertEqualIntA(a, ARCHIVE_OK, archive_read_extract2(a, ae, ad));
|
assertEqualIntA(a, ARCHIVE_OK, archive_read_extract2(a, ae, ad));
|
||||||
@ -203,7 +203,7 @@ DEFINE_TEST(test_write_disk_appledouble)
|
|||||||
assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
|
assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
|
||||||
assertEqualString("./file3", archive_entry_pathname(ae));
|
assertEqualString("./file3", archive_entry_pathname(ae));
|
||||||
assertEqualIntA(a, ARCHIVE_OK, archive_read_extract2(a, ae, ad));
|
assertEqualIntA(a, ARCHIVE_OK, archive_read_extract2(a, ae, ad));
|
||||||
/* Extract ._file3 which will be merged into file3 as medtadata. */
|
/* Extract ._file3 which will be merged into file3 as metadata. */
|
||||||
assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
|
assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
|
||||||
assertEqualString("./._file3", archive_entry_pathname(ae));
|
assertEqualString("./._file3", archive_entry_pathname(ae));
|
||||||
assertEqualIntA(a, ARCHIVE_OK, archive_read_extract2(a, ae, ad));
|
assertEqualIntA(a, ARCHIVE_OK, archive_read_extract2(a, ae, ad));
|
||||||
|
@ -115,6 +115,6 @@ DEFINE_TEST(test_write_format_xar_empty)
|
|||||||
assertEqualIntA(a, ARCHIVE_OK, archive_write_close(a));
|
assertEqualIntA(a, ARCHIVE_OK, archive_write_close(a));
|
||||||
assertEqualInt(ARCHIVE_OK, archive_write_free(a));
|
assertEqualInt(ARCHIVE_OK, archive_write_free(a));
|
||||||
|
|
||||||
/* Verify the correct format for an empy Xar archive. */
|
/* Verify the correct format for an empty Xar archive. */
|
||||||
assertEqualInt(used, 0);
|
assertEqualInt(used, 0);
|
||||||
}
|
}
|
||||||
|
@ -49,7 +49,7 @@ DEFINE_TEST(test_write_format_zip_empty)
|
|||||||
assertEqualIntA(a, ARCHIVE_OK, archive_write_close(a));
|
assertEqualIntA(a, ARCHIVE_OK, archive_write_close(a));
|
||||||
assertEqualInt(ARCHIVE_OK, archive_write_free(a));
|
assertEqualInt(ARCHIVE_OK, archive_write_free(a));
|
||||||
|
|
||||||
/* Verify the correct format for an empy Zip archive. */
|
/* Verify the correct format for an empty Zip archive. */
|
||||||
assertEqualInt(used, 22);
|
assertEqualInt(used, 22);
|
||||||
assertEqualMem(buff,
|
assertEqualMem(buff,
|
||||||
"PK\005\006\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0",
|
"PK\005\006\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0",
|
||||||
|
@ -51,7 +51,7 @@ DEFINE_TEST(test_write_format_zip_empty_zip64)
|
|||||||
assertEqualIntA(a, ARCHIVE_OK, archive_write_close(a));
|
assertEqualIntA(a, ARCHIVE_OK, archive_write_close(a));
|
||||||
assertEqualInt(ARCHIVE_OK, archive_write_free(a));
|
assertEqualInt(ARCHIVE_OK, archive_write_free(a));
|
||||||
|
|
||||||
/* Verify the correct format for an empy Zip archive with Zip64 extensions forced. */
|
/* Verify the correct format for an empty Zip archive with Zip64 extensions forced. */
|
||||||
assertEqualInt(used, 98);
|
assertEqualInt(used, 98);
|
||||||
assertEqualMem(buff,
|
assertEqualMem(buff,
|
||||||
"PK\006\006" /* Zip64 end-of-central-directory record */
|
"PK\006\006" /* Zip64 end-of-central-directory record */
|
||||||
|
@ -188,18 +188,17 @@ read_archive(struct bsdtar *bsdtar, char mode, struct archive *writer)
|
|||||||
|
|
||||||
reader_options = getenv(ENV_READER_OPTIONS);
|
reader_options = getenv(ENV_READER_OPTIONS);
|
||||||
if (reader_options != NULL) {
|
if (reader_options != NULL) {
|
||||||
|
size_t module_len = sizeof(IGNORE_WRONG_MODULE_NAME) - 1;
|
||||||
|
size_t opt_len = strlen(reader_options) + 1;
|
||||||
char *p;
|
char *p;
|
||||||
/* Set default read options. */
|
/* Set default read options. */
|
||||||
p = (char *)malloc(sizeof(IGNORE_WRONG_MODULE_NAME)
|
if ((p = malloc(module_len + opt_len)) == NULL)
|
||||||
+ strlen(reader_options) + 1);
|
|
||||||
if (p == NULL)
|
|
||||||
lafe_errc(1, errno, "Out of memory");
|
lafe_errc(1, errno, "Out of memory");
|
||||||
/* Prepend magic code to ignore options for
|
/* Prepend magic code to ignore options for
|
||||||
* a format or modules which are not added to
|
* a format or modules which are not added to
|
||||||
* the archive read object. */
|
* the archive read object. */
|
||||||
strncpy(p, IGNORE_WRONG_MODULE_NAME,
|
memcpy(p, IGNORE_WRONG_MODULE_NAME, module_len);
|
||||||
sizeof(IGNORE_WRONG_MODULE_NAME) -1);
|
memcpy(p + module_len, reader_options, opt_len);
|
||||||
strcpy(p + sizeof(IGNORE_WRONG_MODULE_NAME) -1, reader_options);
|
|
||||||
r = archive_read_set_options(a, p);
|
r = archive_read_set_options(a, p);
|
||||||
free(p);
|
free(p);
|
||||||
if (r == ARCHIVE_FATAL)
|
if (r == ARCHIVE_FATAL)
|
||||||
|
@ -145,18 +145,17 @@ set_writer_options(struct bsdtar *bsdtar, struct archive *a)
|
|||||||
|
|
||||||
writer_options = getenv(ENV_WRITER_OPTIONS);
|
writer_options = getenv(ENV_WRITER_OPTIONS);
|
||||||
if (writer_options != NULL) {
|
if (writer_options != NULL) {
|
||||||
|
size_t module_len = sizeof(IGNORE_WRONG_MODULE_NAME) - 1;
|
||||||
|
size_t opt_len = strlen(writer_options) + 1;
|
||||||
char *p;
|
char *p;
|
||||||
/* Set default write options. */
|
/* Set default write options. */
|
||||||
p = malloc(sizeof(IGNORE_WRONG_MODULE_NAME)
|
if ((p = malloc(module_len + opt_len)) == NULL)
|
||||||
+ strlen(writer_options) + 1);
|
|
||||||
if (p == NULL)
|
|
||||||
lafe_errc(1, errno, "Out of memory");
|
lafe_errc(1, errno, "Out of memory");
|
||||||
/* Prepend magic code to ignore options for
|
/* Prepend magic code to ignore options for
|
||||||
* a format or filters which are not added to
|
* a format or filters which are not added to
|
||||||
* the archive write object. */
|
* the archive write object. */
|
||||||
strncpy(p, IGNORE_WRONG_MODULE_NAME,
|
memcpy(p, IGNORE_WRONG_MODULE_NAME, module_len);
|
||||||
sizeof(IGNORE_WRONG_MODULE_NAME) -1);
|
memcpy(p, writer_options, opt_len);
|
||||||
strcpy(p + sizeof(IGNORE_WRONG_MODULE_NAME) -1, writer_options);
|
|
||||||
r = archive_write_set_options(a, p);
|
r = archive_write_set_options(a, p);
|
||||||
free(p);
|
free(p);
|
||||||
if (r < ARCHIVE_WARN)
|
if (r < ARCHIVE_WARN)
|
||||||
@ -178,18 +177,18 @@ set_reader_options(struct bsdtar *bsdtar, struct archive *a)
|
|||||||
|
|
||||||
reader_options = getenv(ENV_READER_OPTIONS);
|
reader_options = getenv(ENV_READER_OPTIONS);
|
||||||
if (reader_options != NULL) {
|
if (reader_options != NULL) {
|
||||||
|
size_t module_len = sizeof(IGNORE_WRONG_MODULE_NAME) - 1;
|
||||||
|
size_t opt_len = strlen(reader_options) + 1;
|
||||||
char *p;
|
char *p;
|
||||||
/* Set default write options. */
|
/* Set default write options. */
|
||||||
p = malloc(sizeof(IGNORE_WRONG_MODULE_NAME)
|
if ((p = malloc(module_len + opt_len)) == NULL)
|
||||||
+ strlen(reader_options) + 1);
|
|
||||||
if (p == NULL)
|
if (p == NULL)
|
||||||
lafe_errc(1, errno, "Out of memory");
|
lafe_errc(1, errno, "Out of memory");
|
||||||
/* Prepend magic code to ignore options for
|
/* Prepend magic code to ignore options for
|
||||||
* a format or filters which are not added to
|
* a format or filters which are not added to
|
||||||
* the archive write object. */
|
* the archive write object. */
|
||||||
strncpy(p, IGNORE_WRONG_MODULE_NAME,
|
memcpy(p, IGNORE_WRONG_MODULE_NAME, module_len);
|
||||||
sizeof(IGNORE_WRONG_MODULE_NAME) -1);
|
memcpy(p, reader_options, opt_len);
|
||||||
strcpy(p + sizeof(IGNORE_WRONG_MODULE_NAME) -1, reader_options);
|
|
||||||
r = archive_read_set_options(a, p);
|
r = archive_read_set_options(a, p);
|
||||||
free(p);
|
free(p);
|
||||||
if (r < ARCHIVE_WARN)
|
if (r < ARCHIVE_WARN)
|
||||||
|
@ -182,6 +182,7 @@ TESTS_SRCS= \
|
|||||||
test_read_format_zip_encryption_partially.c \
|
test_read_format_zip_encryption_partially.c \
|
||||||
test_read_format_zip_filename.c \
|
test_read_format_zip_filename.c \
|
||||||
test_read_format_zip_high_compression.c \
|
test_read_format_zip_high_compression.c \
|
||||||
|
test_read_format_zip_jar.c \
|
||||||
test_read_format_zip_mac_metadata.c \
|
test_read_format_zip_mac_metadata.c \
|
||||||
test_read_format_zip_malformed.c \
|
test_read_format_zip_malformed.c \
|
||||||
test_read_format_zip_msdos.c \
|
test_read_format_zip_msdos.c \
|
||||||
@ -521,6 +522,7 @@ ${PACKAGE}FILES+= test_read_format_zip_filename_utf8_jp.zip.uu
|
|||||||
${PACKAGE}FILES+= test_read_format_zip_filename_utf8_ru.zip.uu
|
${PACKAGE}FILES+= test_read_format_zip_filename_utf8_ru.zip.uu
|
||||||
${PACKAGE}FILES+= test_read_format_zip_filename_utf8_ru2.zip.uu
|
${PACKAGE}FILES+= test_read_format_zip_filename_utf8_ru2.zip.uu
|
||||||
${PACKAGE}FILES+= test_read_format_zip_high_compression.zip.uu
|
${PACKAGE}FILES+= test_read_format_zip_high_compression.zip.uu
|
||||||
|
${PACKAGE}FILES+= test_read_format_zip_jar.jar.uu
|
||||||
${PACKAGE}FILES+= test_read_format_zip_length_at_end.zip.uu
|
${PACKAGE}FILES+= test_read_format_zip_length_at_end.zip.uu
|
||||||
${PACKAGE}FILES+= test_read_format_zip_mac_metadata.zip.uu
|
${PACKAGE}FILES+= test_read_format_zip_mac_metadata.zip.uu
|
||||||
${PACKAGE}FILES+= test_read_format_zip_malformed1.zip.uu
|
${PACKAGE}FILES+= test_read_format_zip_malformed1.zip.uu
|
||||||
|
Loading…
Reference in New Issue
Block a user