[Python-checkins] r82853 - in python/branches/release27-maint: Lib/test/test_posix.py Modules/posixmodule.c
stefan.krah
python-checkins at python.org
Tue Jul 13 21:17:08 CEST 2010
Author: stefan.krah
Date: Tue Jul 13 21:17:08 2010
New Revision: 82853
Log:
Issue #9185: On Solaris and OpenBSD, posix_getcwd() could loop indefinitely
if the path length exceeded PATH_MAX.
Modified:
python/branches/release27-maint/Lib/test/test_posix.py
python/branches/release27-maint/Modules/posixmodule.c
Modified: python/branches/release27-maint/Lib/test/test_posix.py
==============================================================================
--- python/branches/release27-maint/Lib/test/test_posix.py (original)
+++ python/branches/release27-maint/Lib/test/test_posix.py Tue Jul 13 21:17:08 2010
@@ -10,6 +10,7 @@
import os
import pwd
import shutil
+import sys
import unittest
import warnings
@@ -345,8 +346,13 @@
os.chdir(dirname)
try:
os.getcwd()
- if current_path_length < 1027:
+ if current_path_length < 4099:
_create_and_do_getcwd(dirname, current_path_length + len(dirname) + 1)
+ except OSError as e:
+ expected_errno = errno.ENAMETOOLONG
+ if 'sunos' in sys.platform or 'openbsd' in sys.platform:
+ expected_errno = errno.ERANGE # Issue 9185
+ self.assertEqual(e.errno, expected_errno)
finally:
os.chdir('..')
os.rmdir(dirname)
Modified: python/branches/release27-maint/Modules/posixmodule.c
==============================================================================
--- python/branches/release27-maint/Modules/posixmodule.c (original)
+++ python/branches/release27-maint/Modules/posixmodule.c Tue Jul 13 21:17:08 2010
@@ -1957,6 +1957,28 @@
"getcwd() -> path\n\n\
Return a string representing the current working directory.");
+#if (defined(__sun) && defined(__SVR4)) || defined(__OpenBSD__)
+/* Issue 9185: getcwd() returns NULL/ERANGE indefinitely. */
+static PyObject *
+posix_getcwd(PyObject *self, PyObject *noargs)
+{
+ char buf[PATH_MAX+2];
+ char *res;
+
+ Py_BEGIN_ALLOW_THREADS
+#if defined(PYOS_OS2) && defined(PYCC_GCC)
+ res = _getcwd2(buf, sizeof buf);
+#else
+ res = getcwd(buf, sizeof buf);
+#endif
+ Py_END_ALLOW_THREADS
+
+ if (res == NULL)
+ return posix_error();
+
+ return PyString_FromString(buf);
+}
+#else
static PyObject *
posix_getcwd(PyObject *self, PyObject *noargs)
{
@@ -1993,6 +2015,7 @@
return dynamic_return;
}
+#endif /* getcwd() NULL/ERANGE workaround. */
#ifdef Py_USING_UNICODE
PyDoc_STRVAR(posix_getcwdu__doc__,
More information about the Python-checkins
mailing list