summaryrefslogtreecommitdiffstats
path: root/Modules/zipimport.c
diff options
context:
space:
mode:
authorVictor Stinner <victor.stinner@haypocalc.com>2010-10-18 12:13:46 (GMT)
committerVictor Stinner <victor.stinner@haypocalc.com>2010-10-18 12:13:46 (GMT)
commitd36c8217e130bac34ea8c95c8351c47e24c401e2 (patch)
tree7b58cbc51355c41443666ab95ca0aa53329d8d83 /Modules/zipimport.c
parentb08820ad406b9fd291a8707e4bad41cc8486ab08 (diff)
downloadcpython-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.c11
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);