From 3939c321c90283b49eddde762656e4b1940e7150 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Tue, 25 Jun 2019 15:02:43 +0200 Subject: bpo-20443: _PyConfig_Read() gets the absolute path of run_filename (GH-14053) Python now gets the absolute path of the script filename specified on the command line (ex: "python3 script.py"): the __file__ attribute of the __main__ module, sys.argv[0] and sys.path[0] become an absolute path, rather than a relative path. * Add _Py_isabs() and _Py_abspath() functions. * _PyConfig_Read() now tries to get the absolute path of run_filename, but keeps the relative path if _Py_abspath() fails. * Reimplement os._getfullpathname() using _Py_abspath(). * Use _Py_isabs() in getpath.c. --- Modules/posixmodule.c | 38 +++++++++++++++++--------------------- 1 file changed, 17 insertions(+), 21 deletions(-) (limited to 'Modules/posixmodule.c') diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index b2fd45b901..10549d6f60 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -3784,29 +3784,25 @@ static PyObject * os__getfullpathname_impl(PyObject *module, path_t *path) /*[clinic end generated code: output=bb8679d56845bc9b input=332ed537c29d0a3e]*/ { - wchar_t woutbuf[MAX_PATH], *woutbufp = woutbuf; - wchar_t *wtemp; - DWORD result; - PyObject *v; + wchar_t *abspath; - result = GetFullPathNameW(path->wide, - Py_ARRAY_LENGTH(woutbuf), - woutbuf, &wtemp); - if (result > Py_ARRAY_LENGTH(woutbuf)) { - woutbufp = PyMem_New(wchar_t, result); - if (!woutbufp) - return PyErr_NoMemory(); - result = GetFullPathNameW(path->wide, result, woutbufp, &wtemp); + /* _Py_abspath() is implemented with GetFullPathNameW() on Windows */ + if (_Py_abspath(path->wide, &abspath) < 0) { + return win32_error_object("GetFullPathNameW", path->object); } - if (result) { - v = PyUnicode_FromWideChar(woutbufp, wcslen(woutbufp)); - if (path->narrow) - Py_SETREF(v, PyUnicode_EncodeFSDefault(v)); - } else - v = win32_error_object("GetFullPathNameW", path->object); - if (woutbufp != woutbuf) - PyMem_Free(woutbufp); - return v; + if (abspath == NULL) { + return PyErr_NoMemory(); + } + + PyObject *str = PyUnicode_FromWideChar(abspath, wcslen(abspath)); + PyMem_RawFree(abspath); + if (str == NULL) { + return NULL; + } + if (path->narrow) { + Py_SETREF(str, PyUnicode_EncodeFSDefault(str)); + } + return str; } -- cgit v1.2.1