mirror of
https://github.com/python/cpython.git
synced 2025-12-10 02:50:09 +00:00
- Issue #17782: Fix undefined behaviour on platforms where `struct timespec`'s "tv_nsec" member is not a C long.
This commit is contained in:
parent
b38897fc91
commit
cf8a1e51ec
4 changed files with 21 additions and 4 deletions
|
|
@ -12,6 +12,9 @@ What's New in Python 3.3.2?
|
||||||
Core and Builtins
|
Core and Builtins
|
||||||
-----------------
|
-----------------
|
||||||
|
|
||||||
|
- Issue #17782: Fix undefined behaviour on platforms where
|
||||||
|
``struct timespec``'s "tv_nsec" member is not a C long.
|
||||||
|
|
||||||
- Issue #17715: Fix segmentation fault from raising an exception in a __trunc__
|
- Issue #17715: Fix segmentation fault from raising an exception in a __trunc__
|
||||||
method.
|
method.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -4775,6 +4775,8 @@ posix_utime(PyObject *self, PyObject *args, PyObject *kwargs)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (times && (times != Py_None)) {
|
if (times && (times != Py_None)) {
|
||||||
|
time_t a_sec, m_sec;
|
||||||
|
long a_nsec, m_nsec;
|
||||||
if (!PyTuple_CheckExact(times) || (PyTuple_Size(times) != 2)) {
|
if (!PyTuple_CheckExact(times) || (PyTuple_Size(times) != 2)) {
|
||||||
PyErr_SetString(PyExc_TypeError,
|
PyErr_SetString(PyExc_TypeError,
|
||||||
"utime: 'times' must be either"
|
"utime: 'times' must be either"
|
||||||
|
|
@ -4783,11 +4785,15 @@ posix_utime(PyObject *self, PyObject *args, PyObject *kwargs)
|
||||||
}
|
}
|
||||||
utime.now = 0;
|
utime.now = 0;
|
||||||
if (_PyTime_ObjectToTimespec(PyTuple_GET_ITEM(times, 0),
|
if (_PyTime_ObjectToTimespec(PyTuple_GET_ITEM(times, 0),
|
||||||
&utime.atime_s, &utime.atime_ns) == -1 ||
|
&a_sec, &a_nsec) == -1 ||
|
||||||
_PyTime_ObjectToTimespec(PyTuple_GET_ITEM(times, 1),
|
_PyTime_ObjectToTimespec(PyTuple_GET_ITEM(times, 1),
|
||||||
&utime.mtime_s, &utime.mtime_ns) == -1) {
|
&m_sec, &m_nsec) == -1) {
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
|
utime.atime_s = a_sec;
|
||||||
|
utime.atime_ns = a_nsec;
|
||||||
|
utime.mtime_s = m_sec;
|
||||||
|
utime.mtime_ns = m_nsec;
|
||||||
}
|
}
|
||||||
else if (ns) {
|
else if (ns) {
|
||||||
if (!PyTuple_CheckExact(ns) || (PyTuple_Size(ns) != 2)) {
|
if (!PyTuple_CheckExact(ns) || (PyTuple_Size(ns) != 2)) {
|
||||||
|
|
|
||||||
|
|
@ -784,14 +784,18 @@ signal_sigtimedwait(PyObject *self, PyObject *args)
|
||||||
struct timespec buf;
|
struct timespec buf;
|
||||||
sigset_t set;
|
sigset_t set;
|
||||||
siginfo_t si;
|
siginfo_t si;
|
||||||
|
time_t tv_sec;
|
||||||
|
long tv_nsec;
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
if (!PyArg_ParseTuple(args, "OO:sigtimedwait",
|
if (!PyArg_ParseTuple(args, "OO:sigtimedwait",
|
||||||
&signals, &timeout))
|
&signals, &timeout))
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
if (_PyTime_ObjectToTimespec(timeout, &buf.tv_sec, &buf.tv_nsec) == -1)
|
if (_PyTime_ObjectToTimespec(timeout, &tv_sec, &tv_nsec) == -1)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
buf.tv_sec = tv_sec;
|
||||||
|
buf.tv_nsec = tv_nsec;
|
||||||
|
|
||||||
if (buf.tv_sec < 0 || buf.tv_nsec < 0) {
|
if (buf.tv_sec < 0 || buf.tv_nsec < 0) {
|
||||||
PyErr_SetString(PyExc_ValueError, "timeout must be non-negative");
|
PyErr_SetString(PyExc_ValueError, "timeout must be non-negative");
|
||||||
|
|
|
||||||
|
|
@ -195,14 +195,18 @@ time_clock_settime(PyObject *self, PyObject *args)
|
||||||
{
|
{
|
||||||
int clk_id;
|
int clk_id;
|
||||||
PyObject *obj;
|
PyObject *obj;
|
||||||
|
time_t tv_sec;
|
||||||
|
long tv_nsec;
|
||||||
struct timespec tp;
|
struct timespec tp;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
if (!PyArg_ParseTuple(args, "iO:clock_settime", &clk_id, &obj))
|
if (!PyArg_ParseTuple(args, "iO:clock_settime", &clk_id, &obj))
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
if (_PyTime_ObjectToTimespec(obj, &tp.tv_sec, &tp.tv_nsec) == -1)
|
if (_PyTime_ObjectToTimespec(obj, &tv_sec, &tv_nsec) == -1)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
tp.tv_sec = tv_sec;
|
||||||
|
tp.tv_nsec = tv_nsec;
|
||||||
|
|
||||||
ret = clock_settime((clockid_t)clk_id, &tp);
|
ret = clock_settime((clockid_t)clk_id, &tp);
|
||||||
if (ret != 0) {
|
if (ret != 0) {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue