summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTim Peters <tim.peters@gmail.com>2001-07-05 03:47:53 (GMT)
committerTim Peters <tim.peters@gmail.com>2001-07-05 03:47:53 (GMT)
commit0f9431fb180986767c58416b7c8fa3da66933802 (patch)
tree504f20fa950163d5194827f50ff7ef1eb99ca7bf
parentc90acb95997de32cc6014814e686804914a9c0c3 (diff)
downloadcpython-0f9431fb180986767c58416b7c8fa3da66933802.zip
cpython-0f9431fb180986767c58416b7c8fa3da66933802.tar.gz
cpython-0f9431fb180986767c58416b7c8fa3da66933802.tar.bz2
SF bug #438295: [Windows] __init__.py cause strange behavior
Probable fix (the bug report doesn't have enough info to say for sure). find_init_module(): Insist on a case-sensitive match for __init__ files. Given __INIT__.PY instead, find_init_module() thought that was fine, but the later attempt to do find_module("__INIT__.PY") didn't and its caller silently suppressed the resulting ImportError. Now find_init_module() refuses to accept __INIT__.PY to begin with. Bugfix candidate; specific to platforms with case-insensitive filesystems.
-rw-r--r--Python/import.c39
1 files changed, 28 insertions, 11 deletions
diff --git a/Python/import.c b/Python/import.c
index ef3e0e6..7443724 100644
--- a/Python/import.c
+++ b/Python/import.c
@@ -1194,26 +1194,43 @@ case_ok(char *buf, int len, int namelen, char *name)
static int
find_init_module(char *buf)
{
- size_t save_len = strlen(buf);
+ const size_t save_len = strlen(buf);
size_t i = save_len;
+ char *pname; /* pointer to start of __init__ */
struct stat statbuf;
+/* For calling case_ok(buf, len, namelen, name):
+ * /a/b/c/d/e/f/g/h/i/j/k/some_long_module_name.py\0
+ * ^ ^ ^ ^
+ * |--------------------- buf ---------------------|
+ * |------------------- len ------------------|
+ * |------ name -------|
+ * |----- namelen -----|
+ */
if (save_len + 13 >= MAXPATHLEN)
return 0;
buf[i++] = SEP;
- strcpy(buf+i, "__init__.py");
+ pname = buf + i;
+ strcpy(pname, "__init__.py");
if (stat(buf, &statbuf) == 0) {
- buf[save_len] = '\0';
- return 1;
+ if (case_ok(buf,
+ save_len + 9, /* len("/__init__") */
+ 8, /* len("__init__") */
+ pname)) {
+ buf[save_len] = '\0';
+ return 1;
+ }
}
- i += strlen(buf+i);
- if (Py_OptimizeFlag)
- strcpy(buf+i, "o");
- else
- strcpy(buf+i, "c");
+ i += strlen(pname);
+ strcpy(buf+i, Py_OptimizeFlag ? "o" : "c");
if (stat(buf, &statbuf) == 0) {
- buf[save_len] = '\0';
- return 1;
+ if (case_ok(buf,
+ save_len + 9, /* len("/__init__") */
+ 8, /* len("__init__") */
+ pname)) {
+ buf[save_len] = '\0';
+ return 1;
+ }
}
buf[save_len] = '\0';
return 0;