From 640e57217fb6676b761a50bfa6cb30c495889390 Mon Sep 17 00:00:00 2001
From: "Lucas A. M. Magalhaes" <lucas.magalhaes@ess.eu>
Date: Wed, 10 May 2023 11:46:04 +0200
Subject: [PATCH] Fix possible memory leak in runScript.c

This was reported by cppcheck over require's code:
require-ess/src/runScript.c:128:12: error: Common realloc mistake: 'line_raw' nulled but not freed upon failure [memleakOnRealloc]
      if ((line_raw = realloc(line_raw, line_raw_size *= 2)) == NULL)
           ^

Unfortunately realloc can return null, in that case if we use something
like
line_raw = realloc(line_raw, size);
The memory pointed by line_raw is lost.
---
 require-ess/src/runScript.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/require-ess/src/runScript.c b/require-ess/src/runScript.c
index f54cef27..3f345458 100644
--- a/require-ess/src/runScript.c
+++ b/require-ess/src/runScript.c
@@ -49,6 +49,7 @@ int runScript(const char *filename, const char *args) {
   MAC_HANDLE *mac = NULL;
   FILE *file = NULL;
   char *line_raw = NULL;
+  char *aux_pointer = NULL;
   char *line_exp = NULL;
   long line_raw_size = 256;
   long line_exp_size = line_raw_size;
@@ -125,8 +126,9 @@ int runScript(const char *filename, const char *args) {
     while (line_raw[(len = (long)strlen(line_raw)) - 1] != '\n' &&
            !feof(file)) {
       if (runScriptDebug) printf("runScript partial line: \"%s\"\n", line_raw);
-      if ((line_raw = realloc(line_raw, line_raw_size *= 2)) == NULL)
+      if ((aux_pointer = realloc(line_raw, line_raw_size *= 2)) == NULL)
         goto error;
+      line_raw = aux_pointer;
       if (fgets(line_raw + len, line_raw_size - len, file) == NULL) break;
     }
     while (len > 0 && isspace((unsigned char)line_raw[len - 1]))
-- 
GitLab