From 53ffdc53bf0500e402682d1459a9a8d06573664c Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Fri, 23 Sep 2011 18:54:40 +0200 Subject: [PATCH] Issue #7732: Don't open a directory as a file anymore while importing a module. Ignore the direcotry if its name matchs the module name (e.g. "__init__.py") and raise a ImportError instead. --- Lib/test/test_import.py | 9 +++++++++ Misc/NEWS | 6 +++++- Python/import.c | 9 ++++++++- 3 files changed, 22 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_import.py b/Lib/test/test_import.py index 95a5f48fce3..98b7351c353 100644 --- a/Lib/test/test_import.py +++ b/Lib/test/test_import.py @@ -139,6 +139,15 @@ class ImportTests(unittest.TestCase): self.assertIs(orig_path, new_os.path) self.assertIsNot(orig_getenv, new_os.getenv) + def test_bug7732(self): + source = TESTFN + '.py' + os.mkdir(source) + try: + self.assertRaisesRegex(ImportError, '^No module', + imp.find_module, TESTFN, ["."]) + finally: + os.rmdir(source) + def test_module_with_large_stack(self, module='longlist'): # Regression test for http://bugs.python.org/issue561858. filename = module + '.py' diff --git a/Misc/NEWS b/Misc/NEWS index 6f4cb0a3b30..fd98d021e50 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -10,6 +10,10 @@ What's New in Python 3.2.3? Core and Builtins ----------------- +- Issue #7732: Don't open a directory as a file anymore while importing a + module. Ignore the direcotry if its name matchs the module name (e.g. + "__init__.py") and raise a ImportError instead. + - Issue #13021: Missing decref on an error path. Thanks to Suman Saha for finding the bug and providing a patch. @@ -77,7 +81,7 @@ Tests Extension Modules ----------------- - + - Issue #13022: Fix: _multiprocessing.recvfd() doesn't check that file descriptor was actually received. diff --git a/Python/import.c b/Python/import.c index ee905eb286a..2adcb046741 100644 --- a/Python/import.c +++ b/Python/import.c @@ -1763,6 +1763,7 @@ find_module(char *fullname, char *subname, PyObject *path, char *buf, saved_namelen = namelen; #endif /* PYOS_OS2 */ for (fdp = _PyImport_Filetab; fdp->suffix != NULL; fdp++) { + struct stat statbuf; #if defined(PYOS_OS2) && defined(HAVE_DYNAMIC_LOADING) /* OS/2 limits DLLs to 8 character names (w/o extension) @@ -1791,10 +1792,16 @@ find_module(char *fullname, char *subname, PyObject *path, char *buf, strcpy(buf+len, fdp->suffix); if (Py_VerboseFlag > 1) PySys_WriteStderr("# trying %s\n", buf); + filemode = fdp->mode; if (filemode[0] == 'U') filemode = "r" PY_STDIOTEXTMODE; - fp = fopen(buf, filemode); + + if (stat(buf, &statbuf) == 0 && S_ISDIR(statbuf.st_mode)) + /* it's a directory */ + fp = NULL; + else + fp = fopen(buf, filemode); if (fp != NULL) { if (case_ok(buf, len, namelen, name)) break;