From d4a75dc44c39c232f10dcfd549bad1de5e5fdd7b Mon Sep 17 00:00:00 2001 From: Thomas Wouters Date: Wed, 11 Jul 2001 12:03:44 +0000 Subject: Backport of Tim's checkin 2.178: 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. --- Python/import.c | 39 ++++++++++++++++++++++++++++----------- 1 file changed, 28 insertions(+), 11 deletions(-) diff --git a/Python/import.c b/Python/import.c index 15bcca0..3d55fe4 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; -- cgit v0.12