Issue #9185: On Solaris and OpenBSD, posix_getcwd() could loop indefinitely

if the path length exceeded PATH_MAX.
This commit is contained in:
Stefan Krah 2010-07-13 19:17:08 +00:00
parent 320477e4db
commit 182ae64235
2 changed files with 30 additions and 1 deletions

View File

@ -10,6 +10,7 @@ import time
import os
import pwd
import shutil
import sys
import unittest
import warnings
@ -345,8 +346,13 @@ class PosixTester(unittest.TestCase):
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)

View File

@ -1957,6 +1957,28 @@ PyDoc_STRVAR(posix_getcwd__doc__,
"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 @@ posix_getcwd(PyObject *self, PyObject *noargs)
return dynamic_return;
}
#endif /* getcwd() NULL/ERANGE workaround. */
#ifdef Py_USING_UNICODE
PyDoc_STRVAR(posix_getcwdu__doc__,