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