Fix length checking for Unicode identifiers containing escapes (U&"...").
We used the length of the input string, not the de-escaped string, as the trigger for NAMEDATALEN truncation. AFAICS this would only result in sometimes printing a phony truncation warning; but it's just luck that there was no worse problem, since we were violating the API spec for truncate_identifier(). Per bug #9204 from Joshua Yanovski. This has been wrong since the Unicode-identifier support was added, so back-patch to all supported branches.
This commit is contained in:
parent
3f735ae831
commit
44c2163302
|
@ -737,7 +737,8 @@ other .
|
||||||
<xuiend>{xustop1} |
|
<xuiend>{xustop1} |
|
||||||
<xuiend><<EOF>> {
|
<xuiend><<EOF>> {
|
||||||
/* no UESCAPE after the quote, throw back everything */
|
/* no UESCAPE after the quote, throw back everything */
|
||||||
char *ident;
|
char *ident;
|
||||||
|
int identlen;
|
||||||
|
|
||||||
yyless(0);
|
yyless(0);
|
||||||
|
|
||||||
|
@ -745,14 +746,16 @@ other .
|
||||||
if (yyextra->literallen == 0)
|
if (yyextra->literallen == 0)
|
||||||
yyerror("zero-length delimited identifier");
|
yyerror("zero-length delimited identifier");
|
||||||
ident = litbuf_udeescape('\\', yyscanner);
|
ident = litbuf_udeescape('\\', yyscanner);
|
||||||
if (yyextra->literallen >= NAMEDATALEN)
|
identlen = strlen(ident);
|
||||||
truncate_identifier(ident, yyextra->literallen, true);
|
if (identlen >= NAMEDATALEN)
|
||||||
|
truncate_identifier(ident, identlen, true);
|
||||||
yylval->str = ident;
|
yylval->str = ident;
|
||||||
return IDENT;
|
return IDENT;
|
||||||
}
|
}
|
||||||
<xuiend>{xustop2} {
|
<xuiend>{xustop2} {
|
||||||
/* found UESCAPE after the end quote */
|
/* found UESCAPE after the end quote */
|
||||||
char *ident;
|
char *ident;
|
||||||
|
int identlen;
|
||||||
|
|
||||||
BEGIN(INITIAL);
|
BEGIN(INITIAL);
|
||||||
if (yyextra->literallen == 0)
|
if (yyextra->literallen == 0)
|
||||||
|
@ -764,8 +767,9 @@ other .
|
||||||
yyerror("invalid Unicode escape character");
|
yyerror("invalid Unicode escape character");
|
||||||
}
|
}
|
||||||
ident = litbuf_udeescape(yytext[yyleng - 2], yyscanner);
|
ident = litbuf_udeescape(yytext[yyleng - 2], yyscanner);
|
||||||
if (yyextra->literallen >= NAMEDATALEN)
|
identlen = strlen(ident);
|
||||||
truncate_identifier(ident, yyextra->literallen, true);
|
if (identlen >= NAMEDATALEN)
|
||||||
|
truncate_identifier(ident, identlen, true);
|
||||||
yylval->str = ident;
|
yylval->str = ident;
|
||||||
return IDENT;
|
return IDENT;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue