Mercurial > cpython-lru_cache-weakref
diff Python/errors.c @ 25544:2fa559fb6ec5 legacy-trunk
Fix [ 616716 ] Bug in PyErr_SetExcFromWindows
Ensure that even if FormatMessage fails we (a) don't crash, and (b) provide something useful.
Bugfix candidate.
| author | Mark Hammond <mhammond@skippinet.com.au> |
|---|---|
| date | Fri, 04 Oct 2002 00:13:02 +0000 |
| parents | dfeec3b34fae |
| children | cc05c2c8660e |
line wrap: on
line diff
--- a/Python/errors.c Fri Oct 04 00:09:38 2002 +0000 +++ b/Python/errors.c Fri Oct 04 00:13:02 2002 +0000 @@ -269,6 +269,7 @@ #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 @@ (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 @@ { 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 @@ 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 @@ PyErr_SetObject(exc, v); Py_DECREF(v); } - LocalFree(s); + LocalFree(s_buf); return NULL; }
