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 os
import pwd
import shutil
import unittest
import warnings
warnings.filterwarnings('ignore', '.* potential security risk .*',
@ -231,6 +232,38 @@ class PosixTester(unittest.TestCase):
if hasattr(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():
test_support.run_unittest(PosixTester)

View File

@ -108,6 +108,8 @@ Extension Modules
Library
-------
- Issue #2722: Now the os.getcwd() supports very long path names.
- 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
sense).

View File

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