Change int to Py_ssize_t in several places.

Add (int) casts to silence compiler warnings.
Raise Python exceptions for overflows.
This commit is contained in:
Martin v. Löwis 2006-03-07 12:08:51 +00:00
parent 8eb8a829c1
commit 725507b52e
11 changed files with 57 additions and 32 deletions

View File

@ -2317,9 +2317,9 @@ posix__exit(PyObject *self, PyObject *args)
#if defined(HAVE_EXECV) || defined(HAVE_SPAWNV) #if defined(HAVE_EXECV) || defined(HAVE_SPAWNV)
static void static void
free_string_array(char **array, int count) free_string_array(char **array, Py_ssize_t count)
{ {
int i; Py_ssize_t i;
for (i = 0; i < count; i++) for (i = 0; i < count; i++)
PyMem_Free(array[i]); PyMem_Free(array[i]);
PyMem_DEL(array); PyMem_DEL(array);
@ -2341,7 +2341,7 @@ posix_execv(PyObject *self, PyObject *args)
char *path; char *path;
PyObject *argv; PyObject *argv;
char **argvlist; char **argvlist;
int i, argc; Py_ssize_t i, argc;
PyObject *(*getitem)(PyObject *, Py_ssize_t); PyObject *(*getitem)(PyObject *, Py_ssize_t);
/* execv has two arguments: (path, argv), where /* execv has two arguments: (path, argv), where
@ -2410,7 +2410,7 @@ posix_execve(PyObject *self, PyObject *args)
char **argvlist; char **argvlist;
char **envlist; char **envlist;
PyObject *key, *val, *keys=NULL, *vals=NULL; PyObject *key, *val, *keys=NULL, *vals=NULL;
int i, pos, argc, envc; Py_ssize_t i, pos, argc, envc;
PyObject *(*getitem)(PyObject *, Py_ssize_t); PyObject *(*getitem)(PyObject *, Py_ssize_t);
int lastarg = 0; int lastarg = 0;

View File

@ -216,7 +216,7 @@ static PyObject *
reversed_next(reversedobject *ro) reversed_next(reversedobject *ro)
{ {
PyObject *item; PyObject *item;
long index = ro->index; Py_ssize_t index = ro->index;
if (index >= 0) { if (index >= 0) {
item = PySequence_GetItem(ro->seq, index); item = PySequence_GetItem(ro->seq, index);

View File

@ -177,7 +177,7 @@ gen_del(PyObject *self)
* never happened. * never happened.
*/ */
{ {
int refcnt = self->ob_refcnt; Py_ssize_t refcnt = self->ob_refcnt;
_Py_NewReference(self); _Py_NewReference(self);
self->ob_refcnt = refcnt; self->ob_refcnt = refcnt;
} }

View File

@ -1172,7 +1172,7 @@ PyObject_SetAttr(PyObject *v, PyObject *name, PyObject *value)
PyObject ** PyObject **
_PyObject_GetDictPtr(PyObject *obj) _PyObject_GetDictPtr(PyObject *obj)
{ {
long dictoffset; Py_ssize_t dictoffset;
PyTypeObject *tp = obj->ob_type; PyTypeObject *tp = obj->ob_type;
if (!(tp->tp_flags & Py_TPFLAGS_HAVE_CLASS)) if (!(tp->tp_flags & Py_TPFLAGS_HAVE_CLASS))
@ -1212,7 +1212,7 @@ PyObject_GenericGetAttr(PyObject *obj, PyObject *name)
PyObject *descr = NULL; PyObject *descr = NULL;
PyObject *res = NULL; PyObject *res = NULL;
descrgetfunc f; descrgetfunc f;
long dictoffset; Py_ssize_t dictoffset;
PyObject **dictptr; PyObject **dictptr;
if (!PyString_Check(name)){ if (!PyString_Check(name)){

View File

@ -3679,6 +3679,7 @@ _PyString_FormatLong(PyObject *val, int flags, int prec, int type,
Py_ssize_t i; Py_ssize_t i;
int sign; /* 1 if '-', else 0 */ int sign; /* 1 if '-', else 0 */
int len; /* number of characters */ int len; /* number of characters */
Py_ssize_t llen;
int numdigits; /* len == numnondigits + numdigits */ int numdigits; /* len == numnondigits + numdigits */
int numnondigits = 0; int numnondigits = 0;
@ -3707,7 +3708,12 @@ _PyString_FormatLong(PyObject *val, int flags, int prec, int type,
return NULL; return NULL;
} }
buf = PyString_AsString(result); buf = PyString_AsString(result);
len = PyString_Size(result); llen = PyString_Size(result);
if (llen > INT_MAX) {
PyErr_SetString(PyExc_ValueError, "string too large in _PyString_FormatLong");
return NULL;
}
len = (int)llen;
if (buf[len-1] == 'L') { if (buf[len-1] == 'L') {
--len; --len;
buf[len] = '\0'; buf[len] = '\0';
@ -3941,12 +3947,12 @@ PyString_Format(PyObject *format, PyObject *args)
PyObject *temp = NULL; PyObject *temp = NULL;
char *pbuf; char *pbuf;
int sign; int sign;
int len; Py_ssize_t len;
char formatbuf[FORMATBUFLEN]; char formatbuf[FORMATBUFLEN];
/* For format{float,int,char}() */ /* For format{float,int,char}() */
#ifdef Py_USING_UNICODE #ifdef Py_USING_UNICODE
char *fmt_start = fmt; char *fmt_start = fmt;
int argidx_start = argidx; Py_ssize_t argidx_start = argidx;
#endif #endif
fmt++; fmt++;
@ -4139,8 +4145,10 @@ PyString_Format(PyObject *format, PyObject *args)
if (c == 'i') if (c == 'i')
c = 'd'; c = 'd';
if (PyLong_Check(v)) { if (PyLong_Check(v)) {
int ilen;
temp = _PyString_FormatLong(v, flags, temp = _PyString_FormatLong(v, flags,
prec, c, &pbuf, &len); prec, c, &pbuf, &ilen);
len = ilen;
if (!temp) if (!temp)
goto error; goto error;
sign = 1; sign = 1;

View File

@ -4244,7 +4244,8 @@ slot_sq_contains(PyObject *self, PyObject *value)
} }
} }
else if (! PyErr_Occurred()) { else if (! PyErr_Occurred()) {
result = _PySequence_IterSearch(self, value, /* Possible results: -1 and 1 */
result = (int)_PySequence_IterSearch(self, value,
PY_ITERSEARCH_CONTAINS); PY_ITERSEARCH_CONTAINS);
} }
return result; return result;
@ -4880,7 +4881,7 @@ slot_tp_del(PyObject *self)
* never happened. * never happened.
*/ */
{ {
int refcnt = self->ob_refcnt; Py_ssize_t refcnt = self->ob_refcnt;
_Py_NewReference(self); _Py_NewReference(self);
self->ob_refcnt = refcnt; self->ob_refcnt = refcnt;
} }

View File

@ -2514,7 +2514,7 @@ static PyObject *
filterunicode(PyObject *func, PyObject *strobj) filterunicode(PyObject *func, PyObject *strobj)
{ {
PyObject *result; PyObject *result;
register int i, j; register Py_ssize_t i, j;
Py_ssize_t len = PyUnicode_GetSize(strobj); Py_ssize_t len = PyUnicode_GetSize(strobj);
Py_ssize_t outlen = len; Py_ssize_t outlen = len;

View File

@ -764,7 +764,7 @@ static PyObject *
SyntaxError__init__(PyObject *self, PyObject *args) SyntaxError__init__(PyObject *self, PyObject *args)
{ {
PyObject *rtnval = NULL; PyObject *rtnval = NULL;
int lenargs; Py_ssize_t lenargs;
if (!(self = get_self(args))) if (!(self = get_self(args)))
return NULL; return NULL;
@ -889,7 +889,7 @@ SyntaxError__str__(PyObject *self, PyObject *args)
PyErr_Clear(); PyErr_Clear();
if (have_filename || have_lineno) { if (have_filename || have_lineno) {
int bufsize = PyString_GET_SIZE(str) + 64; Py_ssize_t bufsize = PyString_GET_SIZE(str) + 64;
if (have_filename) if (have_filename)
bufsize += PyString_GET_SIZE(filename); bufsize += PyString_GET_SIZE(filename);

View File

@ -853,7 +853,7 @@ write_compiled_module(PyCodeObject *co, char *cpathname, time_t mtime)
/* Now write the true mtime */ /* Now write the true mtime */
fseek(fp, 4L, 0); fseek(fp, 4L, 0);
assert(mtime < LONG_MAX); assert(mtime < LONG_MAX);
PyMarshal_WriteLongToFile(mtime, fp, Py_MARSHAL_VERSION); PyMarshal_WriteLongToFile((long)mtime, fp, Py_MARSHAL_VERSION);
fflush(fp); fflush(fp);
fclose(fp); fclose(fp);
if (Py_VerboseFlag) if (Py_VerboseFlag)
@ -1016,7 +1016,7 @@ get_path_importer(PyObject *path_importer_cache, PyObject *path_hooks,
PyObject *p) PyObject *p)
{ {
PyObject *importer; PyObject *importer;
int j, nhooks; Py_ssize_t j, nhooks;
/* These conditions are the caller's responsibility: */ /* These conditions are the caller's responsibility: */
assert(PyList_Check(path_hooks)); assert(PyList_Check(path_hooks));
@ -1075,7 +1075,7 @@ static struct filedescr *
find_module(char *fullname, char *subname, PyObject *path, char *buf, find_module(char *fullname, char *subname, PyObject *path, char *buf,
size_t buflen, FILE **p_fp, PyObject **p_loader) size_t buflen, FILE **p_fp, PyObject **p_loader)
{ {
int i, npath; Py_ssize_t i, npath;
size_t len, namelen; size_t len, namelen;
struct filedescr *fdp = NULL; struct filedescr *fdp = NULL;
char *filemode; char *filemode;
@ -2028,7 +2028,7 @@ get_parent(PyObject *globals, char *buf, Py_ssize_t *p_buflen, int level)
modpath = PyDict_GetItem(globals, pathstr); modpath = PyDict_GetItem(globals, pathstr);
if (modpath != NULL) { if (modpath != NULL) {
int len = PyString_GET_SIZE(modname); Py_ssize_t len = PyString_GET_SIZE(modname);
if (len > MAXPATHLEN) { if (len > MAXPATHLEN) {
PyErr_SetString(PyExc_ValueError, PyErr_SetString(PyExc_ValueError,
"Module name too long"); "Module name too long");

View File

@ -186,7 +186,7 @@ w_object(PyObject *v, WFILE *p)
n = strlen(buf); n = strlen(buf);
w_byte(TYPE_FLOAT, p); w_byte(TYPE_FLOAT, p);
w_byte((int)n, p); w_byte((int)n, p);
w_string(buf, n, p); w_string(buf, (int)n, p);
} }
} }
#ifndef WITHOUT_COMPLEX #ifndef WITHOUT_COMPLEX
@ -215,16 +215,16 @@ w_object(PyObject *v, WFILE *p)
PyComplex_RealAsDouble(v)); PyComplex_RealAsDouble(v));
PyFloat_AsReprString(buf, temp); PyFloat_AsReprString(buf, temp);
Py_DECREF(temp); Py_DECREF(temp);
n = (int)strlen(buf); n = strlen(buf);
w_byte(n, p); w_byte((int)n, p);
w_string(buf, n, p); w_string(buf, (int)n, p);
temp = (PyFloatObject*)PyFloat_FromDouble( temp = (PyFloatObject*)PyFloat_FromDouble(
PyComplex_ImagAsDouble(v)); PyComplex_ImagAsDouble(v));
PyFloat_AsReprString(buf, temp); PyFloat_AsReprString(buf, temp);
Py_DECREF(temp); Py_DECREF(temp);
n = (int)strlen(buf); n = strlen(buf);
w_byte(n, p); w_byte((int)n, p);
w_string(buf, n, p); w_string(buf, (int)n, p);
} }
} }
#endif #endif
@ -248,8 +248,14 @@ w_object(PyObject *v, WFILE *p)
w_byte(TYPE_STRING, p); w_byte(TYPE_STRING, p);
} }
n = PyString_GET_SIZE(v); n = PyString_GET_SIZE(v);
if (n > INT_MAX) {
/* huge strings are not supported */
p->depth--;
p->error = 1;
return;
}
w_long((long)n, p); w_long((long)n, p);
w_string(PyString_AS_STRING(v), n, p); w_string(PyString_AS_STRING(v), (int)n, p);
} }
#ifdef Py_USING_UNICODE #ifdef Py_USING_UNICODE
else if (PyUnicode_Check(v)) { else if (PyUnicode_Check(v)) {
@ -262,8 +268,13 @@ w_object(PyObject *v, WFILE *p)
} }
w_byte(TYPE_UNICODE, p); w_byte(TYPE_UNICODE, p);
n = PyString_GET_SIZE(utf8); n = PyString_GET_SIZE(utf8);
if (n > INT_MAX) {
p->depth--;
p->error = 1;
return;
}
w_long((long)n, p); w_long((long)n, p);
w_string(PyString_AS_STRING(utf8), n, p); w_string(PyString_AS_STRING(utf8), (int)n, p);
Py_DECREF(utf8); Py_DECREF(utf8);
} }
#endif #endif
@ -350,8 +361,13 @@ w_object(PyObject *v, WFILE *p)
PyBufferProcs *pb = v->ob_type->tp_as_buffer; PyBufferProcs *pb = v->ob_type->tp_as_buffer;
w_byte(TYPE_STRING, p); w_byte(TYPE_STRING, p);
n = (*pb->bf_getreadbuffer)(v, 0, (void **)&s); n = (*pb->bf_getreadbuffer)(v, 0, (void **)&s);
if (n > INT_MAX) {
p->depth--;
p->error = 1;
return;
}
w_long((long)n, p); w_long((long)n, p);
w_string(s, n, p); w_string(s, (int)n, p);
} }
else { else {
w_byte(TYPE_UNKNOWN, p); w_byte(TYPE_UNKNOWN, p);

View File

@ -597,7 +597,7 @@ sys_mdebug(PyObject *self, PyObject *args)
static PyObject * static PyObject *
sys_getrefcount(PyObject *self, PyObject *arg) sys_getrefcount(PyObject *self, PyObject *arg)
{ {
return PyInt_FromLong(arg->ob_refcnt); return PyInt_FromSsize_t(arg->ob_refcnt);
} }
#ifdef Py_REF_DEBUG #ifdef Py_REF_DEBUG