From 582acece2e0db447904b3f8f8f1d2acf36834158 Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Wed, 28 Jun 2000 22:07:35 +0000 Subject: Trent Mick's Win64 changes: size_t vs. int or long; also some overflow tests. --- Python/ceval.c | 2 +- Python/codecs.c | 9 +++++++-- Python/compile.c | 20 ++++++++++++-------- Python/dynload_win.c | 2 +- Python/getcwd.c | 2 +- Python/modsupport.c | 11 +++++++++-- Python/sysmodule.c | 2 +- Python/thread_nt.h | 7 +++++-- Python/traceback.c | 6 +++--- 9 files changed, 40 insertions(+), 21 deletions(-) diff --git a/Python/ceval.c b/Python/ceval.c index 78196ba..e153432 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -2876,7 +2876,7 @@ exec_statement(f, prog, globals, locals) } else { char *s = PyString_AsString(prog); - if ((int)strlen(s) != PyString_Size(prog)) { + if (strlen(s) != (size_t)PyString_Size(prog)) { PyErr_SetString(PyExc_ValueError, "embedded '\\0' in exec string"); return -1; diff --git a/Python/codecs.c b/Python/codecs.c index 5e01cca..ceff376 100644 --- a/Python/codecs.c +++ b/Python/codecs.c @@ -83,11 +83,16 @@ static PyObject *normalizestring(const char *string) { register int i; - int len = strlen(string); + size_t len = strlen(string); char *p; PyObject *v; - v = PyString_FromStringAndSize(NULL, len); + if (len > INT_MAX) { + PyErr_SetString(PyExc_OverflowError, "string is too large"); + return NULL; + } + + v = PyString_FromStringAndSize(NULL, (int)len); if (v == NULL) return NULL; p = PyString_AS_STRING(v); diff --git a/Python/compile.c b/Python/compile.c index a387317..4373422 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -265,8 +265,8 @@ PyCode_New(argcount, nlocals, stacksize, flags, if (!PyString_Check(v)) continue; p = PyString_AsString(v); - if ((int)strspn(p, NAME_CHARS) - != PyString_Size(v)) + if (strspn(p, NAME_CHARS) + != (size_t)PyString_Size(v)) continue; PyString_InternInPlace(&PyTuple_GET_ITEM(consts, i)); } @@ -340,7 +340,7 @@ com_error(c, exc, msg) PyObject *exc; char *msg; { - int n = strlen(msg); + size_t n = strlen(msg); PyObject *v; char buffer[30]; char *s; @@ -720,12 +720,12 @@ com_mangle(c, name, buffer, maxlen) struct compiling *c; char *name; char *buffer; - int maxlen; + size_t maxlen; { /* Name mangling: __private becomes _classname__private. This is independent from how the name is used. */ char *p; - int nlen, plen; + size_t nlen, plen; nlen = strlen(name); if (nlen+2 >= maxlen) return 0; /* Don't mangle __extremely_long_names */ @@ -761,7 +761,7 @@ com_addopnamestr(c, op, name) char buffer[256]; if (name != NULL && name[0] == '_' && name[1] == '_' && c->c_private != NULL && - com_mangle(c, name, buffer, (int)sizeof(buffer))) + com_mangle(c, name, buffer, sizeof(buffer))) name = buffer; #endif if (name == NULL || (v = PyString_InternFromString(name)) == NULL) { @@ -883,7 +883,7 @@ parsestr(s) char *s; { PyObject *v; - int len; + size_t len; char *buf; char *p; char *end; @@ -908,6 +908,10 @@ parsestr(s) } s++; len = strlen(s); + if (len > INT_MAX) { + PyErr_SetString(PyExc_OverflowError, "string to parse is too long"); + return NULL; + } if (s[--len] != quote) { PyErr_BadInternalCall(); return NULL; @@ -2201,7 +2205,7 @@ com_global_stmt(c, n) char buffer[256]; if (s != NULL && s[0] == '_' && s[1] == '_' && c->c_private != NULL && - com_mangle(c, s, buffer, (int)sizeof(buffer))) + com_mangle(c, s, buffer, sizeof(buffer))) s = buffer; #endif if (PyDict_GetItemString(c->c_locals, s) != NULL) { diff --git a/Python/dynload_win.c b/Python/dynload_win.c index 08a2a89..7506c41 100644 --- a/Python/dynload_win.c +++ b/Python/dynload_win.c @@ -104,7 +104,7 @@ dl_funcptr _PyImport_GetDynLoadFunc(const char *fqname, const char *shortname, "DLL load failed with error code %d", errorCode); } else { - int len; + size_t len; /* For some reason a \r\n is appended to the text */ if (theLength >= 2 && diff --git a/Python/getcwd.c b/Python/getcwd.c index e720c99..7005869 100644 --- a/Python/getcwd.c +++ b/Python/getcwd.c @@ -62,7 +62,7 @@ getcwd(buf, size) return NULL; } ret = getwd(localbuf); - if (ret != NULL && strlen(localbuf) >= size) { + if (ret != NULL && strlen(localbuf) >= (size_t)size) { errno = ERANGE; return NULL; } diff --git a/Python/modsupport.c b/Python/modsupport.c index 7b40286..13737f1 100644 --- a/Python/modsupport.c +++ b/Python/modsupport.c @@ -355,8 +355,15 @@ do_mkvalue(p_format, p_va) Py_INCREF(v); } else { - if (n < 0) - n = strlen(str); + if (n < 0) { + size_t m = strlen(str); + if (m > INT_MAX) { + PyErr_SetString(PyExc_OverflowError, + "string too long for Python string"); + return NULL; + } + n = (int)m; + } v = PyString_FromStringAndSize(str, n); } return v; diff --git a/Python/sysmodule.c b/Python/sysmodule.c index 6219454..843df8d 100644 --- a/Python/sysmodule.c +++ b/Python/sysmodule.c @@ -504,7 +504,7 @@ _PySys_Init() Py_XDECREF(v); #ifdef MS_COREDLL PyDict_SetItemString(sysdict, "dllhandle", - v = PyInt_FromLong((int)PyWin_DLLhModule)); + v = PyLong_FromVoidPtr(PyWin_DLLhModule)); Py_XDECREF(v); PyDict_SetItemString(sysdict, "winver", v = PyString_FromString(PyWin_DLLVersionString)); diff --git a/Python/thread_nt.h b/Python/thread_nt.h index c8ed6cd..9e82a94 100644 --- a/Python/thread_nt.h +++ b/Python/thread_nt.h @@ -101,6 +101,9 @@ BOOL InitializeNonRecursiveMutex(PNRMUTEX mutex) return mutex->hevent != NULL ; /* TRUE if the mutex is created */ } +#ifdef InterlockedCompareExchange +#undef InterlockedCompareExchange +#endif #define InterlockedCompareExchange(dest,exchange,comperand) (ixchg((dest), (exchange), (comperand))) VOID DeleteNonRecursiveMutex(PNRMUTEX mutex) @@ -179,7 +182,7 @@ static void PyThread__init_thread(void) */ int PyThread_start_new_thread(void (*func)(void *), void *arg) { - long rv; + INT_PTR rv; int success = 0; dprintf(("%ld: PyThread_start_new_thread called\n", PyThread_get_thread_ident())); @@ -190,7 +193,7 @@ int PyThread_start_new_thread(void (*func)(void *), void *arg) if (rv != -1) { success = 1; - dprintf(("%ld: PyThread_start_new_thread succeeded: %ld\n", PyThread_get_thread_ident(), rv)); + dprintf(("%ld: PyThread_start_new_thread succeeded: %p\n", PyThread_get_thread_ident(), rv)); } return success; diff --git a/Python/traceback.c b/Python/traceback.c index 0b8157d..d63aef5 100644 --- a/Python/traceback.c +++ b/Python/traceback.c @@ -166,7 +166,7 @@ tb_displayline(f, filename, lineno, name) path = PySys_GetObject("path"); if (path != NULL && PyList_Check(path)) { int npath = PyList_Size(path); - int taillen = strlen(tail); + size_t taillen = strlen(tail); char namebuf[MAXPATHLEN+1]; for (i = 0; i < npath; i++) { PyObject *v = PyList_GetItem(path, i); @@ -175,12 +175,12 @@ tb_displayline(f, filename, lineno, name) break; } if (PyString_Check(v)) { - int len; + size_t len; len = PyString_Size(v); if (len + 1 + taillen >= MAXPATHLEN) continue; /* Too long */ strcpy(namebuf, PyString_AsString(v)); - if ((int)strlen(namebuf) != len) + if (strlen(namebuf) != len) continue; /* v contains '\0' */ if (len > 0 && namebuf[len-1] != SEP) namebuf[len++] = SEP; -- cgit v0.12