Uploaded image for project: 'RHEL'
  1. RHEL
  2. RHEL-4087

Eclipse SWT Tree leaks native memory via gtk_tree_view_expand_row()

Linking RHIVOS CVEs to...Migration: Automation ...Sync from "Extern...XMLWordPrintable

    • Icon: Bug Bug
    • Resolution: Unresolved
    • Icon: Normal Normal
    • None
    • rhel-9.4
    • gtk3
    • None
    • Important
    • 5
    • rhel-jotnar
    • ssg_display
    • 5
    • False
    • False
    • Hide

      None

      Show
      None
    • None
    • DESKTOP Cycle #3 10.beta phase, DESKTOP Cycle #4 10.beta phase, DESKTOP Cycle #5 10.beta phase, DESKTOP Cycle #2 10.beta phase, Display - Sprint 3/2025
    • None
    • None
    • If docs needed, set a value
    • None
    • 57,005

      Description of problem:

      Eclipse SWT Tree leaks native memory via gtk_tree_view_expand_row()

      Version-Release number of selected component (if applicable):

      We observe the leak with Eclipse 4.15, Eclipse 4.20 and Eclipse 4.21, as well as latest master from SWT. We assume the leak is seen with all Eclipse versions inbetween.

      How reproducible:

      To reproduce the leak, run the following SWT snippet:

      public static void main(String[] args) {
      Display display = new Display();
      Shell shell = new Shell(display);
      shell.setText("Tree Example");
      shell.setLayout(new FillLayout());
      Tree tree = new Tree(shell, SWT.NONE);
      tree.setItemCount(2);
      TreeItem item0 = tree.getItem(0);
      item0.setText("item0");
      TreeItem item1 = tree.getItem(1);
      item1.setText("item1");
      item1.setItemCount(6);
      TreeItem[] children = item1.getItems();
      for (int k = 0; k < children.length; ++k)

      { children[k].setText("child" + k); }

      item1.setExpanded(true);
      tree.setItemCount(1);
      shell.open();
      while (!shell.isDisposed())

      { if (!display.readAndDispatch()) display.sleep(); }

      display.dispose();
      }

      jemalloc reports a memory leak as follows:

      [240 bytes leaked]
      je_prof_backtrace (/home/sandreev/git/misc/jemalloc/src/prof.c:636 (discriminator 2))
      je_malloc_default (/home/sandreev/git/misc/jemalloc/src/jemalloc.c:2289)
      g_malloc (??:?)
      g_slice_alloc (??:?)
      _gtk_rbnode_new.isra.2 (/usr/src/debug/gtk+-3.22.30/gtk/gtkrbtree.c:61)
      _gtk_rbtree_insert_after (/usr/src/debug/gtk+-3.22.30/gtk/gtkrbtree.c:456)
      gtk_tree_view_build_tree (/usr/src/debug/gtk+-3.22.30/gtk/gtktreeview.c:9570)
      gtk_tree_view_real_expand_row (/usr/src/debug/gtk+-3.22.30/gtk/gtktreeview.c:12865)
      gtk_tree_view_expand_row (/usr/src/debug/gtk+-3.22.30/gtk/gtktreeview.c:12920)
      Java_org_eclipse_swt_internal_gtk_GTK_gtk_1tree_1view_1expand_1row (??:?)
      ?? (??:0)

      The same leak can be reproduced with the following GTK+ snippet:

      // gcc -g tree.c `pkg-config --cflags --libs gtk+-3.0` -o tree

      #include <gtk/gtk.h>

      enum
      {
      COL1 = 0,
      NUM_COLS
      } ;

      int
      main (int argc, char **argv)
      {
      GtkWidget *window;
      GtkWidget *scrolled_window;
      GtkWidget *view;

      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);

      GtkCellRenderer *renderer;

      view = gtk_tree_view_new ();

      renderer = gtk_cell_renderer_text_new ();
      gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (view), -1, "column 1", renderer, "text", COL1, NULL);

      GtkTreeStore *treestore;
      GtkTreeIter iter, child;

      treestore = gtk_tree_store_new(NUM_COLS, G_TYPE_STRING);

      gtk_tree_store_append(treestore, &iter, NULL);
      gtk_tree_store_set(treestore, &iter, COL1, "item", -1);
      gtk_tree_store_append(treestore, &iter, NULL);
      gtk_tree_store_set(treestore, &iter, COL1, "item", -1);
      GtkTreePath *path = NULL;
      path = gtk_tree_model_get_path (GTK_TREE_MODEL(treestore), &iter);

      int j;
      for (j = 0; j < 6; ++j)

      { gtk_tree_store_append(treestore, &child, &iter); gtk_tree_store_set(treestore, &child, COL1, "child", -1); }

      gtk_tree_view_set_model (GTK_TREE_VIEW (view), GTK_TREE_MODEL (treestore));

      if (path)

      { gtk_tree_view_expand_row(GTK_TREE_VIEW(view), path, FALSE); gtk_tree_path_free(path); }

      gtk_container_add (GTK_CONTAINER (window), scrolled_window);
      gtk_container_add (GTK_CONTAINER (scrolled_window), view);

      gtk_widget_show_all (window);

      GtkTreeIter iter1, child1;
      if (gtk_tree_model_iter_nth_child(GTK_TREE_MODEL(treestore), &iter1, NULL, 1))

      { gtk_tree_store_remove(treestore, &iter1); }

      g_object_unref(treestore);

      gtk_main ();

      return 0;
      }

      jemalloc reports a memory leak as follows:

      [240 bytes leaked]
      je_prof_backtrace (/home/sandreev/git/misc/jemalloc/src/prof.c:636 (discriminator 2))
      je_malloc_default (/home/sandreev/git/misc/jemalloc/src/jemalloc.c:2289)
      g_malloc (??:?)
      g_slice_alloc (??:?)
      _gtk_rbnode_new.isra.2 (/usr/src/debug/gtk+-3.22.30/gtk/gtkrbtree.c:61)
      _gtk_rbtree_insert_after (/usr/src/debug/gtk+-3.22.30/gtk/gtkrbtree.c:456)
      gtk_tree_view_build_tree (/usr/src/debug/gtk+-3.22.30/gtk/gtktreeview.c:9570)
      gtk_tree_view_real_expand_row (/usr/src/debug/gtk+-3.22.30/gtk/gtktreeview.c:12865)
      gtk_tree_view_expand_row (/usr/src/debug/gtk+-3.22.30/gtk/gtktreeview.c:12920)
      ?? (??:0)
      __libc_start_main (/usr/src/debug/glibc-2.17-c758a686/csu/../csu/libc-start.c:274)
      ?? (??:0)

      Actual results:

      Memory is leaked.

      Expected results:

      Memory is not leaked.

      Additional info:

      For more context (e.g. actual Eclipse user operations to run into the leak) see Eclipse bug: https://bugs.eclipse.org/bugs/show_bug.cgi?id=574065

              jotnar-project Jötnar Project
              jira-bugzilla-migration RH Bugzilla Integration
              Matthias Clasen Matthias Clasen
              Jötnar Project Jötnar Project
              Votes:
              0 Vote for this issue
              Watchers:
              12 Start watching this issue

                Created:
                Updated: