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)
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(
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 '\' -> '/' */
}
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:
"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 =
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,