From 6d19ae5ceeb6feeb3eca2e2749a210187ed81fbb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adri=C3=A1n=20Medra=C3=B1o=20Calvo?= Date: Mon, 8 Oct 2018 12:00:00 +0000 Subject: Fix memory leaks when creating and deleting markers --- generic/tkbltGrMarkerOp.C | 27 ++++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/generic/tkbltGrMarkerOp.C b/generic/tkbltGrMarkerOp.C index 917052d..5103a3d 100644 --- a/generic/tkbltGrMarkerOp.C +++ b/generic/tkbltGrMarkerOp.C @@ -121,6 +121,7 @@ static int CreateMarker(Graph* graphPtr, Tcl_Interp* interp, Tcl_AppendResult(graphPtr->interp_, "marker \"", name, "\" already exists in \"", Tcl_GetString(objv[0]), "\"", NULL); + delete [] name; return TCL_ERROR; } @@ -133,6 +134,8 @@ static int CreateMarker(Graph* graphPtr, Tcl_Interp* interp, else if (!strcmp(type, "text")) markerPtr = new TextMarker(graphPtr, name, hPtr); else { + Tcl_DeleteHashEntry(hPtr); + delete [] name; Tcl_AppendResult(interp, "unknown marker type ", type, NULL); return TCL_ERROR; } @@ -141,6 +144,7 @@ static int CreateMarker(Graph* graphPtr, Tcl_Interp* interp, if ((Tk_InitOptions(graphPtr->interp_, (char*)markerPtr->ops(), markerPtr->optionTable(), graphPtr->tkwin_) != TCL_OK) || (MarkerObjConfigure(graphPtr, markerPtr, interp, objc-offset, objv+offset) != TCL_OK)) { delete markerPtr; + delete [] name; return TCL_ERROR; } @@ -259,21 +263,30 @@ static int DeleteOp(ClientData clientData, Tcl_Interp* interp, Tcl_WrongNumArgs(interp, 2, objv, "markerId..."); return TCL_ERROR; } + + int res = TCL_OK; + for (int ii=3; iitkwin_), "\"", NULL); - return TCL_ERROR; + const char* string = Tcl_GetString(objv[ii]); + Tcl_HashEntry* hPtr = Tcl_FindHashEntry(&graphPtr->markers_.table, string); + if (!hPtr) { + if (res == TCL_OK) { + Tcl_AppendResult(interp, "can't find markers in \"", + Tk_PathName(graphPtr->tkwin_), "\":", NULL); + } + Tcl_AppendResult(interp, " ", Tcl_GetString(objv[ii])); + res = TCL_ERROR; + } else { + markerPtr = (Marker*)Tcl_GetHashValue(hPtr); + delete markerPtr; } - delete markerPtr; } graphPtr->flags |= CACHE; graphPtr->eventuallyRedraw(); - return TCL_OK; + return res; } static int ExistsOp(ClientData clientData, Tcl_Interp* interp, -- cgit v0.12