summaryrefslogtreecommitdiffstats
path: root/Python
diff options
context:
space:
mode:
authorLarry Hastings <larry@hastings.org>2015-09-07 12:16:38 (GMT)
committerLarry Hastings <larry@hastings.org>2015-09-07 12:16:38 (GMT)
commitc8c47f55e636ed86791160944ccbb1ea651476bd (patch)
treedb97b6edb082a98c6ad2abcbacb6151ee2df2049 /Python
parent71f9633818b3a0cbd36b0f6ed164d436b1997fe9 (diff)
parent8c85a2083fdc6188d32f1eb287151cdb7e79a54a (diff)
downloadcpython-c8c47f55e636ed86791160944ccbb1ea651476bd.zip
cpython-c8c47f55e636ed86791160944ccbb1ea651476bd.tar.gz
cpython-c8c47f55e636ed86791160944ccbb1ea651476bd.tar.bz2
Merge heads.
Diffstat (limited to 'Python')
-rw-r--r--Python/codecs.c12
-rw-r--r--Python/pylifecycle.c79
-rw-r--r--Python/pytime.c16
3 files changed, 45 insertions, 62 deletions
diff --git a/Python/codecs.c b/Python/codecs.c
index 596bd80..d90bf73 100644
--- a/Python/codecs.c
+++ b/Python/codecs.c
@@ -966,7 +966,6 @@ PyObject *PyCodec_BackslashReplaceErrors(PyObject *exc)
}
static _PyUnicode_Name_CAPI *ucnhash_CAPI = NULL;
-static int ucnhash_initialized = 0;
PyObject *PyCodec_NameReplaceErrors(PyObject *exc)
{
@@ -988,17 +987,17 @@ PyObject *PyCodec_NameReplaceErrors(PyObject *exc)
return NULL;
if (!(object = PyUnicodeEncodeError_GetObject(exc)))
return NULL;
- if (!ucnhash_initialized) {
+ if (!ucnhash_CAPI) {
/* load the unicode data module */
ucnhash_CAPI = (_PyUnicode_Name_CAPI *)PyCapsule_Import(
PyUnicodeData_CAPSULE_NAME, 1);
- ucnhash_initialized = 1;
+ if (!ucnhash_CAPI)
+ return NULL;
}
for (i = start, ressize = 0; i < end; ++i) {
/* object is guaranteed to be "ready" */
c = PyUnicode_READ_CHAR(object, i);
- if (ucnhash_CAPI &&
- ucnhash_CAPI->getname(NULL, c, buffer, sizeof(buffer), 1)) {
+ if (ucnhash_CAPI->getname(NULL, c, buffer, sizeof(buffer), 1)) {
replsize = 1+1+1+(int)strlen(buffer)+1;
}
else if (c >= 0x10000) {
@@ -1021,8 +1020,7 @@ PyObject *PyCodec_NameReplaceErrors(PyObject *exc)
i < end; ++i) {
c = PyUnicode_READ_CHAR(object, i);
*outp++ = '\\';
- if (ucnhash_CAPI &&
- ucnhash_CAPI->getname(NULL, c, buffer, sizeof(buffer), 1)) {
+ if (ucnhash_CAPI->getname(NULL, c, buffer, sizeof(buffer), 1)) {
*outp++ = 'N';
*outp++ = '{';
strcpy((char *)outp, buffer);
diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c
index a17adf7..df66fa0 100644
--- a/Python/pylifecycle.c
+++ b/Python/pylifecycle.c
@@ -1,4 +1,3 @@
-
/* Python interpreter top-level routines, including init/exit */
#include "Python.h"
@@ -963,6 +962,23 @@ initsite(void)
}
}
+/* Check if a file descriptor is valid or not.
+ Return 0 if the file descriptor is invalid, return non-zero otherwise. */
+static int
+is_valid_fd(int fd)
+{
+ int fd2;
+ if (fd < 0 || !_PyVerify_fd(fd))
+ return 0;
+ _Py_BEGIN_SUPPRESS_IPH
+ fd2 = dup(fd);
+ if (fd2 >= 0)
+ close(fd2);
+ _Py_END_SUPPRESS_IPH
+ return fd2 >= 0;
+}
+
+/* returns Py_None if the fd is not valid */
static PyObject*
create_stdio(PyObject* io,
int fd, int write_mode, char* name,
@@ -978,6 +994,9 @@ create_stdio(PyObject* io,
_Py_IDENTIFIER(TextIOWrapper);
_Py_IDENTIFIER(mode);
+ if (!is_valid_fd(fd))
+ Py_RETURN_NONE;
+
/* stdin is always opened in buffered mode, first because it shouldn't
make a difference in common use cases, second because TextIOWrapper
depends on the presence of a read1() method which only exists on
@@ -1059,21 +1078,15 @@ error:
Py_XDECREF(stream);
Py_XDECREF(text);
Py_XDECREF(raw);
- return NULL;
-}
-static int
-is_valid_fd(int fd)
-{
- int dummy_fd;
- if (fd < 0 || !_PyVerify_fd(fd))
- return 0;
- _Py_BEGIN_SUPPRESS_IPH
- dummy_fd = dup(fd);
- if (dummy_fd >= 0)
- close(dummy_fd);
- _Py_END_SUPPRESS_IPH
- return dummy_fd >= 0;
+ if (PyErr_ExceptionMatches(PyExc_OSError) && !is_valid_fd(fd)) {
+ /* Issue #24891: the file descriptor was closed after the first
+ is_valid_fd() check was called. Ignore the OSError and set the
+ stream to None. */
+ PyErr_Clear();
+ Py_RETURN_NONE;
+ }
+ return NULL;
}
/* Initialize sys.stdin, stdout, stderr and builtins.open */
@@ -1158,30 +1171,18 @@ initstdio(void)
* and fileno() may point to an invalid file descriptor. For example
* GUI apps don't have valid standard streams by default.
*/
- if (!is_valid_fd(fd)) {
- std = Py_None;
- Py_INCREF(std);
- }
- else {
- std = create_stdio(iomod, fd, 0, "<stdin>", encoding, errors);
- if (std == NULL)
- goto error;
- } /* if (fd < 0) */
+ std = create_stdio(iomod, fd, 0, "<stdin>", encoding, errors);
+ if (std == NULL)
+ goto error;
PySys_SetObject("__stdin__", std);
_PySys_SetObjectId(&PyId_stdin, std);
Py_DECREF(std);
/* Set sys.stdout */
fd = fileno(stdout);
- if (!is_valid_fd(fd)) {
- std = Py_None;
- Py_INCREF(std);
- }
- else {
- std = create_stdio(iomod, fd, 1, "<stdout>", encoding, errors);
- if (std == NULL)
- goto error;
- } /* if (fd < 0) */
+ std = create_stdio(iomod, fd, 1, "<stdout>", encoding, errors);
+ if (std == NULL)
+ goto error;
PySys_SetObject("__stdout__", std);
_PySys_SetObjectId(&PyId_stdout, std);
Py_DECREF(std);
@@ -1189,15 +1190,9 @@ initstdio(void)
#if 1 /* Disable this if you have trouble debugging bootstrap stuff */
/* Set sys.stderr, replaces the preliminary stderr */
fd = fileno(stderr);
- if (!is_valid_fd(fd)) {
- std = Py_None;
- Py_INCREF(std);
- }
- else {
- std = create_stdio(iomod, fd, 1, "<stderr>", encoding, "backslashreplace");
- if (std == NULL)
- goto error;
- } /* if (fd < 0) */
+ std = create_stdio(iomod, fd, 1, "<stderr>", encoding, "backslashreplace");
+ if (std == NULL)
+ goto error;
/* Same as hack above, pre-import stderr's codec to avoid recursion
when import.c tries to write to stderr in verbose mode. */
diff --git a/Python/pytime.c b/Python/pytime.c
index 02a9374..77db204 100644
--- a/Python/pytime.c
+++ b/Python/pytime.c
@@ -531,12 +531,8 @@ _PyTime_GetSystemClockWithInfo(_PyTime_t *t, _Py_clock_info_t *info)
static int
-pymonotonic_new(_PyTime_t *tp, _Py_clock_info_t *info, int raise)
+pymonotonic(_PyTime_t *tp, _Py_clock_info_t *info, int raise)
{
-#ifdef Py_DEBUG
- static int last_set = 0;
- static _PyTime_t last = 0;
-#endif
#if defined(MS_WINDOWS)
ULONGLONG result;
@@ -628,12 +624,6 @@ pymonotonic_new(_PyTime_t *tp, _Py_clock_info_t *info, int raise)
if (_PyTime_FromTimespec(tp, &ts, raise) < 0)
return -1;
#endif
-#ifdef Py_DEBUG
- /* monotonic clock cannot go backward */
- assert(!last_set || last <= *tp);
- last = *tp;
- last_set = 1;
-#endif
return 0;
}
@@ -641,7 +631,7 @@ _PyTime_t
_PyTime_GetMonotonicClock(void)
{
_PyTime_t t;
- if (pymonotonic_new(&t, NULL, 0) < 0) {
+ if (pymonotonic(&t, NULL, 0) < 0) {
/* should not happen, _PyTime_Init() checked that monotonic clock at
startup */
assert(0);
@@ -655,7 +645,7 @@ _PyTime_GetMonotonicClock(void)
int
_PyTime_GetMonotonicClockWithInfo(_PyTime_t *tp, _Py_clock_info_t *info)
{
- return pymonotonic_new(tp, info, 1);
+ return pymonotonic(tp, info, 1);
}
int