[Mesa-dev] [PATCH] glcpp: Fix attempts to expand recursive macros infinitely (bug #32835).
Ian Romanick
idr at freedesktop.org
Fri Apr 15 16:50:04 PDT 2011
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
On 04/15/2011 12:03 PM, Carl Worth wrote:
> The 095-recursive-define test case was triggering infinite recursion
> with the following test case:
>
> #define A(a, b) B(a, b)
> #define C A(0, C)
> C
>
> Here's what as happening:
>
> 1. "C" was pushed onto the active list to expand the C node
>
> 2. While expanding the "0" argument, the active list would be
> emptied by the code at the end of _glcpp_parser_expand_token_list
>
> 3. When expanding the "C" argument, the active list was now empty,
> so lather, rinse, repeat.
>
> We fix this by adjusting the final popping at the end of
> _glcpp_parser_expand_token_list to never pop more nodes then this
> particular invocation had pushed itself. This is as simple as saving
> the original state of the active list, and then interrupting the
> popping when we reach this same state.
>
> With this fix, all of the glcpp-test tests now pass.
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=32835
Reviewed-by: Ian Romanick <ian.d.romanick at intel.com>
> ---
>
> As mentioned above, I've tested with the glcpp-test tests. But I
> haven't run piglit with this change. If someone could do that while
> reviewing the patch, it would be most appreciated.
>
> src/glsl/glcpp/glcpp-parse.y | 6 +++++-
> 1 files changed, 5 insertions(+), 1 deletions(-)
>
> diff --git a/src/glsl/glcpp/glcpp-parse.y b/src/glsl/glcpp/glcpp-parse.y
> index fdc9467..6f15e85 100644
> --- a/src/glsl/glcpp/glcpp-parse.y
> +++ b/src/glsl/glcpp/glcpp-parse.y
> @@ -1563,6 +1563,7 @@ _glcpp_parser_expand_token_list (glcpp_parser_t *parser,
> token_node_t *node_prev;
> token_node_t *node, *last = NULL;
> token_list_t *expansion;
> + active_list_t *active_initial = parser->active;
>
> if (list == NULL)
> return;
> @@ -1617,7 +1618,10 @@ _glcpp_parser_expand_token_list (glcpp_parser_t *parser,
> node = node_prev ? node_prev->next : list->head;
> }
>
> - while (parser->active)
> + /* Remove any lingering effects of this invocation on the
> + * active list. That is, pop until the list looks like it did
> + * at the beginning of this function. */
> + while (parser->active && parser->active != active_initial)
> _parser_active_list_pop (parser);
>
> list->non_space_tail = list->tail;
The funny thing is that I looked at this code for a long time. I was
very confused about why there was all this effort to put a marker in the
stack only to ignore it later.
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.11 (GNU/Linux)
Comment: Using GnuPG with Fedora - http://enigmail.mozdev.org/
iEYEARECAAYFAk2o2awACgkQX1gOwKyEAw9cxwCgkerjv0Vm3JBMtVq9ifWMWmGn
YyIAnRL1S+T2aHmMPW69qeeEHoN1IeLb
=Xtle
-----END PGP SIGNATURE-----
More information about the mesa-dev
mailing list