Avoid character classification in regex escape parsing.
For regex escape sequences, just test directly for the relevant ASCII characters rather than using locale-sensitive character classification. This fixes an assertion failure when a locale considers a non-ASCII character, such as "൧", to be a digit. Reported-by: Richard Guo Discussion: https://postgr.es/m/CAMbWs49Q6UoKGeT8pBkMtJGJd+16CBFZaaWUk9Du+2ERE5g_YA@mail.gmail.com Backpatch-through: 11
This commit is contained in:
parent
a14afd3bdc
commit
109363de0a
@ -613,7 +613,11 @@ lexescape(struct vars *v)
|
|||||||
|
|
||||||
assert(!ATEOS());
|
assert(!ATEOS());
|
||||||
c = *v->now++;
|
c = *v->now++;
|
||||||
if (!iscalnum(c))
|
|
||||||
|
/* if it's not alphanumeric ASCII, treat it as a plain character */
|
||||||
|
if (!('a' <= c && c <= 'z') &&
|
||||||
|
!('A' <= c && c <= 'Z') &&
|
||||||
|
!('0' <= c && c <= '9'))
|
||||||
RETV(PLAIN, c);
|
RETV(PLAIN, c);
|
||||||
|
|
||||||
NOTE(REG_UNONPOSIX);
|
NOTE(REG_UNONPOSIX);
|
||||||
@ -755,8 +759,11 @@ lexescape(struct vars *v)
|
|||||||
RETV(PLAIN, c);
|
RETV(PLAIN, c);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
assert(iscalpha(c));
|
/*
|
||||||
FAILW(REG_EESCAPE); /* unknown alphabetic escape */
|
* Throw an error for unrecognized ASCII alpha escape sequences,
|
||||||
|
* which reserves them for future use if needed.
|
||||||
|
*/
|
||||||
|
FAILW(REG_EESCAPE);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
assert(NOTREACHED);
|
assert(NOTREACHED);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user