From 09e99a10827e4300daf733a57748405e22e51181 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Fri, 7 Sep 2001 23:17:14 +0000 Subject: [PATCH] Change addlit() to not assume its input is null-terminated, so that we don't have more bugs like the quote-quote-quote-quote one. Propagate fix into ecpg lexer, too. --- src/backend/parser/scan.l | 13 +++++++------ src/interfaces/ecpg/preproc/pgc.l | 11 ++++++----- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/src/backend/parser/scan.l b/src/backend/parser/scan.l index 3f64341d55..b071032972 100644 --- a/src/backend/parser/scan.l +++ b/src/backend/parser/scan.l @@ -9,7 +9,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/parser/scan.l,v 1.89 2001/09/04 00:19:39 petere Exp $ + * $Header: /cvsroot/pgsql/src/backend/parser/scan.l,v 1.90 2001/09/07 23:17:14 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -69,6 +69,8 @@ void unput(char); extern YYSTYPE yylval; +static int xcdepth = 0; /* depth of nesting in slash-star comments */ + /* * literalbuf is used to accumulate literal values when multiple rules * are needed to parse a single literal. Call startlit to reset buffer @@ -79,8 +81,6 @@ static char *literalbuf; /* expandable buffer */ static int literallen; /* actual current length */ static int literalalloc; /* current allocated buffer size */ -static int xcdepth = 0; /* depth of nesting in slash-star comments */ - #define startlit() (literalbuf[0] = '\0', literallen = 0) static void addlit(char *ytext, int yleng); @@ -375,7 +375,7 @@ other . return IDENT; } {xddouble} { - addlit(yytext+1, yyleng-1); + addlit(yytext, yyleng-1); } {xdinside} { addlit(yytext, yyleng); @@ -581,9 +581,10 @@ addlit(char *ytext, int yleng) } while ((literallen+yleng) >= literalalloc); literalbuf = (char *) repalloc(literalbuf, literalalloc); } - /* append data --- note we assume ytext is null-terminated */ - memcpy(literalbuf+literallen, ytext, yleng+1); + /* append new data, add trailing null */ + memcpy(literalbuf+literallen, ytext, yleng); literallen += yleng; + literalbuf[literallen] = '\0'; } #if !defined(FLEX_SCANNER) diff --git a/src/interfaces/ecpg/preproc/pgc.l b/src/interfaces/ecpg/preproc/pgc.l index 5929f1f171..d6d99adcee 100644 --- a/src/interfaces/ecpg/preproc/pgc.l +++ b/src/interfaces/ecpg/preproc/pgc.l @@ -12,7 +12,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/interfaces/ecpg/preproc/pgc.l,v 1.79 2001/06/13 12:38:58 meskes Exp $ + * $Header: /cvsroot/pgsql/src/interfaces/ecpg/preproc/pgc.l,v 1.80 2001/09/07 23:17:14 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -35,6 +35,8 @@ extern YYSTYPE yylval; +static int xcdepth = 0; /* depth of nesting in slash-star comments */ + /* * literalbuf is used to accumulate literal values when multiple rules * are needed to parse a single literal. Call startlit to reset buffer @@ -45,8 +47,6 @@ static char *literalbuf = NULL; /* expandable buffer */ static int literallen; /* actual current length */ static int literalalloc; /* current allocated buffer size */ -static int xcdepth = 0; - #define startlit() (literalbuf[0] = '\0', literallen = 0) static void addlit(char *ytext, int yleng); @@ -923,9 +923,10 @@ addlit(char *ytext, int yleng) } while ((literallen+yleng) >= literalalloc); literalbuf = (char *) realloc(literalbuf, literalalloc); } - /* append data --- note we assume ytext is null-terminated */ - memcpy(literalbuf+literallen, ytext, yleng+1); + /* append new data, add trailing null */ + memcpy(literalbuf+literallen, ytext, yleng); literallen += yleng; + literalbuf[literallen] = '\0'; } int yywrap(void) -- 2.40.0