[esnacc-dev] [PATCH] cxx-lib/src: corrected usage of 'delete' causing uncleared memory.

Aaron Conole aconole at bytheb.org
Mon Jun 24 12:59:29 UTC 2019


From: Jan Sperber <jan.sperber at hytera.de>

From: Jan Sperber <jan.sperber at hytera.de>

Working with libcxxasn1.so showed memory leakage. After analyzing the
esnacc-ng sources we have seen several deletes have not been used
correctly (helper tool cppcheck) and found that asn-int.cpp didn't
deleted the allocated buffer at all. After further review I think there
is no need to keep that buffer in memory so I added the delete statement
at the end of the function

Reported-at: https://github.com/esnacc/esnacc-ng/pull/49
Fixes: f245889884a7 ("cxx/asn-int: fix integer encoding/decoding")
Fixes: dce1e2a48583 ("Starting with eSnacc 1.7 as a base")
Signed-off-by: Jan Sperber <jan.sperber at hytera.de>
Signed-off-by: Aaron Conole <aconole at bytheb.org>
---
 X-post from github.

 cxx-lib/src/asn-int.cpp |  1 +
 cxx-lib/src/tcl-if.cpp  | 22 +++++++++++-----------
 2 files changed, 12 insertions(+), 11 deletions(-)

diff --git a/cxx-lib/src/asn-int.cpp b/cxx-lib/src/asn-int.cpp
index 25fbe3b..3d303ab 100644
--- a/cxx-lib/src/asn-int.cpp
+++ b/cxx-lib/src/asn-int.cpp
@@ -130,6 +130,7 @@ void AsnInt::BDecContent (const AsnBuf &b, AsnTag, AsnLen elmtLen,
     }
 
     storeDERInteger(bytes, elmtLen, !isNeg);
+    delete[] bytes;
 }
 
 AsnInt::AsnInt (const AsnInt &that)
diff --git a/cxx-lib/src/tcl-if.cpp b/cxx-lib/src/tcl-if.cpp
index 73c71e6..0161e67 100644
--- a/cxx-lib/src/tcl-if.cpp
+++ b/cxx-lib/src/tcl-if.cpp
@@ -157,7 +157,7 @@ int ASN1File::read (Tcl_Interp *interp, const char *rfn)
   if (::read (rfd, buf, filesize) != filesize)
   {
     Tcl_AppendResult (interp, "can't read \"", rfn, "\": ", Tcl_PosixError (interp), NULL);
-    delete buf;
+    delete[] buf;
     return TCL_ERROR;
   }
 
@@ -173,7 +173,7 @@ int ASN1File::read (Tcl_Interp *interp, const char *rfn)
     sprintf (eno, "%d", eval);
     Tcl_AppendResult (interp, "can't decode (error ", eno, ")", NULL);
     Tcl_SetErrorCode (interp, "SNACC", "DECODE", eno, NULL);
-    delete buf;
+    delete[] buf;
     return TCL_ERROR;
   }
   pdu->BDec (inputBuf, decodedLen, env);
@@ -181,7 +181,7 @@ int ASN1File::read (Tcl_Interp *interp, const char *rfn)
   {
     Tcl_AppendResult (interp, "can't decode, out of data", NULL);
     Tcl_SetErrorCode (interp, "SNACC", "DECODE", "EOBUF", NULL);
-    delete buf;
+    delete[] buf;
     return TCL_ERROR;
   }
 
@@ -192,7 +192,7 @@ cout << "DECODED:" << endl << *pdu << endl;
   if (decodedLen != filesize)
     sprintf (interp->result, "decoded %d of %d bytes", decodedLen, filesize);
 
-  delete buf;
+  delete[] buf;
   return TCL_OK;
 }
 
@@ -250,7 +250,7 @@ int ASN1File::write (Tcl_Interp *interp, const char *wfn)
     encodedLen = pdu->BEnc (outputBuf);
     if (!outputBuf.WriteError())
       break;
-    delete buf;
+    delete[] buf;
   }
 
   outputBuf.ResetInReadMode();
@@ -264,14 +264,14 @@ int ASN1File::write (Tcl_Interp *interp, const char *wfn)
     if (::write (wfd, hunk, hunklen) != hunklen)
     {
       Tcl_AppendResult (interp, "write error on \"", wfn, "\": ", Tcl_PosixError (interp), NULL);
-      delete hunk; // may affect errno
-      delete buf; // may affect errno
+      delete[] hunk; // may affect errno
+      delete[] buf; // may affect errno
       return TCL_ERROR;
     }
   }
 
-  delete hunk;
-  delete buf;
+  delete[] hunk;
+  delete[] buf;
 
   filesize = encodedLen;
   if (!wfn)
@@ -311,12 +311,12 @@ int import (Tcl_Interp *interp, int argc, char **argv)
   if (::read (fd, ibuf, filesize) != filesize)
   {
     Tcl_AppendResult (interp, "read error on \"", fn, "\": ", Tcl_PosixError (interp), NULL);
-    delete ibuf;
+    delete[] ibuf;
     return TCL_ERROR;
   }
 
   int result = debinify (interp, ibuf, filesize);
-  delete ibuf;
+  delete[] ibuf;
   return result;
 }
 
-- 
2.21.0



More information about the dev mailing list