From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 30341 invoked by alias); 20 Nov 2001 17:07:53 -0000 Mailing-List: contact gdb-patches-help@sourceware.cygnus.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sources.redhat.com Received: (qmail 30320 invoked from network); 20 Nov 2001 17:07:50 -0000 Received: from unknown (HELO cygnus.com) (205.180.230.5) by sourceware.cygnus.com with SMTP; 20 Nov 2001 17:07:50 -0000 Received: from makita.cygnus.com (makita.cygnus.com [205.180.230.78]) by runyon.cygnus.com (8.8.7-cygnus/8.8.7) with ESMTP id JAA23839 for ; Tue, 20 Nov 2001 09:07:49 -0800 (PST) Received: from localhost (keiths@localhost) by makita.cygnus.com (8.8.8+Sun/8.6.4) with ESMTP id JAA20234 for ; Tue, 20 Nov 2001 09:07:49 -0800 (PST) X-Authentication-Warning: makita.cygnus.com: keiths owned process doing -bs Date: Thu, 08 Nov 2001 06:33:00 -0000 From: Keith Seitz To: Subject: [RFA] varobj.c memory leaks Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-SW-Source: 2001-11/txt/msg00150.txt.bz2 Hi, I was looking at c++ problems in varobj when I noticed that we had a few memory leaks. *_name_of_child allocates memory for the return result. The result must be xfreed when no longer needed. I've tested this on gdb.mi/mi-var-display.exp, gdb.mi/mi-watch.exp, gdb.gdbtk/c_variable.exp, and gdb.gdbtk/cpp_variable.exp, and it has no regressions. Keith ChangeLog 2001-11-20 Keith Seitz * varobj.c (c_value_of_child): Release memory for "name" when finshed using it. (c_type_of_child): Likewise. (cplus_value_of_child): Isolate the use of name_of_child to one case that needs it. Release memory for "name" when finished using it. Patch Index: varobj.c =================================================================== RCS file: /cvs/src/src/gdb/varobj.c,v retrieving revision 1.24 diff -u -p -r1.24 varobj.c --- varobj.c 2001/11/19 19:44:04 1.24 +++ varobj.c 2001/11/20 17:03:27 @@ -1977,6 +1977,7 @@ c_value_of_child (struct varobj *parent, if (value != NULL) release_value (value); + xfree (name); return value; } @@ -2019,6 +2020,7 @@ c_type_of_child (struct varobj *parent, break; } + xfree (name); return type; } @@ -2281,7 +2283,6 @@ cplus_value_of_child (struct varobj *par { struct type *type; struct value *value; - char *name; if (CPLUS_FAKE_CHILD (parent)) type = get_type_deref (parent->parent); @@ -2289,19 +2290,22 @@ cplus_value_of_child (struct varobj *par type = get_type_deref (parent); value = NULL; - name = name_of_child (parent, index); if (((TYPE_CODE (type)) == TYPE_CODE_STRUCT) || ((TYPE_CODE (type)) == TYPE_CODE_UNION)) { if (CPLUS_FAKE_CHILD (parent)) { + char *name; struct value *temp = parent->parent->value; + name = name_of_child (parent, index); gdb_value_struct_elt (NULL, &value, &temp, NULL, name, NULL, "cplus_structure"); if (value != NULL) release_value (value); + + xfree (name); } else if (index >= TYPE_N_BASECLASSES (type)) {