From 3d61a06aa288f2fc64f33c6b09c0778ac4083861 Mon Sep 17 00:00:00 2001 From: Mark Hammond Date: Fri, 4 Oct 2002 00:13:02 +0000 Subject: [PATCH] Fix [ 616716 ] Bug in PyErr_SetExcFromWindows Ensure that even if FormatMessage fails we (a) don't crash, and (b) provide something useful. Bugfix candidate. --- Python/errors.c | 37 ++++++++++++++++++++++++++++--------- 1 file changed, 28 insertions(+), 9 deletions(-) diff --git a/Python/errors.c b/Python/errors.c index 9a2597b0ce1..95c24a685ea 100644 --- a/Python/errors.c +++ b/Python/errors.c @@ -269,6 +269,7 @@ PyErr_SetFromErrnoWithFilenameObject(PyObject *exc, PyObject *filenameObject) #endif #ifdef MS_WINDOWS char *s_buf = NULL; + char s_small_buf[28]; /* Room for "Windows Error 0xFFFFFFFF" */ #endif #ifdef EINTR if (i == EINTR && PyErr_CheckSignals()) @@ -306,10 +307,18 @@ PyErr_SetFromErrnoWithFilenameObject(PyObject *exc, PyObject *filenameObject) (LPTSTR) &s_buf, 0, /* size not used */ NULL); /* no args */ - s = s_buf; - /* remove trailing cr/lf and dots */ - while (len > 0 && (s[len-1] <= ' ' || s[len-1] == '.')) - s[--len] = '\0'; + if (len==0) { + /* Only ever seen this in out-of-mem + situations */ + sprintf(s_small_buf, "Windows Error 0x%X", i); + s = s_small_buf; + s_buf = NULL; + } else { + s = s_buf; + /* remove trailing cr/lf and dots */ + while (len > 0 && (s[len-1] <= ' ' || s[len-1] == '.')) + s[--len] = '\0'; + } } } #endif /* Unix/Windows */ @@ -366,6 +375,8 @@ PyObject *PyErr_SetExcFromWindowsErrWithFilenameObject( { int len; char *s; + char *s_buf = NULL; /* Free via LocalFree */ + char s_small_buf[28]; /* Room for "Windows Error 0xFFFFFFFF" */ PyObject *v; DWORD err = (DWORD)ierr; if (err==0) err = GetLastError(); @@ -378,12 +389,20 @@ PyObject *PyErr_SetExcFromWindowsErrWithFilenameObject( err, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), /* Default language */ - (LPTSTR) &s, + (LPTSTR) &s_buf, 0, /* size not used */ NULL); /* no args */ - /* remove trailing cr/lf and dots */ - while (len > 0 && (s[len-1] <= ' ' || s[len-1] == '.')) - s[--len] = '\0'; + if (len==0) { + /* Only seen this in out of mem situations */ + sprintf(s_small_buf, "Windows Error 0x%X", err); + s = s_small_buf; + s_buf = NULL; + } else { + s = s_buf; + /* remove trailing cr/lf and dots */ + while (len > 0 && (s[len-1] <= ' ' || s[len-1] == '.')) + s[--len] = '\0'; + } if (filenameObject != NULL) v = Py_BuildValue("(isO)", err, s, filenameObject); else @@ -392,7 +411,7 @@ PyObject *PyErr_SetExcFromWindowsErrWithFilenameObject( PyErr_SetObject(exc, v); Py_DECREF(v); } - LocalFree(s); + LocalFree(s_buf); return NULL; }