Commit c971879d authored by Serhiy Storchaka's avatar Serhiy Storchaka

Issue #25182: The stdprinter (used as sys.stderr before the io module is

imported at startup) now uses the backslashreplace error handler.
parent 13594af0
...@@ -10,6 +10,9 @@ Release date: tba ...@@ -10,6 +10,9 @@ Release date: tba
Core and Builtins Core and Builtins
----------------- -----------------
- Issue #25182: The stdprinter (used as sys.stderr before the io module is
imported at startup) now uses the backslashreplace error handler.
- Issue #24891: Fix a race condition at Python startup if the file descriptor - Issue #24891: Fix a race condition at Python startup if the file descriptor
of stdin (0), stdout (1) or stderr (2) is closed while Python is creating of stdin (0), stdout (1) or stderr (2) is closed while Python is creating
sys.stdin, sys.stdout and sys.stderr objects. These attributes are now set sys.stdin, sys.stdout and sys.stderr objects. These attributes are now set
......
...@@ -372,8 +372,11 @@ PyFile_NewStdPrinter(int fd) ...@@ -372,8 +372,11 @@ PyFile_NewStdPrinter(int fd)
static PyObject * static PyObject *
stdprinter_write(PyStdPrinter_Object *self, PyObject *args) stdprinter_write(PyStdPrinter_Object *self, PyObject *args)
{ {
char *c; PyObject *unicode;
PyObject *bytes = NULL;
char *str;
Py_ssize_t n; Py_ssize_t n;
int _errno;
if (self->fd < 0) { if (self->fd < 0) {
/* fd might be invalid on Windows /* fd might be invalid on Windows
...@@ -383,24 +386,37 @@ stdprinter_write(PyStdPrinter_Object *self, PyObject *args) ...@@ -383,24 +386,37 @@ stdprinter_write(PyStdPrinter_Object *self, PyObject *args)
Py_RETURN_NONE; Py_RETURN_NONE;
} }
if (!PyArg_ParseTuple(args, "s", &c)) { if (!PyArg_ParseTuple(args, "U", &unicode))
return NULL; return NULL;
/* encode Unicode to UTF-8 */
str = PyUnicode_AsUTF8AndSize(unicode, &n);
if (str == NULL) {
PyErr_Clear();
bytes = _PyUnicode_AsUTF8String(unicode, "backslashreplace");
if (bytes == NULL)
return NULL;
if (PyBytes_AsStringAndSize(bytes, &str, &n) < 0) {
Py_DECREF(bytes);
return NULL;
}
} }
n = strlen(c);
Py_BEGIN_ALLOW_THREADS Py_BEGIN_ALLOW_THREADS
errno = 0; errno = 0;
#ifdef MS_WINDOWS #ifdef MS_WINDOWS
if (n > INT_MAX) if (n > INT_MAX)
n = INT_MAX; n = INT_MAX;
n = write(self->fd, c, (int)n); n = write(self->fd, str, (int)n);
#else #else
n = write(self->fd, c, n); n = write(self->fd, str, n);
#endif #endif
_errno = errno;
Py_END_ALLOW_THREADS Py_END_ALLOW_THREADS
Py_XDECREF(bytes);
if (n < 0) { if (n < 0) {
if (errno == EAGAIN) if (_errno == EAGAIN)
Py_RETURN_NONE; Py_RETURN_NONE;
PyErr_SetFromErrno(PyExc_IOError); PyErr_SetFromErrno(PyExc_IOError);
return NULL; return NULL;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment