From 28acf65d305f8ba7a1d0a7d0661711dd005137dc Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Wed, 3 Jun 2009 20:24:51 +0000 Subject: [PATCH] Clean up ecpg's use of mmerror(): const-ify the format argument, add an __attribute__() marker so that gcc can validate the format string against the actual arguments, get rid of overcomplicated and unsafe usage in base_yyerror(). --- src/interfaces/ecpg/preproc/ecpg.header | 2 +- src/interfaces/ecpg/preproc/ecpg.trailer | 9 +++------ src/interfaces/ecpg/preproc/extern.h | 4 +++- 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/src/interfaces/ecpg/preproc/ecpg.header b/src/interfaces/ecpg/preproc/ecpg.header index 834ce31933..2211f5466c 100644 --- a/src/interfaces/ecpg/preproc/ecpg.header +++ b/src/interfaces/ecpg/preproc/ecpg.header @@ -56,7 +56,7 @@ struct ECPGtype ecpg_query = {ECPGt_char_variable, NULL, NULL, {NULL}, 0}; * Handle parsing errors and warnings */ void -mmerror(int error_code, enum errortype type, char * error, ...) +mmerror(int error_code, enum errortype type, const char *error, ...) { va_list ap; diff --git a/src/interfaces/ecpg/preproc/ecpg.trailer b/src/interfaces/ecpg/preproc/ecpg.trailer index e968ae2c4a..b4f1496594 100644 --- a/src/interfaces/ecpg/preproc/ecpg.trailer +++ b/src/interfaces/ecpg/preproc/ecpg.trailer @@ -1985,13 +1985,10 @@ ecpg_into: INTO into_list { $$ = EMPTY; } %% -void base_yyerror(const char * error) +void base_yyerror(const char *error) { - char buf[1024]; - - snprintf(buf,sizeof buf, _("%s at or near \"%s\""), error, token_start ? token_start : yytext); - buf[sizeof(buf)-1]=0; - mmerror(PARSE_ERROR, ET_ERROR, buf); + mmerror(PARSE_ERROR, ET_ERROR, "%s at or near \"%s\"", + error, token_start ? token_start : yytext); } void parser_init(void) diff --git a/src/interfaces/ecpg/preproc/extern.h b/src/interfaces/ecpg/preproc/extern.h index bd6699a7bc..dc67f32ef0 100644 --- a/src/interfaces/ecpg/preproc/extern.h +++ b/src/interfaces/ecpg/preproc/extern.h @@ -74,7 +74,9 @@ extern int base_yylex(void); extern void base_yyerror(const char *); extern void *mm_alloc(size_t), *mm_realloc(void *, size_t); extern char *mm_strdup(const char *); -extern void mmerror(int, enum errortype, char *,...); +extern void mmerror(int, enum errortype, const char *, ...) +/* This extension allows gcc to check the format string */ +__attribute__((format(printf, 3, 4))); extern void output_get_descr_header(char *); extern void output_get_descr(char *, char *); extern void output_set_descr_header(char *); -- 2.39.5