Mercurial > cpython-lru_cache-weakref
diff Python/ast.c @ 48515:dbc2b7ad0c22
Fix uninitialized memory read for cases like def(f, *): pass
There's not much interesting here. The old code read uninitialized
memory but at worst incremented i past NCH(n), but no bad effects
followed from that.
| author | Jeremy Hylton <jeremy@alum.mit.edu> |
|---|---|
| date | Thu, 17 Jul 2008 16:37:17 +0000 |
| parents | 42309437f1ca |
| children | 85b67fb5672b |
line wrap: on
line diff
--- a/Python/ast.c Thu Jul 17 16:23:53 2008 +0000 +++ b/Python/ast.c Thu Jul 17 16:37:17 2008 +0000 @@ -742,15 +742,21 @@ } assert(TYPE(n) == typedargslist || TYPE(n) == varargslist); - /* first count the number of positional args & defaults */ + /* First count the number of positional args & defaults. The + variable i is the loop index for this for loop and the next. + The next loop picks up where the first leaves off. + */ for (i = 0; i < NCH(n); i++) { ch = CHILD(n, i); if (TYPE(ch) == STAR) { - /* skip star and possible argument */ + /* skip star */ i++; - i += (TYPE(CHILD(n, i)) == tfpdef - || TYPE(CHILD(n, i)) == vfpdef); - break; + if (i < NCH(n) && /* skip argument following star */ + (TYPE(CHILD(n, i)) == tfpdef || + TYPE(CHILD(n, i)) == vfpdef)) { + i++; + } + break; } if (TYPE(ch) == DOUBLESTAR) break; if (TYPE(ch) == vfpdef || TYPE(ch) == tfpdef) nposargs++;
