Mercurial > cpython-lru_cache-weakref
diff Python/getargs.c @ 39409:8022927c17a8 2.4
Backport fixes for #1523610 (crashes in PyArg_ParseTuple):
rev. 51158 and rev. 50843.
| author | Georg Brandl <georg@python.org> |
|---|---|
| date | Wed, 09 Aug 2006 07:15:29 +0000 |
| parents | e0d29586212a |
| children |
line wrap: on
line diff
--- a/Python/getargs.c Tue Aug 08 20:13:16 2006 +0000 +++ b/Python/getargs.c Wed Aug 09 07:15:29 2006 +0000 @@ -144,6 +144,9 @@ if (level == 0) max++; level++; + if (level >= 30) + Py_FatalError("too many tuple nesting levels " + "in argument format string"); break; case ')': if (level == 0) @@ -287,8 +290,8 @@ "argument %d", iarg); i = 0; p += strlen(p); - while (levels[i] > 0 && (int)(p-buf) < 220) { - PyOS_snprintf(p, sizeof(buf) - (buf - p), + while (levels[i] > 0 && i < 32 && (int)(p-buf) < 220) { + PyOS_snprintf(p, sizeof(buf) - (p - buf), ", item %d", levels[i]-1); p += strlen(p); i++; @@ -374,6 +377,13 @@ char *msg; PyObject *item; item = PySequence_GetItem(arg, i); + if (item == NULL) { + PyErr_Clear(); + levels[0] = i+1; + levels[1] = 0; + strncpy(msgbuf, "is not retrievable", bufsize); + return msgbuf; + } msg = convertitem(item, &format, p_va, levels+1, msgbuf, bufsize, freelist); /* PySequence_GetItem calls tp->sq_item, which INCREFs */ @@ -1361,6 +1371,7 @@ else { msg = skipitem(&format, p_va); if (msg) { + levels[0] = 0; seterror(i+1, msg, levels, fname, message); return cleanreturn(0, freelist); }
