From e16ca08b331fa18dbe81792d5933107f9560499a Mon Sep 17 00:00:00 2001 From: Kuan-Wei Chiu Date: Mon, 18 Sep 2023 22:43:44 +0800 Subject: [PATCH] Fix memory leak and handle realloc failure In the previous code, there was a memory leak issue where the previously allocated memory was not freed upon a failed realloc operation. This commit addresses the problem by releasing the old memory before setting the pointer to NULL in case of a realloc failure. This ensures that memory is properly managed and avoids potential memory leaks. --- modules/dnn/src/torch/THDiskFile.cpp | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/modules/dnn/src/torch/THDiskFile.cpp b/modules/dnn/src/torch/THDiskFile.cpp index 84b6b23e81..bede95e021 100644 --- a/modules/dnn/src/torch/THDiskFile.cpp +++ b/modules/dnn/src/torch/THDiskFile.cpp @@ -375,15 +375,21 @@ static long THDiskFile_readString(THFile *self, const char *format, char **str_) long total = TBRS_BSZ; long pos = 0L; + if (p == NULL) + THError("read error: failed to allocate buffer"); for (;;) { if(total-pos == 0) /* we need more space! */ { total += TBRS_BSZ; - p = (char*)THRealloc(p, total); + char *new_p = (char*)THRealloc(p, total); + if (new_p == NULL) + { + THFree(p); + THError("read error: failed to reallocate buffer"); + } + p = new_p; } - if (p == NULL) - THError("read error: failed to allocate buffer"); pos += fread(p+pos, 1, total-pos, dfself->handle); if (pos < total) /* eof? */ { @@ -409,15 +415,21 @@ static long THDiskFile_readString(THFile *self, const char *format, char **str_) long pos = 0L; long size; + if (p == NULL) + THError("read error: failed to allocate buffer"); for (;;) { if(total-pos <= 1) /* we can only write '\0' in there! */ { total += TBRS_BSZ; - p = (char*)THRealloc(p, total); + char *new_p = (char*)THRealloc(p, total); + if (new_p == NULL) + { + THFree(p); + THError("read error: failed to reallocate buffer"); + } + p = new_p; } - if (p == NULL) - THError("read error: failed to allocate buffer"); if (fgets(p+pos, total-pos, dfself->handle) == NULL) /* eof? */ { if(pos == 0L)