Skip to content

Commit 85312d9

Browse files
committed
ecpg: put all string-valued tokens returned by pgc.l in local storage.
This didn't work earlier in the patch series (I think some of the strings were ending up in data-type-related structures), but apparently we're now clean enough for it. This considerably reduces process-lifespan memory leakage. Discussion: https://postgr.es/m/[email protected]
1 parent 0e60607 commit 85312d9

File tree

2 files changed

+24
-22
lines changed

2 files changed

+24
-22
lines changed

src/interfaces/ecpg/preproc/parser.c

+3-1
Original file line numberDiff line numberDiff line change
@@ -203,7 +203,9 @@ filtered_base_yylex(void)
203203
base_yytext = cur_yytext;
204204

205205
/* Combine 3 tokens into 1 */
206-
base_yylval.str = psprintf("%s UESCAPE %s", base_yylval.str, escstr);
206+
base_yylval.str = make3_str(base_yylval.str,
207+
" UESCAPE ",
208+
escstr);
207209
base_yylloc = loc_strdup(base_yylval.str);
208210

209211
/* Clear have_lookahead, thereby consuming all three tokens */

src/interfaces/ecpg/preproc/pgc.l

+21-21
Original file line numberDiff line numberDiff line change
@@ -641,26 +641,26 @@ cppline {space}*#([^i][A-Za-z]*|{if}|{ifdef}|{ifndef}|{import})((\/\*[^*/]*\*+
641641
case xb:
642642
if (literalbuf[strspn(literalbuf, "01")] != '\0')
643643
mmerror(PARSE_ERROR, ET_ERROR, "invalid bit string literal");
644-
base_yylval.str = psprintf("b'%s'", literalbuf);
644+
base_yylval.str = make3_str("b'", literalbuf, "'");
645645
return BCONST;
646646
case xh:
647647
if (literalbuf[strspn(literalbuf, "0123456789abcdefABCDEF")] != '\0')
648648
mmerror(PARSE_ERROR, ET_ERROR, "invalid hexadecimal string literal");
649-
base_yylval.str = psprintf("x'%s'", literalbuf);
649+
base_yylval.str = make3_str("x'", literalbuf, "'");
650650
return XCONST;
651651
case xq:
652652
/* fallthrough */
653653
case xqc:
654-
base_yylval.str = psprintf("'%s'", literalbuf);
654+
base_yylval.str = make3_str("'", literalbuf, "'");
655655
return SCONST;
656656
case xe:
657-
base_yylval.str = psprintf("E'%s'", literalbuf);
657+
base_yylval.str = make3_str("E'", literalbuf, "'");
658658
return SCONST;
659659
case xn:
660-
base_yylval.str = psprintf("N'%s'", literalbuf);
660+
base_yylval.str = make3_str("N'", literalbuf, "'");
661661
return SCONST;
662662
case xus:
663-
base_yylval.str = psprintf("U&'%s'", literalbuf);
663+
base_yylval.str = make3_str("U&'", literalbuf, "'");
664664
return USCONST;
665665
default:
666666
mmfatal(PARSE_ERROR, "unhandled previous state in xqs\n");
@@ -724,7 +724,7 @@ cppline {space}*#([^i][A-Za-z]*|{if}|{ifdef}|{ifndef}|{import})((\/\*[^*/]*\*+
724724
free(dolqstart);
725725
dolqstart = NULL;
726726
BEGIN(SQL);
727-
base_yylval.str = mm_strdup(literalbuf);
727+
base_yylval.str = loc_strdup(literalbuf);
728728
return SCONST;
729729
}
730730
else
@@ -778,12 +778,12 @@ cppline {space}*#([^i][A-Za-z]*|{if}|{ifdef}|{ifndef}|{import})((\/\*[^*/]*\*+
778778
* PREPARE and EXECUTE IMMEDIATE, which can certainly be
779779
* longer than NAMEDATALEN.
780780
*/
781-
base_yylval.str = mm_strdup(literalbuf);
781+
base_yylval.str = loc_strdup(literalbuf);
782782
return CSTRING;
783783
}
784784
<xdc>{xdstop} {
785785
BEGIN(state_before_str_start);
786-
base_yylval.str = mm_strdup(literalbuf);
786+
base_yylval.str = loc_strdup(literalbuf);
787787
return CSTRING;
788788
}
789789
<xui>{dquote} {
@@ -795,7 +795,7 @@ cppline {space}*#([^i][A-Za-z]*|{if}|{ifdef}|{ifndef}|{import})((\/\*[^*/]*\*+
795795
* The backend will truncate the identifier here. We do
796796
* not as it does not change the result.
797797
*/
798-
base_yylval.str = psprintf("U&\"%s\"", literalbuf);
798+
base_yylval.str = make3_str("U&\"", literalbuf, "\"");
799799
return UIDENT;
800800
}
801801
<xd,xui>{xddouble} {
@@ -971,7 +971,7 @@ cppline {space}*#([^i][A-Za-z]*|{if}|{ifdef}|{ifndef}|{import})((\/\*[^*/]*\*+
971971
}
972972
}
973973

