]> granicus.if.org Git - postgresql/commitdiff
Fixed some memory leaks in ECPG.
authorMichael Meskes <meskes@postgresql.org>
Fri, 12 Jun 2015 12:52:55 +0000 (14:52 +0200)
committerMichael Meskes <meskes@postgresql.org>
Sat, 13 Jun 2015 09:17:42 +0000 (11:17 +0200)
Patch by Michael Paquier

Conflicts:
src/interfaces/ecpg/preproc/variable.c
src/interfaces/ecpg/preproc/pgc.l

src/interfaces/ecpg/preproc/descriptor.c
src/interfaces/ecpg/preproc/pgc.l
src/interfaces/ecpg/preproc/variable.c

index 965963de7e15c6472307ebd81a595c80595bb86e..a9a4d6d3e71e8d4044ec908de4631e90fbc859f7 100644 (file)
@@ -175,6 +175,7 @@ output_get_descr(char *desc_name, char *index)
        for (results = assignments; results != NULL; results = results->next)
        {
                const struct variable *v = find_variable(results->variable);
+               char *str_zero = mm_strdup("0");
 
                switch (results->value)
                {
@@ -188,7 +189,8 @@ output_get_descr(char *desc_name, char *index)
                                break;
                }
                fprintf(yyout, "%s,", get_dtype(results->value));
-               ECPGdump_a_type(yyout, v->name, v->type, v->brace_level, NULL, NULL, -1, NULL, NULL, mm_strdup("0"), NULL, NULL);
+               ECPGdump_a_type(yyout, v->name, v->type, v->brace_level, NULL, NULL, -1, NULL, NULL, str_zero, NULL, NULL);
+               free(str_zero);
        }
        drop_assignments();
        fputs("ECPGd_EODT);\n", yyout);
@@ -292,8 +294,12 @@ output_set_descr(char *desc_name, char *index)
                        case ECPGd_indicator:
                        case ECPGd_length:
                        case ECPGd_type:
-                               fprintf(yyout, "%s,", get_dtype(results->value));
-                               ECPGdump_a_type(yyout, v->name, v->type, v->brace_level, NULL, NULL, -1, NULL, NULL, mm_strdup("0"), NULL, NULL);
+                               {
+                                       char *str_zero = mm_strdup("0");
+                                       fprintf(yyout, "%s,", get_dtype(results->value));
+                                       ECPGdump_a_type(yyout, v->name, v->type, v->brace_level, NULL, NULL, -1, NULL, NULL, str_zero, NULL, NULL);
+                                       free(str_zero);
+                               }
                                break;
 
                        default:
index 40bdd8d6d9d20917e961a4f8555708e1adfbb088..adb61765bfe22aa1bc92b89187805e71074e9420 100644 (file)
@@ -27,7 +27,7 @@
 extern YYSTYPE yylval;
 
 static int             xcdepth = 0;    /* depth of nesting in slash-star comments */
-static char       *dolqstart;      /* current $foo$ quote start string */
+static char       *dolqstart = NULL;   /* current $foo$ quote start string */
 static YY_BUFFER_STATE scanbufhandle;
 static char *scanbuf;
 
@@ -524,6 +524,8 @@ cppline                     {space}*#([^i][A-Za-z]*|{if}|{ifdef}|{ifndef}|{import})(.*\\{space})*.
                        }
 <SQL>{dolqdelim}        {
                                token_start = yytext;
+                               if (dolqstart)
+                                       free(dolqstart);
                                dolqstart = mm_strdup(yytext);
                                BEGIN(xdolq);
                                startlit();
index c4ccabd2a69bfce28d2a83b798679a88fd192275..2a39d7f7e760e5ceabb0b02d8ccaf401dfedc6a3 100644 (file)
@@ -437,9 +437,13 @@ remove_variable_from_list(struct arguments ** list, struct variable * var)
 void
 dump_variables(struct arguments * list, int mode)
 {
+       char       *str_zero;
+
        if (list == NULL)
                return;
 
+       str_zero = mm_strdup("0");
+
        /*
         * The list is build up from the beginning so lets first dump the end of
         * the list:
@@ -450,11 +454,13 @@ dump_variables(struct arguments * list, int mode)
        /* Then the current element and its indicator */
        ECPGdump_a_type(yyout, list->variable->name, list->variable->type, list->variable->brace_level,
                                        list->indicator->name, list->indicator->type, list->indicator->brace_level,
-                                       NULL, NULL, mm_strdup("0"), NULL, NULL);
+                                       NULL, NULL, str_zero, NULL, NULL);
 
        /* Then release the list element. */
        if (mode != 0)
                free(list);
+
+       free(str_zero);
 }
 
 void