One of our developers noticed the leak stated above.  He took a stab at a
rough patch, but it probably needs further revision/review.  The patch is
attached.  Here is his commentary:

Noticed a memory leak when calling XmTextFieldSetString.

Traced to XtCalloc in TextF_InitialiseHighlight.

TextF_InitialiseHighlight is called repeatedly and every time allocates
a new highlight list without XtFree of the old one.  initialize also
XtMalloc's a single entry highlight list then calls
TextF_InitialiseHighlight - thereby leaking the initial XtMalloc.

Simple solution is to have TextF_InitialiseHighlight
only XtCalloc once and have initialize NULL out TextF_Highlight(w).list
and call TextF_InitialiseHighlight to do the real work.

Thanks.

-- 
Brian Ford
Senior Realtime Software Engineer
VITAL - Visual Simulation Systems
FlightSafety International
Phone: 314-551-8460
Fax:   314-551-8444
--- /home/ford/downloads/lesstif-0.93.40/lib/Xm/TextF.c 2003-03-04 12:21:24.000000000 
-0600
+++ ./TextF.c   2003-03-10 16:16:54.000000000 -0600
@@ -1128,15 +1128,19 @@ SizeRecalc(XmTextFieldWidget w)
 static void
 TextF_InitialiseHighlight(Widget w)
 {
+    /* This is called repeatedly - avoid memory leak
+    ** reuse original allocation!
+    */
+    if (TextF_Highlight(w).list == NULL)
+    {
        TextF_Highlight(w).list = (_XmHighlightRec *)XtCalloc(8, 
sizeof(_XmHighlightRec));
        TextF_Highlight(w).maximum = 8;
-       TextF_Highlight(w).number = 2;
-       TextF_Highlight(w).list[0].position = 0;
-       TextF_Highlight(w).list[0].mode = XmHIGHLIGHT_NORMAL;
-       TextF_Highlight(w).list[1].position = INT_MAX;
-       TextF_Highlight(w).list[1].mode = XmHIGHLIGHT_NORMAL;
+    }
 
-       TextF_HighlightStart(w) = TextF_HighlightEnd(w) = -1;
+    TextF_Highlight(w).number = 2;
+    TextF_Highlight(w).list[0].position = 0;
+    TextF_Highlight(w).list[0].mode = XmHIGHLIGHT_NORMAL;
+    TextF_Highlight(w).list[1].position = INT_MAX;
+    TextF_Highlight(w).list[1].mode = XmHIGHLIGHT_NORMAL;
+
+    TextF_HighlightStart(w) = TextF_HighlightEnd(w) = -1;
 }
 
 /*
@@ -1317,10 +1321,11 @@ initialize(Widget request, Widget tnew, 
        }
 
        TextF_OldCursorX(w) = -1;

+       /* use TextF_InitialiseHighlight (sp) to do everything here
+       ** instead of later, also avoids memory leak of old XtMalloc
+       ** NOTE: must null out TextF_Highlight(w).list
+       */
-       TextF_HighlightStart(w) = TextF_HighlightEnd(w) = -1;
 
-       TextF__(w).highlight.list=(_XmHighlightRec*)XtMalloc(sizeof(_XmHighlightRec));
-       TextF_HighlightMode(w) = XmHIGHLIGHT_NORMAL;
+
+       TextF_Highlight(w).list = NULL;
+       TextF_InitialiseHighlight(tnew);
+
        TextF_OldHighlightStart(w) = TextF_OldHighlightEnd(w) = -1;
        TextF_XOffset(w) = TextF_OldXOffset(w) = 0;
 
@@ -1355,7 +1360,6 @@ initialize(Widget request, Widget tnew, 
 
        XmDropSiteRegister(tnew, ds_args, n);
 
-       TextF_InitialiseHighlight(tnew);
        w->text.max_char_size = 1;              /* FIX ME */
 }
 
@@ -1433,7 +1437,9 @@ destroy(Widget aw)
 
     XtFree((char *)w->text.extension);
     XtUninstallTranslations(aw);
-    XtFree((char *)TextF__(w).highlight.list);
+
+    /* This is probably not necessary...
+    ** Use the macro... should we null out the old pointer?
+    */
+    XtFree((char *)TextF_Highlight(w).list);
+    TextF_Highlight(w).list = NULL;
     
     /* amai: not sure this is necessary ...
              Check out the register calls for more info.

Reply via email to