Clean up ecpg's use of mmerror(): const-ify the format argument, add an
authorTom Lane <[email protected]>
Wed, 3 Jun 2009 20:24:51 +0000 (20:24 +0000)
committerTom Lane <[email protected]>
Wed, 3 Jun 2009 20:24:51 +0000 (20:24 +0000)
__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
src/interfaces/ecpg/preproc/ecpg.trailer
src/interfaces/ecpg/preproc/extern.h

index 9d90b662182b2102d005661e369abcc733b19900..faaf607c610f3ebd3055d2f481e5064fc5e99f9b 100644 (file)
@@ -1,4 +1,4 @@
-/* $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/ecpg.header,v 1.5 2009/01/23 12:43:32 petere Exp $ */
+/* $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/ecpg.header,v 1.6 2009/06/03 20:24:51 tgl Exp $ */
 
 /* Copyright comment */
 %{
@@ -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;
 
index 93cc43d176a2f7bcee14ca725fdca5dbbddb6bab..718e74a9b303a5232242f607ed04f6c50225ed0b 100644 (file)
@@ -1,4 +1,4 @@
-/* $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/ecpg.trailer,v 1.7 2009/04/06 08:42:53 heikki Exp $ */
+/* $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/ecpg.trailer,v 1.8 2009/06/03 20:24:51 tgl Exp $ */
 
 statements: /*EMPTY*/
                 | statements statement
@@ -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)
index 7f55441da347be019bb23714c47e5b1c894ee062..e5e1e4121807c85066c9bf79afcee4884b70e573 100644 (file)
@@ -1,4 +1,4 @@
-/* $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/extern.h,v 1.71 2008/05/20 23:17:32 meskes Exp $ */
+/* $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/extern.h,v 1.72 2009/06/03 20:24:51 tgl Exp $ */
 
 #ifndef _ECPG_PREPROC_EXTERN_H
 #define _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 *);