]> granicus.if.org Git - postgresql/commitdiff
Hopefully fixing memory handling issues in ecpglib that Coverity found.
authorMichael Meskes <meskes@postgresql.org>
Tue, 26 Feb 2019 09:56:54 +0000 (10:56 +0100)
committerMichael Meskes <meskes@postgresql.org>
Tue, 26 Feb 2019 09:56:54 +0000 (10:56 +0100)
src/interfaces/ecpg/ecpglib/execute.c

index 0c147b77cc92d836b48461ff1d4530d8dd327ab0..8e61339ae30c3864f89c83fb90408ffb46365f82 100644 (file)
@@ -1073,9 +1073,14 @@ print_param_value(char *value, int len, int is_binary, int lineno, int nth)
        else
        {
                value_s = ecpg_alloc(ecpg_hex_enc_len(len)+1, lineno);
-               ecpg_hex_encode(value, len, value_s);
-               value_s[ecpg_hex_enc_len(len)] = '\0';
-               malloced = true;
+               if (value_s != NULL)
+               {
+                       ecpg_hex_encode(value, len, value_s);
+                       value_s[ecpg_hex_enc_len(len)] = '\0';
+                       malloced = true;
+               }
+               else
+                       value_s = "no memory for logging of parameter";
        }
 
        ecpg_log("ecpg_free_params on line %d: parameter %d = %s\n",
@@ -1134,7 +1139,7 @@ insert_tobeinserted(int position, int ph_len, struct statement *stmt, char *tobe
        ecpg_free(stmt->command);
        stmt->command = newcopy;
 
-       ecpg_free((char *) tobeinserted);
+       ecpg_free(tobeinserted);
        return true;
 }
 
@@ -1400,6 +1405,7 @@ ecpg_build_params(struct statement *stmt)
                                           ECPG_SQLSTATE_USING_CLAUSE_DOES_NOT_MATCH_PARAMETERS,
                                           NULL);
                        ecpg_free_params(stmt, false);
+                       ecpg_free(tobeinserted);
                        return false;
                }
 
@@ -1436,33 +1442,28 @@ ecpg_build_params(struct statement *stmt)
                }
                else
                {
-                       char      **paramvalues;
-                       int                *paramlengths;
-                       int                *paramformats;
-
-                       if (!(paramvalues = (char **) ecpg_realloc(stmt->paramvalues, sizeof(char *) * (stmt->nparams + 1), stmt->lineno)))
+                       if (!(stmt->paramvalues = (char **) ecpg_realloc(stmt->paramvalues, sizeof(char *) * (stmt->nparams + 1), stmt->lineno)))
                        {
                                ecpg_free_params(stmt, false);
+                               ecpg_free(tobeinserted);
                                return false;
                        }
-                       if (!(paramlengths = (int *) ecpg_realloc(stmt->paramlengths, sizeof(int) * (stmt->nparams + 1), stmt->lineno)))
+                       stmt->paramvalues[stmt->nparams] = tobeinserted;
+
+                       if (!(stmt->paramlengths = (int *) ecpg_realloc(stmt->paramlengths, sizeof(int) * (stmt->nparams + 1), stmt->lineno)))
                        {
                                ecpg_free_params(stmt, false);
                                return false;
                        }
-                       if (!(paramformats = (int *) ecpg_realloc(stmt->paramformats, sizeof(int) * (stmt->nparams + 1), stmt->lineno)))
+                       stmt->paramlengths[stmt->nparams] = binary_length;
+
+                       if (!(stmt->paramformats = (int *) ecpg_realloc(stmt->paramformats, sizeof(int) * (stmt->nparams + 1), stmt->lineno)))
                        {
                                ecpg_free_params(stmt, false);
                                return false;
                        }
-
+                       stmt->paramformats[stmt->nparams] = (binary_format ? 1 : 0);
                        stmt->nparams++;
-                       stmt->paramvalues = paramvalues;
-                       stmt->paramlengths = paramlengths;
-                       stmt->paramformats = paramformats;
-                       stmt->paramvalues[stmt->nparams - 1] = tobeinserted;
-                       stmt->paramlengths[stmt->nparams - 1] = binary_length;
-                       stmt->paramformats[stmt->nparams - 1] = (binary_format ? 1 : 0);
 
                        /* let's see if this was an old style placeholder */
                        if (stmt->command[position] == '?')