From: Michihiro NAKAJIMA Date: Sat, 9 Apr 2011 04:10:02 +0000 (-0400) Subject: Choose the charset described in the archive file when it's available even if hdrchars... X-Git-Tag: v3.0.0a~499 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a285da560c9f9226a7eccc4cb603a86acfb5bf9c;p=thirdparty%2Flibarchive.git Choose the charset described in the archive file when it's available even if hdrcharset option is used. SVN-Revision: 3187 --- diff --git a/libarchive/archive_read_support_format_cab.c b/libarchive/archive_read_support_format_cab.c index 89343057b..926b81a49 100644 --- a/libarchive/archive_read_support_format_cab.c +++ b/libarchive/archive_read_support_format_cab.c @@ -785,6 +785,7 @@ cab_read_header(struct archive_read *a) prev_folder = -1; for (i = 0; i < hd->file_count; i++) { struct cffile *file = &(hd->file_array[i]); + struct archive_string_conv *sconv; ssize_t avail; if ((p = __archive_read_ahead(a, 16, NULL)) == NULL) @@ -802,7 +803,7 @@ cab_read_header(struct archive_read *a) if ((len = cab_strnlen(p, avail-1)) <= 0) goto invalid; archive_string_init(&(file->pathname)); - if ((file->attr & ATTR_NAME_IS_UTF) && cab->sconv == NULL) { + if (file->attr & ATTR_NAME_IS_UTF) { if (cab->sconv_utf8 == NULL) { cab->sconv_utf8 = archive_string_conversion_from_charset( @@ -810,11 +811,10 @@ cab_read_header(struct archive_read *a) if (cab->sconv_utf8 == NULL) return (ARCHIVE_FATAL); } - archive_strncpy_in_locale(&(file->pathname), p, len, - cab->sconv_utf8); + sconv = cab->sconv_utf8; } else - archive_strncpy_in_locale(&(file->pathname), p, - len, cab->sconv); + sconv = cab->sconv; + archive_strncpy_in_locale(&(file->pathname), p, len, sconv); __archive_read_consume(a, len + 1); cab->cab_offset += len + 1; /* Convert a path separator '\' -> '/' */ diff --git a/libarchive/archive_read_support_format_lha.c b/libarchive/archive_read_support_format_lha.c index c891b2235..16611bb8d 100644 --- a/libarchive/archive_read_support_format_lha.c +++ b/libarchive/archive_read_support_format_lha.c @@ -1260,29 +1260,30 @@ lha_read_file_extended_header(struct archive_read *a, struct lha *lha, } break; case EXT_CODEPAGE: - /* Get a archived filename charset from codepage, - * but you cannot overwrite a specified charset. */ - if (datasize == sizeof(uint32_t) && - lha->sconv == NULL) { + /* Get an archived filename charset from codepage. + * This overwrites the charset specified by + * hdrcharset option. */ + if (datasize == sizeof(uint32_t)) { + struct archive_string cp; const char *charset; + + archive_string_init(&cp); switch (archive_le32dec(extdheader)) { - case 932: - charset = "CP932"; - break; case 65001: /* UTF-8 */ charset = "UTF-8"; break; default: - charset = NULL; + archive_string_sprintf(&cp, "CP%d", + (int)archive_le32dec(extdheader)); + charset = cp.s; break; } - if (charset != NULL) { - lha->sconv = - archive_string_conversion_from_charset( - &(a->archive), charset, 1); - if (lha->sconv == NULL) - return (ARCHIVE_FATAL); - } + lha->sconv = + archive_string_conversion_from_charset( + &(a->archive), charset, 1); + archive_string_free(&cp); + if (lha->sconv == NULL) + return (ARCHIVE_FATAL); } break; case EXT_UNIX_MODE: diff --git a/libarchive/archive_read_support_format_zip.c b/libarchive/archive_read_support_format_zip.c index 7f26eec8c..44f3750e4 100644 --- a/libarchive/archive_read_support_format_zip.c +++ b/libarchive/archive_read_support_format_zip.c @@ -511,9 +511,7 @@ zip_read_file_header(struct archive_read *a, struct archive_entry *entry, "Truncated ZIP file header"); return (ARCHIVE_FATAL); } - if (zip->sconv != NULL) - sconv = zip->sconv; - else if (zip->flags & ZIP_UTF8_NAME) { + if (zip->flags & ZIP_UTF8_NAME) { /* The filename is stored to be UTF-8. */ if (zip->sconv_utf8 == NULL) { zip->sconv_utf8 = @@ -523,7 +521,9 @@ zip_read_file_header(struct archive_read *a, struct archive_entry *entry, return (ARCHIVE_FATAL); } sconv = zip->sconv_utf8; - } else + } else if (zip->sconv != NULL) + sconv = zip->sconv; + else sconv = zip->sconv_default; if (archive_strncpy_in_locale(&zip->pathname,