c++: use after free during name lookup w/ modules [PR99479]
authorPatrick Palka <ppalka@redhat.com>
Thu, 7 Apr 2022 20:09:52 +0000 (16:09 -0400)
committerPatrick Palka <ppalka@redhat.com>
Thu, 7 Apr 2022 20:09:52 +0000 (16:09 -0400)
commit7e7a96f774ed892e5cef53fcb68297cd0d513820
tree7eef610c8bfe63d65210d0fa1dbc00bffdc5064f
parent68163cc2de1d3125ed9dbb8eac3294d1f9118641
c++: use after free during name lookup w/ modules [PR99479]

name_lookup::search_unqualified uses a statically allocated vector
in order to avoid repeated reallocation, under the assumption that
the function can't be called recursively.  With modules however,
this assumption turns out to be false, and search_unqualified can
be called recursively as demonstrated by the testcase in comment #19
of PR99479[1] where the recursive call causes the vector to get
reallocated which invalidates the reference to queue[ix] held by the
parent call.

This patch makes search_unqualified instead use an auto_vec with 16
elements of internal storage.  In turn we can simplify the API of some
member functions to take the vector by reference and return void.

[1]: https://gcc.gnu.org/PR99479#c19

PR c++/99479

gcc/cp/ChangeLog:

* name-lookup.cc (name_lookup::using_queue): Change to an
auto_vec (with 16 elements of internal storage).
(name_lookup::queue_namespace): Change return type to void,
take queue parameter by reference and adjust function body
accordingly.
(name_lookup::do_queue_usings): Inline into ...
(name_lookup::queue_usings): ... here.  As in queue_namespace.
(name_lookup::search_unqualified): Don't make queue static,
remove length variable, and adjust function body accordingly.
gcc/cp/name-lookup.cc