Commit 91411b61 authored by Michael Meskes's avatar Michael Meskes

Fixed one memory leak in descriptor code.

Made sure ecpg deletes output file in case of an error.
parent 5f2bda15
/* dynamic SQL support routines /* dynamic SQL support routines
* *
* $PostgreSQL: pgsql/src/interfaces/ecpg/ecpglib/descriptor.c,v 1.21 2007/04/27 06:56:11 meskes Exp $ * $PostgreSQL: pgsql/src/interfaces/ecpg/ecpglib/descriptor.c,v 1.22 2007/06/11 11:52:08 meskes Exp $
*/ */
#define POSTGRES_ECPG_INTERNAL #define POSTGRES_ECPG_INTERNAL
...@@ -547,7 +547,7 @@ ECPGset_desc(int lineno, const char *desc_name, int index,...) ...@@ -547,7 +547,7 @@ ECPGset_desc(int lineno, const char *desc_name, int index,...)
ECPGfree(var); ECPGfree(var);
return false; return false;
} }
ECPGfree(desc_item->data); /* free() takes care of a potential NULL value */
desc_item->data = (char *) tobeinserted; desc_item->data = (char *) tobeinserted;
tobeinserted = NULL; tobeinserted = NULL;
break; break;
...@@ -607,6 +607,18 @@ ECPGdeallocate_desc(int line, const char *name) ...@@ -607,6 +607,18 @@ ECPGdeallocate_desc(int line, const char *name)
{ {
if (!strcmp(name, i->name)) if (!strcmp(name, i->name))
{ {
struct descriptor_item *desc_item;
for (desc_item = i->items; desc_item;)
{
struct descriptor_item *di;
ECPGfree(desc_item->data);
di = desc_item;
desc_item = desc_item->next;
ECPGfree(di);
}
*lastptr = i->next; *lastptr = i->next;
ECPGfree(i->name); ECPGfree(i->name);
PQclear(i->result); PQclear(i->result);
......
/* $PostgreSQL: pgsql/src/interfaces/ecpg/ecpglib/execute.c,v 1.66 2007/04/27 06:56:11 meskes Exp $ */ /* $PostgreSQL: pgsql/src/interfaces/ecpg/ecpglib/execute.c,v 1.67 2007/06/11 11:52:08 meskes Exp $ */
/* /*
* The aim is to get a simpler inteface to the database routines. * The aim is to get a simpler inteface to the database routines.
...@@ -48,7 +48,7 @@ quote_postgres(char *arg, bool quote, int lineno) ...@@ -48,7 +48,7 @@ quote_postgres(char *arg, bool quote, int lineno)
* will be quoted once they are inserted in a statement * will be quoted once they are inserted in a statement
*/ */
if (!quote) if (!quote)
return res = ECPGstrdup(arg, lineno); return arg;
else else
{ {
length = strlen(arg); length = strlen(arg);
......
/* $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/ecpg.c,v 1.98 2007/03/17 19:25:23 meskes Exp $ */ /* $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/ecpg.c,v 1.99 2007/06/11 11:52:08 meskes Exp $ */
/* New main for ecpg, the PostgreSQL embedded SQL precompiler. */ /* New main for ecpg, the PostgreSQL embedded SQL precompiler. */
/* (C) Michael Meskes <meskes@postgresql.org> Feb 5th, 1998 */ /* (C) Michael Meskes <meskes@postgresql.org> Feb 5th, 1998 */
...@@ -20,6 +20,8 @@ int ret_value = 0, ...@@ -20,6 +20,8 @@ int ret_value = 0,
header_mode = false, header_mode = false,
regression_mode = false; regression_mode = false;
char *output_filename;
enum COMPAT_MODE compat = ECPG_COMPAT_PGSQL; enum COMPAT_MODE compat = ECPG_COMPAT_PGSQL;
struct _include_path *include_paths = NULL; struct _include_path *include_paths = NULL;
...@@ -135,6 +137,7 @@ main(int argc, char *const argv[]) ...@@ -135,6 +137,7 @@ main(int argc, char *const argv[])
find_my_exec(argv[0], my_exec_path); find_my_exec(argv[0], my_exec_path);
output_filename = NULL;
while ((c = getopt_long(argc, argv, "vcio:I:tD:dC:r:h?", ecpg_options, NULL)) != -1) while ((c = getopt_long(argc, argv, "vcio:I:tD:dC:r:h?", ecpg_options, NULL)) != -1)
{ {
switch (c) switch (c)
...@@ -163,14 +166,18 @@ main(int argc, char *const argv[]) ...@@ -163,14 +166,18 @@ main(int argc, char *const argv[])
regression_mode = true; regression_mode = true;
break; break;
case 'o': case 'o':
if (strcmp(optarg, "-") == 0) output_filename = optarg;
if (strcmp(output_filename, "-") == 0)
yyout = stdout; yyout = stdout;
else else
yyout = fopen(optarg, PG_BINARY_W); yyout = fopen(output_filename, PG_BINARY_W);
if (yyout == NULL) if (yyout == NULL)
{
fprintf(stderr, "%s: could not open file \"%s\": %s\n", fprintf(stderr, "%s: could not open file \"%s\": %s\n",
progname, optarg, strerror(errno)); progname, output_filename, strerror(errno));
output_filename = NULL;
}
else else
out_option = 1; out_option = 1;
break; break;
...@@ -269,8 +276,7 @@ main(int argc, char *const argv[]) ...@@ -269,8 +276,7 @@ main(int argc, char *const argv[])
/* after the options there must not be anything but filenames */ /* after the options there must not be anything but filenames */
for (fnr = optind; fnr < argc; fnr++) for (fnr = optind; fnr < argc; fnr++)
{ {
char *output_filename = NULL, char *ptr2ext;
*ptr2ext;
/* If argv[fnr] is "-" we have to read from stdin */ /* If argv[fnr] is "-" we have to read from stdin */
if (strcmp(argv[fnr], "-") == 0) if (strcmp(argv[fnr], "-") == 0)
...@@ -467,7 +473,7 @@ main(int argc, char *const argv[]) ...@@ -467,7 +473,7 @@ main(int argc, char *const argv[])
fclose(yyout); fclose(yyout);
} }
if (output_filename) if (output_filename && out_option == 0)
free(output_filename); free(output_filename);
free(input_filename); free(input_filename);
......
/* $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/extern.h,v 1.65 2007/03/17 19:25:23 meskes Exp $ */ /* $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/extern.h,v 1.66 2007/06/11 11:52:08 meskes Exp $ */
#ifndef _ECPG_PREPROC_EXTERN_H #ifndef _ECPG_PREPROC_EXTERN_H
#define _ECPG_PREPROC_EXTERN_H #define _ECPG_PREPROC_EXTERN_H
...@@ -37,6 +37,7 @@ extern int yylineno, ...@@ -37,6 +37,7 @@ extern int yylineno,
yyleng; yyleng;
extern FILE *yyin, extern FILE *yyin,
*yyout; *yyout;
extern char *output_filename;
extern struct _include_path *include_paths; extern struct _include_path *include_paths;
extern struct cursor *cur; extern struct cursor *cur;
...@@ -93,7 +94,7 @@ extern ScanKeyword *ScanKeywordLookup(char *text); ...@@ -93,7 +94,7 @@ extern ScanKeyword *ScanKeywordLookup(char *text);
extern void scanner_init(const char *); extern void scanner_init(const char *);
extern void parser_init(void); extern void parser_init(void);
extern void scanner_finish(void); extern void scanner_finish(void);
int filtered_base_yylex(void); extern int filtered_base_yylex(void);
/* return codes */ /* return codes */
......
/* $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/preproc.y,v 1.343 2007/05/10 09:53:17 meskes Exp $ */ /* $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/preproc.y,v 1.344 2007/06/11 11:52:08 meskes Exp $ */
/* Copyright comment */ /* Copyright comment */
%{ %{
...@@ -99,6 +99,10 @@ mmerror(int error_code, enum errortype type, char * error, ...) ...@@ -99,6 +99,10 @@ mmerror(int error_code, enum errortype type, char * error, ...)
ret_value = error_code; ret_value = error_code;
break; break;
case ET_FATAL: case ET_FATAL:
fclose(yyin);
fclose(yyout);
if (unlink(output_filename) != 0)
fprintf(stderr, "Could not remove ourput file %s!\n", output_filename);
exit(error_code); exit(error_code);
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment