ecpg: Fix memory leaks in ecpg_auto_prepare()
authorMichael Paquier <michael@paquier.xyz>
Sun, 27 Jul 2025 23:38:24 +0000 (08:38 +0900)
committerMichael Paquier <michael@paquier.xyz>
Sun, 27 Jul 2025 23:38:24 +0000 (08:38 +0900)
This routines includes three code paths that can fail, with the
allocated prepared statement name going out of scope.

Per report from Coverity.  Oversight in commit a6eabec6808c, that has
played with the order of some ecpg_strdup() calls in this code path.

src/interfaces/ecpg/ecpglib/prepare.c

index dd6fd1fe7f40777ab1f18cab537ea2bb9b1f2877..06f0135813b371d06fee38828f32e14e8fbb04c0 100644 (file)
@@ -603,7 +603,10 @@ ecpg_auto_prepare(int lineno, const char *connection_name, const int compat, cha
        prep = ecpg_find_prepared_statement(stmtID, con, NULL);
        /* This prepared name doesn't exist on this connection. */
        if (!prep && !prepare_common(lineno, con, stmtID, query))
+       {
+           ecpg_free(*name);
            return false;
+       }
 
    }
    else
@@ -619,11 +622,17 @@ ecpg_auto_prepare(int lineno, const char *connection_name, const int compat, cha
            return false;
 
        if (!ECPGprepare(lineno, connection_name, 0, stmtID, query))
+       {
+           ecpg_free(*name);
            return false;
+       }
 
        entNo = AddStmtToCache(lineno, stmtID, connection_name, compat, query);
        if (entNo < 0)
+       {
+           ecpg_free(*name);
            return false;
+       }
    }
 
    /* increase usage counter */