[Python-checkins] r67154 - python/trunk/Modules/posixmodule.c

hirokazu.yamamoto python-checkins at python.org
Sat Nov 8 04:46:18 CET 2008


Author: hirokazu.yamamoto
Date: Sat Nov  8 04:46:17 2008
New Revision: 67154

Log:
Issue #4071: ntpath.abspath returned an empty string for long unicode path.

Modified:
   python/trunk/Modules/posixmodule.c

Modified: python/trunk/Modules/posixmodule.c
==============================================================================
--- python/trunk/Modules/posixmodule.c	(original)
+++ python/trunk/Modules/posixmodule.c	Sat Nov  8 04:46:17 2008
@@ -2389,13 +2389,27 @@
 	if (unicode_file_names()) {
 		PyUnicodeObject *po;
 		if (PyArg_ParseTuple(args, "U|:_getfullpathname", &po)) {
-			Py_UNICODE woutbuf[MAX_PATH*2];
+			Py_UNICODE *wpath = PyUnicode_AS_UNICODE(po);
+			Py_UNICODE woutbuf[MAX_PATH*2], *woutbufp = woutbuf;
 			Py_UNICODE *wtemp;
-			if (!GetFullPathNameW(PyUnicode_AS_UNICODE(po),
-						sizeof(woutbuf)/sizeof(woutbuf[0]),
-						 woutbuf, &wtemp))
-				return win32_error("GetFullPathName", "");
-			return PyUnicode_FromUnicode(woutbuf, wcslen(woutbuf));
+			DWORD result;
+			PyObject *v;
+			result = GetFullPathNameW(wpath,
+						   sizeof(woutbuf)/sizeof(woutbuf[0]),
+						    woutbuf, &wtemp);
+			if (result > sizeof(woutbuf)/sizeof(woutbuf[0])) {
+				woutbufp = malloc(result * sizeof(Py_UNICODE));
+				if (!woutbufp)
+					return PyErr_NoMemory();
+				result = GetFullPathNameW(wpath, result, woutbufp, &wtemp);
+			}
+			if (result)
+				v = PyUnicode_FromUnicode(woutbufp, wcslen(woutbufp));
+			else
+				v = win32_error_unicode("GetFullPathNameW", wpath);
+			if (woutbufp != woutbuf)
+				free(woutbufp);
+			return v;
 		}
 		/* Drop the argument parsing error as narrow strings
 		   are also valid. */


More information about the Python-checkins mailing list