diff options
author | Victor Stinner <victor.stinner@haypocalc.com> | 2010-10-18 12:13:46 (GMT) |
---|---|---|
committer | Victor Stinner <victor.stinner@haypocalc.com> | 2010-10-18 12:13:46 (GMT) |
commit | d36c8217e130bac34ea8c95c8351c47e24c401e2 (patch) | |
tree | 7b58cbc51355c41443666ab95ca0aa53329d8d83 /Modules/zipimport.c | |
parent | b08820ad406b9fd291a8707e4bad41cc8486ab08 (diff) | |
download | cpython-d36c8217e130bac34ea8c95c8351c47e24c401e2.zip cpython-d36c8217e130bac34ea8c95c8351c47e24c401e2.tar.gz cpython-d36c8217e130bac34ea8c95c8351c47e24c401e2.tar.bz2 |
zipimport: read_directory() uses cp437 or utf-8 (in strict mode), depending on
the unicode flag, to decode the filename, instead of the filesystem encoding.
Use the same choice than the zipfile module.
Diffstat (limited to 'Modules/zipimport.c')
-rw-r--r-- | Modules/zipimport.c | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/Modules/zipimport.c b/Modules/zipimport.c index 5f2e160..0b9ad18 100644 --- a/Modules/zipimport.c +++ b/Modules/zipimport.c @@ -714,6 +714,7 @@ read_directory(PyObject *archive_obj) /* FIXME: work on Py_UNICODE* instead of char* */ PyObject *files = NULL; FILE *fp; + unsigned short flags; long compress, crc, data_size, file_size, file_offset, date, time; long header_offset, name_size, header_size, header_position; long i, l, count; @@ -724,6 +725,7 @@ read_directory(PyObject *archive_obj) char *p, endof_central_dir[22]; long arc_offset; /* offset from beginning of file to start of zip-archive */ PyObject *pathobj; + const char *charset; if (PyUnicode_GET_SIZE(archive_obj) > MAXPATHLEN) { PyErr_SetString(PyExc_OverflowError, @@ -776,7 +778,8 @@ read_directory(PyObject *archive_obj) l = PyMarshal_ReadLongFromFile(fp); if (l != 0x02014B50) break; /* Bad: Central Dir File Header */ - fseek(fp, header_offset + 10, 0); + fseek(fp, header_offset + 8, 0); + flags = (unsigned short)PyMarshal_ReadShortFromFile(fp); compress = PyMarshal_ReadShortFromFile(fp); time = PyMarshal_ReadShortFromFile(fp); date = PyMarshal_ReadShortFromFile(fp); @@ -802,7 +805,11 @@ read_directory(PyObject *archive_obj) *p = 0; /* Add terminating null byte */ header_offset += header_size; - nameobj = PyUnicode_DecodeFSDefaultAndSize(name, name_size); + if (flags & 0x0800) + charset = "utf-8"; + else + charset = "cp437"; + nameobj = PyUnicode_Decode(name, name_size, charset, NULL); if (nameobj == NULL) goto error; Py_UNICODE_strncpy(path + length + 1, PyUnicode_AS_UNICODE(nameobj), MAXPATHLEN - length - 1); |