]> git.ipfire.org Git - thirdparty/libarchive.git/commitdiff
Choose the charset described in the archive file when it's available even if hdrchars...
authorMichihiro NAKAJIMA <ggcueroad@gmail.com>
Sat, 9 Apr 2011 04:10:02 +0000 (00:10 -0400)
committerMichihiro NAKAJIMA <ggcueroad@gmail.com>
Sat, 9 Apr 2011 04:10:02 +0000 (00:10 -0400)
SVN-Revision: 3187

libarchive/archive_read_support_format_cab.c
libarchive/archive_read_support_format_lha.c
libarchive/archive_read_support_format_zip.c

index 89343057b92458d916b7304309f5f6b41a3751e8..926b81a49bf1cb7e69bbbdc02917414f746470b0 100644 (file)
@@ -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 '\' -> '/' */
index c891b22356a7d3cb707848e6fcb2c6557884b501..16611bb8d97f5767079af80c8365411627185708 100644 (file)
@@ -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:
index 7f26eec8c02a3d89e99c40474eecfd35e385b3e7..44f3750e413f40ada919670d53bbe240da4fb803 100644 (file)
@@ -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,