the value with filesystem encoding and surrogateescape (instead of utf-8 in strict mode).
This commit is contained in:
parent
1017ae5253
commit
cb04352e8c
|
@ -29,6 +29,10 @@ Core and Builtins
|
|||
Library
|
||||
-------
|
||||
|
||||
- Issue #9579, #9580: Fix os.confstr() for value longer than 255 bytes and
|
||||
encode the value with filesystem encoding and surrogateescape (instead of
|
||||
utf-8 in strict mode).
|
||||
|
||||
- Issue #9632: Remove sys.setfilesystemencoding() function: use
|
||||
PYTHONFSENCODING environment variable to set the filesystem encoding at
|
||||
Python startup. sys.setfilesystemencoding() creates inconsistencies because
|
||||
|
|
|
@ -6721,32 +6721,34 @@ posix_confstr(PyObject *self, PyObject *args)
|
|||
{
|
||||
PyObject *result = NULL;
|
||||
int name;
|
||||
char buffer[256];
|
||||
|
||||
if (PyArg_ParseTuple(args, "O&:confstr", conv_confstr_confname, &name)) {
|
||||
char buffer[255];
|
||||
int len;
|
||||
|
||||
if (!PyArg_ParseTuple(args, "O&:confstr", conv_confstr_confname, &name))
|
||||
return NULL;
|
||||
|
||||
errno = 0;
|
||||
len = confstr(name, buffer, sizeof(buffer));
|
||||
if (len == 0) {
|
||||
if (errno) {
|
||||
posix_error();
|
||||
return NULL;
|
||||
}
|
||||
else {
|
||||
result = Py_None;
|
||||
Py_INCREF(Py_None);
|
||||
Py_RETURN_NONE;
|
||||
}
|
||||
}
|
||||
else {
|
||||
|
||||
if ((unsigned int)len >= sizeof(buffer)) {
|
||||
result = PyUnicode_FromStringAndSize(NULL, len-1);
|
||||
if (result != NULL)
|
||||
confstr(name, _PyUnicode_AsString(result), len);
|
||||
char *buf = PyMem_Malloc(len);
|
||||
if (buf == NULL)
|
||||
return PyErr_NoMemory();
|
||||
confstr(name, buf, len);
|
||||
result = PyUnicode_DecodeFSDefaultAndSize(buf, len-1);
|
||||
PyMem_Free(buf);
|
||||
}
|
||||
else
|
||||
result = PyUnicode_FromStringAndSize(buffer, len-1);
|
||||
}
|
||||
}
|
||||
result = PyUnicode_DecodeFSDefaultAndSize(buffer, len-1);
|
||||
return result;
|
||||
}
|
||||
#endif
|
||||
|
|
Loading…
Reference in New Issue