[gcc r14-7513] gccrs: Fix memory corruption at peek_context

Arthur Cohen cohenarthur@gcc.gnu.org
Tue Jan 16 17:40:25 GMT 2024


https://gcc.gnu.org/g:e755e6e407be2ed3d6d3d93a215a9237c681026d

commit r14-7513-ge755e6e407be2ed3d6d3d93a215a9237c681026d
Author: Philip Herron <herron.philip@googlemail.com>
Date:   Mon Apr 17 20:48:41 2023 +0100

    gccrs: Fix memory corruption at peek_context
    
    When working in the resolve_operator_overload it was found that we got
    memory corruption as method resolution will use the query system and
    therefore resolve new methods and the current function context info will
    change and due to the fact the peek_context interface returns a reference
    to the element which was now safe from a vector which can change and all
    you need is the current function context at that moment in time.
    
    gcc/rust/ChangeLog:
    
            * typecheck/rust-autoderef.cc: don't take a reference
            * typecheck/rust-hir-type-check-expr.cc (TypeCheckExpr::visit): likewise
            * typecheck/rust-hir-type-check.h: remove reference
            * typecheck/rust-typecheck-context.cc (TypeCheckContext::pop_return_type): likewise
    
    Signed-off-by: Philip Herron <herron.philip@googlemail.com>

Diff:
---
 gcc/rust/typecheck/rust-autoderef.cc           | 2 +-
 gcc/rust/typecheck/rust-hir-type-check-expr.cc | 4 ++--
 gcc/rust/typecheck/rust-hir-type-check.h       | 2 +-
 gcc/rust/typecheck/rust-typecheck-context.cc   | 2 +-
 4 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/gcc/rust/typecheck/rust-autoderef.cc b/gcc/rust/typecheck/rust-autoderef.cc
index d4a21ce1a26..adaf575b2c1 100644
--- a/gcc/rust/typecheck/rust-autoderef.cc
+++ b/gcc/rust/typecheck/rust-autoderef.cc
@@ -164,7 +164,7 @@ resolve_operator_overload_fn (
   // handle the case where we are within the impl block for this
   // lang_item otherwise we end up with a recursive operator overload
   // such as the i32 operator overload trait
-  TypeCheckContextItem &fn_context = context->peek_context ();
+  TypeCheckContextItem fn_context = context->peek_context ();
   if (fn_context.get_type () == TypeCheckContextItem::ItemType::IMPL_ITEM)
     {
       auto &impl_item = fn_context.get_impl_item ();
diff --git a/gcc/rust/typecheck/rust-hir-type-check-expr.cc b/gcc/rust/typecheck/rust-hir-type-check-expr.cc
index 6594068a1eb..ce215e35322 100644
--- a/gcc/rust/typecheck/rust-hir-type-check-expr.cc
+++ b/gcc/rust/typecheck/rust-hir-type-check-expr.cc
@@ -1457,7 +1457,7 @@ TypeCheckExpr::visit (HIR::MatchExpr &expr)
 void
 TypeCheckExpr::visit (HIR::ClosureExpr &expr)
 {
-  TypeCheckContextItem &current_context = context->peek_context ();
+  TypeCheckContextItem current_context = context->peek_context ();
   TyTy::FnType *current_context_fndecl = current_context.get_context_type ();
 
   HirId ref = expr.get_mappings ().get_hirid ();
@@ -1624,7 +1624,7 @@ TypeCheckExpr::resolve_operator_overload (
   // handle the case where we are within the impl block for this lang_item
   // otherwise we end up with a recursive operator overload such as the i32
   // operator overload trait
-  TypeCheckContextItem &fn_context = context->peek_context ();
+  TypeCheckContextItem fn_context = context->peek_context ();
   if (fn_context.get_type () == TypeCheckContextItem::ItemType::IMPL_ITEM)
     {
       auto &impl_item = fn_context.get_impl_item ();
diff --git a/gcc/rust/typecheck/rust-hir-type-check.h b/gcc/rust/typecheck/rust-hir-type-check.h
index 427c56be29f..10aa3b32a9e 100644
--- a/gcc/rust/typecheck/rust-hir-type-check.h
+++ b/gcc/rust/typecheck/rust-hir-type-check.h
@@ -90,7 +90,7 @@ public:
   bool lookup_type_by_node_id (NodeId ref, HirId *id);
 
   TyTy::BaseType *peek_return_type ();
-  TypeCheckContextItem &peek_context ();
+  TypeCheckContextItem peek_context ();
   void push_return_type (TypeCheckContextItem item,
 			 TyTy::BaseType *return_type);
   void pop_return_type ();
diff --git a/gcc/rust/typecheck/rust-typecheck-context.cc b/gcc/rust/typecheck/rust-typecheck-context.cc
index 7b2c96cdce2..dcf06098cc5 100644
--- a/gcc/rust/typecheck/rust-typecheck-context.cc
+++ b/gcc/rust/typecheck/rust-typecheck-context.cc
@@ -157,7 +157,7 @@ TypeCheckContext::pop_return_type ()
   return_type_stack.pop_back ();
 }
 
-TypeCheckContextItem &
+TypeCheckContextItem
 TypeCheckContext::peek_context ()
 {
   rust_assert (!return_type_stack.empty ());


More information about the Gcc-cvs mailing list