Skip to content

Commit

Permalink
gdb/varobj: Only re-evaluate invalid globals during re_set
Browse files Browse the repository at this point in the history
When doing varobj_re_set, we currently try to recreate floating varobj.
This was introduced by 4e969b4 "Re-evaluate floating varobj as part
of varobj_invalidate" to deal with use a after free issue.  However
since bc20e56 "Fix use after free in varobj" we now ensure that we
never have dangling pointers so this all recreation is not strictly
needed anymore for floating varobjs.

This commit proposes to remove this recreation process for floating
varobjs.

Tested on x86_64-linux.
  • Loading branch information
lancesix committed Aug 11, 2022
1 parent ccb5e55 commit 906dca1
Show file tree
Hide file tree
Showing 2 changed files with 7 additions and 15 deletions.
4 changes: 2 additions & 2 deletions gdb/testsuite/gdb.mi/mi-var-invalidate.exp
Original file line number Diff line number Diff line change
Expand Up @@ -75,8 +75,8 @@ mi_runto_main
# Change format of floating variable immediately after reload reveals a
# bug where gdb still uses a free'd pointer.
mi_gdb_test "-var-set-format float_simple hexadecimal" \
"\\^done,format=\"hexadecimal\",value=\"\\\[-1\\\]\"" \
"set format variable float_simple"
"\\^done,format=\"hexadecimal\",value=\"\\\[3\\\]\"" \
"set format variable float_simple"

# Check local variable is "invalid".
mi_gdb_test "-var-update linteger" \
Expand Down
18 changes: 5 additions & 13 deletions gdb/varobj.c
Original file line number Diff line number Diff line change
Expand Up @@ -2359,29 +2359,21 @@ all_root_varobjs (gdb::function_view<void (struct varobj *var)> func)
static void
varobj_re_set_iter (struct varobj *var)
{
/* Invalidated globals and floating var must be re-evaluated. */
if (var->root->global || var->root->floating)
/* Invalidated global varobjs must be re-evaluated. */
if (!var->root->is_valid && var->root->global)
{
struct varobj *tmp_var;

/* Try to create a varobj with same expression. If we succeed
replace the old varobj, otherwise invalidate it. */
and have a global replace the old varobj. */
tmp_var = varobj_create (nullptr, var->name.c_str (), (CORE_ADDR) 0,
var->root->floating
? USE_SELECTED_FRAME : USE_CURRENT_FRAME);
if (tmp_var != nullptr)
USE_CURRENT_FRAME);
if (tmp_var != nullptr && tmp_var->root->global)
{
gdb_assert (var->root->floating == tmp_var->root->floating);
tmp_var->obj_name = var->obj_name;
varobj_delete (var, 0);
install_variable (tmp_var);
}
else if (var->root->global)
{
/* Only invalidate globals as floating vars might still be valid in
some other frame. */
var->root->is_valid = false;
}
}
}

Expand Down

0 comments on commit 906dca1

Please sign in to comment.