Skip to content
GitLab
Projects Groups Topics Snippets
  • /
  • Help
    • Help
    • Support
    • Community forum
    • Submit feedback
    • Contribute to GitLab
  • Register
  • Sign in
  • gtk gtk
  • Project information
    • Project information
    • Activity
    • Labels
    • Members
  • Repository
    • Repository
    • Files
    • Commits
    • Branches
    • Tags
    • Contributor statistics
    • Graph
    • Compare revisions
  • Issues 1.6k
    • Issues 1.6k
    • List
    • Boards
    • Service Desk
    • Milestones
  • Merge requests 258
    • Merge requests 258
  • CI/CD
    • CI/CD
    • Pipelines
    • Jobs
    • Artifacts
    • Schedules
  • Deployments
    • Deployments
    • Environments
    • Releases
  • Packages and registries
    • Packages and registries
    • Container Registry
    • Model experiments
  • Monitor
    • Monitor
    • Incidents
  • Analytics
    • Analytics
    • Value stream
    • CI/CD
    • Repository
  • Wiki
    • Wiki
  • Snippets
    • Snippets
  • Activity
  • Graph
  • Create a new issue
  • Jobs
  • Commits
  • Issue Boards
Collapse sidebar
  • GNOMEGNOME
  • gtkgtk
  • Issues
  • #2786
Closed
Open
Issue created May 25, 2020 by Simeon Andreev@simeon.andreev

SIGSEGV in _gtk_tree_path_new_from_rbtree

See attached video:

gtktreeview_crash

We observe the following crashes in Eclipse:

https://bugs.eclipse.org/bugs/show_bug.cgi?id=563393 https://bugs.eclipse.org/bugs/show_bug.cgi?id=553073

To reproduce, run the following snippet and alternate clicking on the button, scrolling in the tree and clicking in the tree (in that order, it can take a while for the SIGSEGV to occur).

#include <gtk/gtk.h>

enum
{
  COL_URI = 0,
  NUM_COLS
} ;

int n = 20;
GtkWidget *tree;
GtkTreeStore *treestore;

int
reset_tree_elements ()
{
  gtk_tree_view_set_model(GTK_TREE_VIEW(tree), NULL);
  gtk_tree_store_clear(treestore);
  gtk_tree_view_set_model(GTK_TREE_VIEW(tree), GTK_TREE_MODEL(treestore));

  GtkTreeIter iter;
  for (int i = 0; i < n; ++i) {
    gtk_tree_store_append(treestore, &iter, NULL);
    gtk_tree_store_set(treestore, &iter, 
                           COL_URI, "item1", -1);
  }

  return FALSE;
}

void
create_view_and_model (void)
{
  GtkTreeViewColumn   *col1, *col2;
  GtkCellRenderer     *renderer;

  treestore = gtk_tree_store_new(NUM_COLS, G_TYPE_STRING);
  tree = gtk_tree_view_new_with_model(GTK_TREE_MODEL(treestore));

  col1 = gtk_tree_view_column_new();

  renderer = gtk_cell_renderer_text_new();

  gtk_tree_view_column_set_title(col1, "column");
  gtk_tree_view_append_column(GTK_TREE_VIEW(tree), col1);
  gtk_tree_view_column_pack_start(col1, renderer, TRUE);
  gtk_tree_view_column_add_attribute(col1, renderer, "text", COL_URI);
  gtk_tree_view_column_set_fixed_width(col1, 150);

  reset_tree_elements();
}

GtkWidget *
create_button (void)
{
  GtkWidget *button;
  button = gtk_button_new_with_label("click");
  return button;
}

// gcc -g tree_crash.cpp  `pkg-config --cflags --libs gtk+-3.0`  -o TreeCrash

int
main (int argc, char **argv)
{
  GtkWidget *window, *scrolled_window, *box, *button;
  
  gtk_init(&argc, &argv);

  window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
  g_signal_connect(window, "delete_event", gtk_main_quit, NULL);
  gtk_window_set_default_size(GTK_WINDOW(window), 200, 200);

  scrolled_window = gtk_scrolled_window_new (NULL, NULL);
  gtk_container_add (GTK_CONTAINER (window), scrolled_window);

  box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
  gtk_container_add(GTK_CONTAINER(scrolled_window), box);

  button = create_button();
  create_view_and_model();

  g_signal_connect(button, "focus-out-event", G_CALLBACK (reset_tree_elements), NULL);

  gtk_box_pack_start(GTK_BOX(box), button, TRUE, TRUE, 0);
  gtk_box_pack_start(GTK_BOX(box), tree, TRUE, TRUE, 0);

  gtk_widget_show_all(window);

  gtk_main();

  return 0;
}
Stack: [0x00007ffff7ecd000,0x00007ffff7fce000],  sp=0x00007ffff7fc5e10,  free space=995k
Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)
C  [libgtk-3.so.0+0x4a9048]  _gtk_tree_path_new_from_rbtree+0xf1
C  [libgtk-3.so.0+0xb572d]  cell_info_get_path+0x27
C  [libgtk-3.so.0+0xb5da9]  set_cell_data+0xc2
C  [libgtk-3.so.0+0xb8a1a]  _gtk_tree_view_accessible_changed+0xa0
C  [libgtk-3.so.0+0x4a753a]  gtk_tree_view_row_changed+0x180
C  [libgobject-2.0.so.0+0xf988]  g_closure_invoke+0x138
Edited May 25, 2020 by Andre Klapper
Assignee
Assign to
Time tracking