Issue #2722. Now the char buffer to support the path string has

not fixed length, it mallocs memory if needed. As a result, we
don't have a maximum for the getcwd() method.
This commit is contained in:
Facundo Batista 2008-06-22 13:36:20 +00:00
parent 0ba92b24b7
commit 5596b0cfc2
3 changed files with 59 additions and 5 deletions

View File

@ -10,6 +10,7 @@ except ImportError:
import time import time
import os import os
import pwd import pwd
import shutil
import unittest import unittest
import warnings import warnings
warnings.filterwarnings('ignore', '.* potential security risk .*', warnings.filterwarnings('ignore', '.* potential security risk .*',
@ -231,6 +232,38 @@ class PosixTester(unittest.TestCase):
if hasattr(st, 'st_flags'): if hasattr(st, 'st_flags'):
posix.lchflags(test_support.TESTFN, st.st_flags) posix.lchflags(test_support.TESTFN, st.st_flags)
def test_getcwd_long_pathnames(self):
if hasattr(posix, 'getcwd'):
dirname = 'getcwd-test-directory-0123456789abcdef-01234567890abcdef'
curdir = os.getcwd()
base_path = os.path.abspath(test_support.TESTFN) + '.getcwd'
try:
os.mkdir(base_path)
os.chdir(base_path)
def _create_and_do_getcwd(dirname, current_path_length = 0):
try:
os.mkdir(dirname)
except:
raise test_support.TestSkipped, "mkdir cannot create directory sufficiently deep for getcwd test"
os.chdir(dirname)
try:
os.getcwd()
if current_path_length < 1027:
_create_and_do_getcwd(dirname, current_path_length + len(dirname) + 1)
finally:
os.chdir('..')
os.rmdir(dirname)
_create_and_do_getcwd(dirname)
finally:
shutil.rmtree(base_path)
os.chdir(curdir)
def test_main(): def test_main():
test_support.run_unittest(PosixTester) test_support.run_unittest(PosixTester)

View File

@ -108,6 +108,8 @@ Extension Modules
Library Library
------- -------
- Issue #2722: Now the os.getcwd() supports very long path names.
- Issue #2888: Fixed the behaviour of pprint when working with nested - Issue #2888: Fixed the behaviour of pprint when working with nested
structures, to match the behaviour of 2.5 and 3.0 (now follows the common structures, to match the behaviour of 2.5 and 3.0 (now follows the common
sense). sense).

View File

@ -1956,19 +1956,38 @@ Return a string representing the current working directory.");
static PyObject * static PyObject *
posix_getcwd(PyObject *self, PyObject *noargs) posix_getcwd(PyObject *self, PyObject *noargs)
{ {
char buf[1026]; int bufsize_incr = 1024;
char *res; int bufsize = 0;
char *tmpbuf = NULL;
char *res = NULL;
PyObject *dynamic_return;
Py_BEGIN_ALLOW_THREADS Py_BEGIN_ALLOW_THREADS
do {
bufsize = bufsize + bufsize_incr;
tmpbuf = malloc(bufsize);
if (tmpbuf == NULL) {
break;
}
#if defined(PYOS_OS2) && defined(PYCC_GCC) #if defined(PYOS_OS2) && defined(PYCC_GCC)
res = _getcwd2(buf, sizeof buf); res = _getcwd2(tmpbuf, bufsize);
#else #else
res = getcwd(buf, sizeof buf); res = getcwd(tmpbuf, bufsize);
#endif #endif
if (res == NULL) {
free(tmpbuf);
}
} while ((res == NULL) && (errno == ERANGE));
Py_END_ALLOW_THREADS Py_END_ALLOW_THREADS
if (res == NULL) if (res == NULL)
return posix_error(); return posix_error();
return PyString_FromString(buf);
dynamic_return = PyString_FromString(tmpbuf);
free(tmpbuf);
return dynamic_return;
} }
#ifdef Py_USING_UNICODE #ifdef Py_USING_UNICODE