974-
base_yylval.str = mm_strdup(yytext);
974+
base_yylval.str = loc_strdup(yytext);
975975
return Op;
976976
}
977977

@@ -990,7 +990,7 @@ cppline {space}*#([^i][A-Za-z]*|{if}|{ifdef}|{ifndef}|{import})((\/\*[^*/]*\*+
990990
}
991991

992992
{ip} {
993-
base_yylval.str = mm_strdup(yytext);
993+
base_yylval.str = loc_strdup(yytext);
994994
return IP;
995995
}
996996
} /* <SQL> */
@@ -1003,7 +1003,7 @@ cppline {space}*#([^i][A-Za-z]*|{if}|{ifdef}|{ifndef}|{import})((\/\*[^*/]*\*+
10031003
return process_integer_literal(yytext, &base_yylval, 16);
10041004
}
10051005
{numeric} {
1006-
base_yylval.str = mm_strdup(yytext);
1006+
base_yylval.str = loc_strdup(yytext);
10071007
return FCONST;
10081008
}
10091009
{numericfail} {
@@ -1012,7 +1012,7 @@ cppline {space}*#([^i][A-Za-z]*|{if}|{ifdef}|{ifndef}|{import})((\/\*[^*/]*\*+
10121012
return process_integer_literal(yytext, &base_yylval, 10);
10131013
}
10141014
{real} {
1015-
base_yylval.str = mm_strdup(yytext);
1015+
base_yylval.str = loc_strdup(yytext);
10161016
return FCONST;
10171017
}
10181018
{realfail} {
@@ -1048,7 +1048,7 @@ cppline {space}*#([^i][A-Za-z]*|{if}|{ifdef}|{ifndef}|{import})((\/\*[^*/]*\*+
10481048
}
10491049

10501050
:{identifier}((("->"|\.){identifier})|(\[{array}\]))* {
1051-
base_yylval.str = mm_strdup(yytext + 1);
1051+
base_yylval.str = loc_strdup(yytext + 1);
10521052
return CVARIABLE;
10531053
}
10541054

@@ -1085,7 +1085,7 @@ cppline {space}*#([^i][A-Za-z]*|{if}|{ifdef}|{ifndef}|{import})((\/\*[^*/]*\*+
10851085
* to do so; that's just another way that ecpg could
10861086
* get out of step with the backend.
10871087
*/
1088-
base_yylval.str = mm_strdup(yytext);
1088+
base_yylval.str = loc_strdup(yytext);
10891089
return IDENT;
10901090
}
10911091
}
@@ -1124,7 +1124,7 @@ cppline {space}*#([^i][A-Za-z]*|{if}|{ifdef}|{ifndef}|{import})((\/\*[^*/]*\*+
11241124
}
11251125
else
11261126
{
1127-
base_yylval.str = mm_strdup(yytext);
1127+
base_yylval.str = loc_strdup(yytext);
11281128
return CPP_LINE;
11291129
}
11301130
}
@@ -1136,12 +1136,12 @@ cppline {space}*#([^i][A-Za-z]*|{if}|{ifdef}|{ifndef}|{import})((\/\*[^*/]*\*+
11361136
}
11371137
else
11381138
{
1139-
base_yylval.str = mm_strdup(yytext);
1139+
base_yylval.str = loc_strdup(yytext);
11401140
return CPP_LINE;
11411141
}
11421142
}
11431143
<C,SQL>{cppline} {
1144-
base_yylval.str = mm_strdup(yytext);
1144+
base_yylval.str = loc_strdup(yytext);
11451145
return CPP_LINE;
11461146
}
11471147
<C>{identifier} {
@@ -1167,7 +1167,7 @@ cppline {space}*#([^i][A-Za-z]*|{if}|{ifdef}|{ifndef}|{import})((\/\*[^*/]*\*+
11671167
return kwvalue;
11681168
else
11691169
{
1170-
base_yylval.str = mm_strdup(yytext);
1170+
base_yylval.str = loc_strdup(yytext);
11711171
return IDENT;
11721172
}
11731173
}
@@ -1685,7 +1685,7 @@ process_integer_literal(const char *token, YYSTYPE *lval, int base)
16851685
if (*endptr != '\0' || errno == ERANGE)
16861686
{
16871687
/* integer too large (or contains decimal pt), treat it as a float */
1688-
lval->str = mm_strdup(token);
1688+
lval->str = loc_strdup(token);
16891689
return FCONST;
16901690
}
16911691
lval->ival = val;

0 commit comments

Comments
 (0)