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>
Fri, 12 Jun 2015 12:52:55 +0000 (14:52 +0200)
Patch by Michael Paquier

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

index 053a7afda863104859e56ea7c1d3105b253cdebd..ebd95d3c4ba80cba95b282dc2a0db60a4d5673bb 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 c70f2986962d6323b8ae197e8a21f1985649cacc..0453409d373cab6c93f022b4d7d4f64db548c9e6 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;
 
@@ -550,6 +550,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 2ad7b5d255eddf4f38d580cccb4c1a41f262ba4d..bb4b664b859ec996d0daf86435916efb2348a713 100644 (file)
@@ -437,11 +437,13 @@ remove_variable_from_list(struct arguments ** list, struct variable * var)
 void
 dump_variables(struct arguments * list, int mode)
 {
-   char       *str_zero = mm_strdup("0");
+   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: