Skip to content

Commit

Permalink
Issue python#15989: Fixed some scarcely probable integer overflows.
Browse files Browse the repository at this point in the history
It is very unlikely that they can occur in real code for now.
  • Loading branch information
serhiy-storchaka committed Sep 6, 2015
1 parent 7827a5b commit 56f6e76
Show file tree
Hide file tree
Showing 7 changed files with 27 additions and 23 deletions.
2 changes: 1 addition & 1 deletion Modules/_datetimemodule.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
3 changes: 2 additions & 1 deletion Modules/_io/_iomodule.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down
7 changes: 5 additions & 2 deletions Modules/posixmodule.c
Original file line number Diff line number Diff line change
Expand Up @@ -9481,15 +9481,18 @@ os__getdiskusage_impl(PyModuleDef *module, Py_UNICODE *path)
*/
struct constdef {
char *name;
long value;
int value;
};

static int
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 {
Expand Down
2 changes: 1 addition & 1 deletion Modules/readline.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand Down
24 changes: 12 additions & 12 deletions Objects/structseq.c
Original file line number Diff line number Diff line change
Expand Up @@ -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))

Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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) { \
Expand All @@ -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;
}
Expand Down
2 changes: 1 addition & 1 deletion Python/Python-ast.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
10 changes: 5 additions & 5 deletions Python/pythonrun.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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)
Expand All @@ -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);
Expand Down

0 comments on commit 56f6e76

Please sign in to comment.