Issue #15989: Fixed some scarcely probable integer overflows.
It is very unlikely that they can occur in real code for now.
This commit is contained in:
parent
7827a5b7c2
commit
56f6e76c68
|
@ -4692,7 +4692,7 @@ local_timezone(PyDateTime_DateTime *utc_time)
|
|||
if (seconds == NULL)
|
||||
goto error;
|
||||
Py_DECREF(delta);
|
||||
timestamp = PyLong_AsLong(seconds);
|
||||
timestamp = _PyLong_AsTime_t(seconds);
|
||||
Py_DECREF(seconds);
|
||||
if (timestamp == -1 && PyErr_Occurred())
|
||||
return NULL;
|
||||
|
|
|
@ -238,7 +238,8 @@ _io_open_impl(PyModuleDef *module, PyObject *file, const char *mode,
|
|||
int text = 0, binary = 0, universal = 0;
|
||||
|
||||
char rawmode[6], *m;
|
||||
int line_buffering, isatty;
|
||||
int line_buffering;
|
||||
long isatty;
|
||||
|
||||
PyObject *raw, *modeobj = NULL, *buffer, *wrapper, *result = NULL;
|
||||
|
||||
|
|
|
@ -9481,7 +9481,7 @@ os__getdiskusage_impl(PyModuleDef *module, Py_UNICODE *path)
|
|||
*/
|
||||
struct constdef {
|
||||
char *name;
|
||||
long value;
|
||||
int value;
|
||||
};
|
||||
|
||||
static int
|
||||
|
@ -9489,7 +9489,10 @@ conv_confname(PyObject *arg, int *valuep, struct constdef *table,
|
|||
size_t tablesize)
|
||||
{
|
||||
if (PyLong_Check(arg)) {
|
||||
*valuep = PyLong_AS_LONG(arg);
|
||||
int value = _PyLong_AsInt(arg);
|
||||
if (value == -1 && PyErr_Occurred())
|
||||
return 0;
|
||||
*valuep = value;
|
||||
return 1;
|
||||
}
|
||||
else {
|
||||
|
|
|
@ -840,7 +840,7 @@ on_hook(PyObject *func)
|
|||
if (r == Py_None)
|
||||
result = 0;
|
||||
else {
|
||||
result = PyLong_AsLong(r);
|
||||
result = _PyLong_AsInt(r);
|
||||
if (result == -1 && PyErr_Occurred())
|
||||
goto error;
|
||||
}
|
||||
|
|
|
@ -16,14 +16,14 @@ _Py_IDENTIFIER(n_fields);
|
|||
_Py_IDENTIFIER(n_unnamed_fields);
|
||||
|
||||
#define VISIBLE_SIZE(op) Py_SIZE(op)
|
||||
#define VISIBLE_SIZE_TP(tp) PyLong_AsLong( \
|
||||
#define VISIBLE_SIZE_TP(tp) PyLong_AsSsize_t( \
|
||||
_PyDict_GetItemId((tp)->tp_dict, &PyId_n_sequence_fields))
|
||||
|
||||
#define REAL_SIZE_TP(tp) PyLong_AsLong( \
|
||||
#define REAL_SIZE_TP(tp) PyLong_AsSsize_t( \
|
||||
_PyDict_GetItemId((tp)->tp_dict, &PyId_n_fields))
|
||||
#define REAL_SIZE(op) REAL_SIZE_TP(Py_TYPE(op))
|
||||
|
||||
#define UNNAMED_FIELDS_TP(tp) PyLong_AsLong( \
|
||||
#define UNNAMED_FIELDS_TP(tp) PyLong_AsSsize_t( \
|
||||
_PyDict_GetItemId((tp)->tp_dict, &PyId_n_unnamed_fields))
|
||||
#define UNNAMED_FIELDS(op) UNNAMED_FIELDS_TP(Py_TYPE(op))
|
||||
|
||||
|
@ -164,7 +164,8 @@ structseq_repr(PyStructSequence *obj)
|
|||
#define TYPE_MAXSIZE 100
|
||||
|
||||
PyTypeObject *typ = Py_TYPE(obj);
|
||||
int i, removelast = 0;
|
||||
Py_ssize_t i;
|
||||
int removelast = 0;
|
||||
Py_ssize_t len;
|
||||
char buf[REPR_BUFFER_SIZE];
|
||||
char *endofbuf, *pbuf = buf;
|
||||
|
@ -236,8 +237,7 @@ structseq_reduce(PyStructSequence* self)
|
|||
PyObject* tup = NULL;
|
||||
PyObject* dict = NULL;
|
||||
PyObject* result;
|
||||
Py_ssize_t n_fields, n_visible_fields, n_unnamed_fields;
|
||||
int i;
|
||||
Py_ssize_t n_fields, n_visible_fields, n_unnamed_fields, i;
|
||||
|
||||
n_fields = REAL_SIZE(self);
|
||||
n_visible_fields = VISIBLE_SIZE(self);
|
||||
|
@ -325,7 +325,7 @@ PyStructSequence_InitType2(PyTypeObject *type, PyStructSequence_Desc *desc)
|
|||
{
|
||||
PyObject *dict;
|
||||
PyMemberDef* members;
|
||||
int n_members, n_unnamed_members, i, k;
|
||||
Py_ssize_t n_members, n_unnamed_members, i, k;
|
||||
PyObject *v;
|
||||
|
||||
#ifdef Py_TRACE_REFS
|
||||
|
@ -373,9 +373,9 @@ PyStructSequence_InitType2(PyTypeObject *type, PyStructSequence_Desc *desc)
|
|||
Py_INCREF(type);
|
||||
|
||||
dict = type->tp_dict;
|
||||
#define SET_DICT_FROM_INT(key, value) \
|
||||
#define SET_DICT_FROM_SIZE(key, value) \
|
||||
do { \
|
||||
v = PyLong_FromLong((long) value); \
|
||||
v = PyLong_FromSsize_t(value); \
|
||||
if (v == NULL) \
|
||||
return -1; \
|
||||
if (PyDict_SetItemString(dict, key, v) < 0) { \
|
||||
|
@ -385,9 +385,9 @@ PyStructSequence_InitType2(PyTypeObject *type, PyStructSequence_Desc *desc)
|
|||
Py_DECREF(v); \
|
||||
} while (0)
|
||||
|
||||
SET_DICT_FROM_INT(visible_length_key, desc->n_in_sequence);
|
||||
SET_DICT_FROM_INT(real_length_key, n_members);
|
||||
SET_DICT_FROM_INT(unnamed_fields_key, n_unnamed_members);
|
||||
SET_DICT_FROM_SIZE(visible_length_key, desc->n_in_sequence);
|
||||
SET_DICT_FROM_SIZE(real_length_key, n_members);
|
||||
SET_DICT_FROM_SIZE(unnamed_fields_key, n_unnamed_members);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -769,7 +769,7 @@ static int obj2ast_int(PyObject* obj, int* out, PyArena* arena)
|
|||
return 1;
|
||||
}
|
||||
|
||||
i = (int)PyLong_AsLong(obj);
|
||||
i = _PyLong_AsInt(obj);
|
||||
if (i == -1 && PyErr_Occurred())
|
||||
return 1;
|
||||
*out = i;
|
||||
|
|
|
@ -431,7 +431,7 @@ static int
|
|||
parse_syntax_error(PyObject *err, PyObject **message, PyObject **filename,
|
||||
int *lineno, int *offset, PyObject **text)
|
||||
{
|
||||
long hold;
|
||||
int hold;
|
||||
PyObject *v;
|
||||
_Py_IDENTIFIER(msg);
|
||||
_Py_IDENTIFIER(filename);
|
||||
|
@ -464,11 +464,11 @@ parse_syntax_error(PyObject *err, PyObject **message, PyObject **filename,
|
|||
v = _PyObject_GetAttrId(err, &PyId_lineno);
|
||||
if (!v)
|
||||
goto finally;
|
||||
hold = PyLong_AsLong(v);
|
||||
hold = _PyLong_AsInt(v);
|
||||
Py_DECREF(v);
|
||||
if (hold < 0 && PyErr_Occurred())
|
||||
goto finally;
|
||||
*lineno = (int)hold;
|
||||
*lineno = hold;
|
||||
|
||||
v = _PyObject_GetAttrId(err, &PyId_offset);
|
||||
if (!v)
|
||||
|
@ -477,11 +477,11 @@ parse_syntax_error(PyObject *err, PyObject **message, PyObject **filename,
|
|||
*offset = -1;
|
||||
Py_DECREF(v);
|
||||
} else {
|
||||
hold = PyLong_AsLong(v);
|
||||
hold = _PyLong_AsInt(v);
|
||||
Py_DECREF(v);
|
||||
if (hold < 0 && PyErr_Occurred())
|
||||
goto finally;
|
||||
*offset = (int)hold;
|
||||
*offset = hold;
|
||||
}
|
||||
|
||||
v = _PyObject_GetAttrId(err, &PyId_text);
|
||||
|
|
Loading…
Reference in New Issue