diff -r 2eaaa7b0e7a9 Include/intobject.h --- a/Include/intobject.h Wed Oct 03 02:14:14 2012 +0200 +++ b/Include/intobject.h Wed Oct 03 16:28:31 2012 +0300 @@ -40,6 +40,7 @@ PyAPI_FUNC(PyObject *) PyInt_FromSsize_t(Py_ssize_t); PyAPI_FUNC(long) PyInt_AsLong(PyObject *); PyAPI_FUNC(Py_ssize_t) PyInt_AsSsize_t(PyObject *); +PyAPI_FUNC(int) _PyInt_AsInt(PyObject *); PyAPI_FUNC(unsigned long) PyInt_AsUnsignedLongMask(PyObject *); #ifdef HAVE_LONG_LONG PyAPI_FUNC(unsigned PY_LONG_LONG) PyInt_AsUnsignedLongLongMask(PyObject *); diff -r 2eaaa7b0e7a9 Include/longobject.h --- a/Include/longobject.h Wed Oct 03 02:14:14 2012 +0200 +++ b/Include/longobject.h Wed Oct 03 16:28:31 2012 +0300 @@ -25,6 +25,7 @@ PyAPI_FUNC(unsigned long) PyLong_AsUnsignedLong(PyObject *); PyAPI_FUNC(unsigned long) PyLong_AsUnsignedLongMask(PyObject *); PyAPI_FUNC(Py_ssize_t) PyLong_AsSsize_t(PyObject *); +PyAPI_FUNC(int) _PyLong_AsInt(PyObject *); PyAPI_FUNC(PyObject *) PyLong_GetInfo(void); /* For use by intobject.c only */ diff -r 2eaaa7b0e7a9 Modules/_ctypes/stgdict.c --- a/Modules/_ctypes/stgdict.c Wed Oct 03 02:14:14 2012 +0200 +++ b/Modules/_ctypes/stgdict.c Wed Oct 03 16:28:31 2012 +0300 @@ -343,7 +343,7 @@ isPacked = PyObject_GetAttrString(type, "_pack_"); if (isPacked) { - pack = PyInt_AsLong(isPacked); + pack = _PyInt_AsInt(isPacked); if (pack < 0 || PyErr_Occurred()) { Py_XDECREF(isPacked); PyErr_SetString(PyExc_ValueError, diff -r 2eaaa7b0e7a9 Modules/_io/_iomodule.c --- a/Modules/_io/_iomodule.c Wed Oct 03 02:14:14 2012 +0200 +++ b/Modules/_io/_iomodule.c Wed Oct 03 16:28:31 2012 +0300 @@ -300,7 +300,8 @@ int text = 0, binary = 0, universal = 0; char rawmode[5], *m; - int line_buffering, isatty; + int line_buffering; + long isatty; PyObject *raw, *modeobj = NULL, *buffer = NULL, *wrapper = NULL; @@ -443,12 +444,12 @@ #ifdef HAVE_STRUCT_STAT_ST_BLKSIZE { struct stat st; - long fileno; + int fileno; PyObject *res = PyObject_CallMethod(raw, "fileno", NULL); if (res == NULL) goto error; - fileno = PyInt_AsLong(res); + fileno = _PyInt_AsInt(res); Py_DECREF(res); if (fileno == -1 && PyErr_Occurred()) goto error; diff -r 2eaaa7b0e7a9 Modules/_io/fileio.c --- a/Modules/_io/fileio.c Wed Oct 03 02:14:14 2012 +0200 +++ b/Modules/_io/fileio.c Wed Oct 03 16:28:31 2012 +0300 @@ -211,7 +211,7 @@ return -1; } - fd = PyLong_AsLong(nameobj); + fd = _PyLong_AsInt(nameobj); if (fd < 0) { if (!PyErr_Occurred()) { PyErr_SetString(PyExc_ValueError, diff -r 2eaaa7b0e7a9 Modules/_sqlite/connection.c --- a/Modules/_sqlite/connection.c Wed Oct 03 02:14:14 2012 +0200 +++ b/Modules/_sqlite/connection.c Wed Oct 03 16:28:31 2012 +0300 @@ -935,7 +935,7 @@ rc = SQLITE_DENY; } else { if (PyInt_Check(ret)) { - rc = (int)PyInt_AsLong(ret); + rc = _PyInt_AsInt(ret); } else { rc = SQLITE_DENY; } @@ -1360,7 +1360,7 @@ goto finally; } - result = PyInt_AsLong(retval); + result = _PyInt_AsInt(retval); if (PyErr_Occurred()) { result = 0; } diff -r 2eaaa7b0e7a9 Modules/grpmodule.c --- a/Modules/grpmodule.c Wed Oct 03 02:14:14 2012 +0200 +++ b/Modules/grpmodule.c Wed Oct 03 16:28:31 2012 +0300 @@ -86,7 +86,7 @@ grp_getgrgid(PyObject *self, PyObject *pyo_id) { PyObject *py_int_id; - unsigned int gid; + long gid; struct group *p; py_int_id = PyNumber_Int(pyo_id); @@ -94,9 +94,16 @@ return NULL; gid = PyInt_AS_LONG(py_int_id); Py_DECREF(py_int_id); + if (gid == -1 && PyErr_Occurred()) + return NULL; + if ((long)(gid_t)gid != gid) { + PyErr_SetString(PyExc_OverflowError, + "Python int too large to convert to gid_t"); + return NULL; + } - if ((p = getgrgid(gid)) == NULL) { - PyErr_Format(PyExc_KeyError, "getgrgid(): gid not found: %d", gid); + if ((p = getgrgid((gid_t)gid)) == NULL) { + PyErr_Format(PyExc_KeyError, "getgrgid(): gid not found: %d", gid); return NULL; } return mkgrent(p); diff -r 2eaaa7b0e7a9 Modules/parsermodule.c --- a/Modules/parsermodule.c Wed Oct 03 02:14:14 2012 +0200 +++ b/Modules/parsermodule.c Wed Oct 03 16:28:31 2012 +0300 @@ -744,7 +744,7 @@ /* elem must always be a sequence, however simple */ PyObject* elem = PySequence_GetItem(tuple, i); int ok = elem != NULL; - long type = 0; + int type = 0; char *strn = 0; if (ok) @@ -755,8 +755,14 @@ ok = 0; else { ok = PyInt_Check(temp); - if (ok) - type = PyInt_AS_LONG(temp); + if (ok) { + type = _PyInt_AsInt(temp); + if (type == -1 && PyErr_Occurred()) { + Py_DECREF(temp); + Py_DECREF(elem); + return 0; + } + } Py_DECREF(temp); } } @@ -790,8 +796,16 @@ if (len == 3) { PyObject *o = PySequence_GetItem(elem, 2); if (o != NULL) { - if (PyInt_Check(o)) - *line_num = PyInt_AS_LONG(o); + if (PyInt_Check(o)) { + int num = _PyInt_AsInt(o); + if (num == -1 && PyErr_Occurred()) { + Py_DECREF(o); + Py_DECREF(temp); + Py_DECREF(elem); + return 0; + } + *line_num = num; + } else { PyErr_Format(parser_error, "third item in terminal node must be an" diff -r 2eaaa7b0e7a9 Modules/posixmodule.c --- a/Modules/posixmodule.c Wed Oct 03 02:14:14 2012 +0200 +++ b/Modules/posixmodule.c Wed Oct 03 16:28:31 2012 +0300 @@ -7465,7 +7465,7 @@ */ struct constdef { char *name; - long value; + int value; }; static int @@ -7473,7 +7473,10 @@ size_t tablesize) { if (PyInt_Check(arg)) { - *valuep = PyInt_AS_LONG(arg); + int value = _PyInt_AsInt(arg); + if (value == -1 && PyErr_Occurred()) + return 0; + *valuep = value; return 1; } if (PyString_Check(arg)) { diff -r 2eaaa7b0e7a9 Modules/readline.c --- a/Modules/readline.c Wed Oct 03 02:14:14 2012 +0200 +++ b/Modules/readline.c Wed Oct 03 16:28:31 2012 +0300 @@ -717,7 +717,7 @@ if (r == Py_None) result = 0; else { - result = PyInt_AsLong(r); + result = _PyInt_AsInt(r); if (result == -1 && PyErr_Occurred()) goto error; } diff -r 2eaaa7b0e7a9 Modules/selectmodule.c --- a/Modules/selectmodule.c Wed Oct 03 02:14:14 2012 +0200 +++ b/Modules/selectmodule.c Wed Oct 03 16:28:31 2012 +0300 @@ -346,10 +346,13 @@ i = pos = 0; while (PyDict_Next(self->dict, &pos, &key, &value)) { - self->ufds[i].fd = PyInt_AsLong(key); + assert(i < self->ufd_len); + /* Never overflow */ + self->ufds[i].fd = (int)PyInt_AsLong(key); self->ufds[i].events = (short)PyInt_AsLong(value); i++; } + assert(i == self->ufd_len); self->ufd_uptodate = 1; return 1; } @@ -365,10 +368,11 @@ poll_register(pollObject *self, PyObject *args) { PyObject *o, *key, *value; - int fd, events = POLLIN | POLLPRI | POLLOUT; + int fd; + short events = POLLIN | POLLPRI | POLLOUT; int err; - if (!PyArg_ParseTuple(args, "O|i:register", &o, &events)) { + if (!PyArg_ParseTuple(args, "O|h:register", &o, &events)) { return NULL; } @@ -506,7 +510,7 @@ tout = PyNumber_Int(tout); if (!tout) return NULL; - timeout = PyInt_AsLong(tout); + timeout = _PyInt_AsInt(tout); Py_DECREF(tout); if (timeout == -1 && PyErr_Occurred()) return NULL; diff -r 2eaaa7b0e7a9 Modules/socketmodule.c --- a/Modules/socketmodule.c Wed Oct 03 02:14:14 2012 +0200 +++ b/Modules/socketmodule.c Wed Oct 03 16:28:31 2012 +0300 @@ -1713,7 +1713,7 @@ static PyObject * sock_setblocking(PySocketSockObject *s, PyObject *arg) { - int block; + long block; block = PyInt_AsLong(arg); if (block == -1 && PyErr_Occurred()) @@ -2243,7 +2243,7 @@ int backlog; int res; - backlog = PyInt_AsLong(arg); + backlog = _PyInt_AsInt(arg); if (backlog == -1 && PyErr_Occurred()) return NULL; Py_BEGIN_ALLOW_THREADS @@ -2894,7 +2894,7 @@ int how; int res; - how = PyInt_AsLong(arg); + how = _PyInt_AsInt(arg); if (how == -1 && PyErr_Occurred()) return NULL; Py_BEGIN_ALLOW_THREADS diff -r 2eaaa7b0e7a9 Objects/fileobject.c --- a/Objects/fileobject.c Wed Oct 03 02:14:14 2012 +0200 +++ b/Objects/fileobject.c Wed Oct 03 16:28:31 2012 +0300 @@ -2657,10 +2657,10 @@ PyObject *meth; if (PyInt_Check(o)) { - fd = PyInt_AsLong(o); + fd = _PyInt_AsInt(o); } else if (PyLong_Check(o)) { - fd = PyLong_AsLong(o); + fd = _PyLong_AsInt(o); } else if ((meth = PyObject_GetAttrString(o, "fileno")) != NULL) { @@ -2670,11 +2670,11 @@ return -1; if (PyInt_Check(fno)) { - fd = PyInt_AsLong(fno); + fd = _PyInt_AsInt(fno); Py_DECREF(fno); } else if (PyLong_Check(fno)) { - fd = PyLong_AsLong(fno); + fd = _PyLong_AsInt(fno); Py_DECREF(fno); } else { diff -r 2eaaa7b0e7a9 Objects/intobject.c --- a/Objects/intobject.c Wed Oct 03 02:14:14 2012 +0200 +++ b/Objects/intobject.c Wed Oct 03 16:28:31 2012 +0300 @@ -189,6 +189,20 @@ return val; } +int +_PyInt_AsInt(PyObject *obj) +{ + long result = PyInt_AsLong(obj); + if (result == -1 && PyErr_Occurred()) + return -1; + if (result > INT_MAX || result < INT_MIN) { + PyErr_SetString(PyExc_OverflowError, + "Python int too large to convert to C int"); + return -1; + } + return (int)result; +} + Py_ssize_t PyInt_AsSsize_t(register PyObject *op) { diff -r 2eaaa7b0e7a9 Objects/longobject.c --- a/Objects/longobject.c Wed Oct 03 02:14:14 2012 +0200 +++ b/Objects/longobject.c Wed Oct 03 16:28:31 2012 +0300 @@ -339,6 +339,24 @@ return result; } +/* Get a C int from a long int object or any object that has an __int__ + method. Return -1 and set an error if overflow occurs. */ + +int +_PyLong_AsInt(PyObject *obj) +{ + int overflow; + long result = PyLong_AsLongAndOverflow(obj, &overflow); + if (overflow || result > INT_MAX || result < INT_MIN) { + /* XXX: could be cute and give a different + message for overflow == -1 */ + PyErr_SetString(PyExc_OverflowError, + "Python int too large to convert to C int"); + return -1; + } + return (int)result; +} + /* Get a Py_ssize_t from a long int object. Returns -1 and sets an error condition if overflow occurs. */ diff -r 2eaaa7b0e7a9 Objects/structseq.c --- a/Objects/structseq.c Wed Oct 03 02:14:14 2012 +0200 +++ b/Objects/structseq.c Wed Oct 03 16:28:31 2012 +0300 @@ -14,14 +14,14 @@ char *PyStructSequence_UnnamedField = "unnamed field"; #define VISIBLE_SIZE(op) Py_SIZE(op) -#define VISIBLE_SIZE_TP(tp) PyInt_AsLong( \ +#define VISIBLE_SIZE_TP(tp) PyInt_AsSsize_t( \ PyDict_GetItemString((tp)->tp_dict, visible_length_key)) -#define REAL_SIZE_TP(tp) PyInt_AsLong( \ +#define REAL_SIZE_TP(tp) PyInt_AsSsize_t( \ PyDict_GetItemString((tp)->tp_dict, real_length_key)) #define REAL_SIZE(op) REAL_SIZE_TP(Py_TYPE(op)) -#define UNNAMED_FIELDS_TP(tp) PyInt_AsLong( \ +#define UNNAMED_FIELDS_TP(tp) PyInt_AsSsize_t( \ PyDict_GetItemString((tp)->tp_dict, unnamed_fields_key)) #define UNNAMED_FIELDS(op) UNNAMED_FIELDS_TP(Py_TYPE(op)) @@ -239,7 +239,8 @@ PyObject *tup; 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; @@ -374,8 +375,7 @@ PyObject* tup; PyObject* dict; 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); @@ -478,7 +478,7 @@ { PyObject *dict; PyMemberDef* members; - int n_members, n_unnamed_members, i, k; + Py_ssize_t n_members, n_unnamed_members, i, k; #ifdef Py_TRACE_REFS /* if the type object was chained, unchain it first @@ -525,16 +525,16 @@ Py_INCREF(type); dict = type->tp_dict; -#define SET_DICT_FROM_INT(key, value) \ +#define SET_DICT_FROM_SIZE(key, value) \ do { \ - PyObject *v = PyInt_FromLong((long) value); \ + PyObject *v = PyInt_FromSsize_t(value); \ if (v != NULL) { \ PyDict_SetItemString(dict, key, v); \ 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); } diff -r 2eaaa7b0e7a9 Objects/unicodeobject.c --- a/Objects/unicodeobject.c Wed Oct 03 02:14:14 2012 +0200 +++ b/Objects/unicodeobject.c Wed Oct 03 16:28:31 2012 +0300 @@ -8380,7 +8380,9 @@ "* wants int"); goto onError; } - width = PyInt_AsLong(v); + width = PyInt_AsSsize_t(v); + if (width == -1 && PyErr_Occurred()) + goto onError; if (width < 0) { flags |= F_LJUST; width = -width; @@ -8415,7 +8417,9 @@ "* wants int"); goto onError; } - prec = PyInt_AsLong(v); + prec = _PyInt_AsInt(v); + if (prec == -1 && PyErr_Occurred()) + goto onError; if (prec < 0) prec = 0; if (--fmtcnt >= 0) diff -r 2eaaa7b0e7a9 Python/Python-ast.c --- a/Python/Python-ast.c Wed Oct 03 02:14:14 2012 +0200 +++ b/Python/Python-ast.c Wed Oct 03 16:28:31 2012 +0300 @@ -626,7 +626,7 @@ return 1; } - i = (int)PyLong_AsLong(obj); + i = _PyLong_AsInt(obj); if (i == -1 && PyErr_Occurred()) return 1; *out = i; diff -r 2eaaa7b0e7a9 Python/compile.c --- a/Python/compile.c Wed Oct 03 02:14:14 2012 +0200 +++ b/Python/compile.c Wed Oct 03 16:28:31 2012 +0300 @@ -995,6 +995,12 @@ Py_DECREF(t); return -1; } + arg = _PyInt_AsInt(v); + if (arg == -1 && PyErr_Occurred()) { + Py_DECREF(t); + Py_DECREF(v); + return -1; + } if (PyDict_SetItem(dict, t, v) < 0) { Py_DECREF(t); Py_DECREF(v); @@ -1003,7 +1009,7 @@ Py_DECREF(v); } else - arg = PyInt_AsLong(v); + arg = _PyInt_AsInt(v); Py_DECREF(t); return arg; } diff -r 2eaaa7b0e7a9 Python/pythonrun.c --- a/Python/pythonrun.c Wed Oct 03 02:14:14 2012 +0200 +++ b/Python/pythonrun.c Wed Oct 03 16:28:31 2012 +0300 @@ -981,7 +981,7 @@ parse_syntax_error(PyObject *err, PyObject **message, const char **filename, int *lineno, int *offset, const char **text) { - long hold; + int hold; PyObject *v; /* old style errors */ @@ -1013,11 +1013,11 @@ v = PyObject_GetAttrString(err, "lineno"); if (!v) goto finally; - hold = PyInt_AsLong(v); + hold = _PyInt_AsInt(v); Py_DECREF(v); if (hold < 0 && PyErr_Occurred()) goto finally; - *lineno = (int)hold; + *lineno = hold; v = PyObject_GetAttrString(err, "offset"); if (!v) @@ -1026,11 +1026,11 @@ *offset = -1; Py_DECREF(v); } else { - hold = PyInt_AsLong(v); + hold = _PyInt_AsInt(v); Py_DECREF(v); if (hold < 0 && PyErr_Occurred()) goto finally; - *offset = (int)hold; + *offset = hold; } v = PyObject_GetAttrString(err, "text");