]> granicus.if.org Git - postgresql/commitdiff
Fix more thinkos in new ECPG "PREPARE AS" code.
authorTom Lane <tgl@sss.pgh.pa.us>
Sun, 26 May 2019 14:39:11 +0000 (10:39 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Sun, 26 May 2019 14:39:11 +0000 (10:39 -0400)
ecpg_build_params() failed to check for ecpg_alloc failure in one
newly-added code path, and leaked a temporary string in another path.
Errors in commit a1dc6ab46, spotted by Coverity.

src/interfaces/ecpg/ecpglib/execute.c

index 6dbf2fa9e014d7c513ee2f0ccd03747e29679fb0..3c0294e98aa8f72d148e33bb5ca724000fe3c8f0 100644 (file)
@@ -1454,13 +1454,21 @@ ecpg_build_params(struct statement *stmt)
                        if (stmt->statement_type == ECPGst_prepare ||
                                stmt->statement_type == ECPGst_exec_with_exprlist)
                        {
-                               /* Add double quote both side for embedding statement name. */
-                               char       *str = ecpg_alloc(strlen(tobeinserted) + 2 + 1, stmt->lineno);
+                               /* Need to double-quote the inserted statement name. */
+                               char       *str = ecpg_alloc(strlen(tobeinserted) + 2 + 1,
+                                                                                        stmt->lineno);
 
+                               if (!str)
+                               {
+                                       ecpg_free(tobeinserted);
+                                       ecpg_free_params(stmt, false);
+                                       return false;
+                               }
                                sprintf(str, "\"%s\"", tobeinserted);
                                ecpg_free(tobeinserted);
                                tobeinserted = str;
                        }
+
                        if (!insert_tobeinserted(position, 2, stmt, tobeinserted))
                        {
                                ecpg_free_params(stmt, false);
@@ -1470,11 +1478,13 @@ ecpg_build_params(struct statement *stmt)
                }
                else if (stmt->statement_type == ECPGst_exec_with_exprlist)
                {
-
                        if (binary_format)
                        {
-                               char       *p = convert_bytea_to_string(tobeinserted, binary_length, stmt->lineno);
+                               char       *p = convert_bytea_to_string(tobeinserted,
+                                                                                                               binary_length,
+                                                                                                               stmt->lineno);
 
+                               ecpg_free(tobeinserted);
                                if (!p)
                                {
                                        ecpg_free_params(stmt, false);