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:
Serhiy Storchaka 2015-09-06 21:25:30 +03:00
parent 7827a5b7c2
commit 56f6e76c68
7 changed files with 27 additions and 23 deletions

View File

@ -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;

View File

@ -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;

View File

@ -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 {

View File

@ -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;
} }

View File

@ -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;
} }

View File

@ -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;

View File

@ -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);