mirror of
https://github.com/postgres/postgres.git
synced 2025-07-30 11:03:19 +03:00
hstore: Tighten key/value parsing check for whitespaces
isspace() can be locale-sensitive depending on the platform, causing
hstore to consider as whitespaces characters it should not see as such.
For example, U+0105, being decoded as 0xC4 0x85 in UTF-8, would be
discarded from the input given.
This problem is similar to 9ae2661
, though it was missed that hstore
can also manipulate non-ASCII inputs, so replace the existing isspace()
calls with scanner_isspace().
This problem exists for a long time, so backpatch all the way down.
Author: Evan Jones
Discussion: https://postgr.es/m/CA+HWA9awUW0+RV_gO9r1ABZwGoZxPztcJxPy8vMFSTbTfi4jig@mail.gmail.com
Backpatch-through: 11
This commit is contained in:
@ -13,6 +13,7 @@
|
||||
#include "lib/stringinfo.h"
|
||||
#include "libpq/pqformat.h"
|
||||
#include "nodes/miscnodes.h"
|
||||
#include "parser/scansup.h"
|
||||
#include "utils/builtins.h"
|
||||
#include "utils/json.h"
|
||||
#include "utils/jsonb.h"
|
||||
@ -118,7 +119,7 @@ get_val(HSParser *state, bool ignoreeq, bool *escaped)
|
||||
{
|
||||
st = GV_WAITESCIN;
|
||||
}
|
||||
else if (!isspace((unsigned char) *(state->ptr)))
|
||||
else if (!scanner_isspace((unsigned char) *(state->ptr)))
|
||||
{
|
||||
*(state->cur) = *(state->ptr);
|
||||
state->cur++;
|
||||
@ -141,7 +142,7 @@ get_val(HSParser *state, bool ignoreeq, bool *escaped)
|
||||
state->ptr--;
|
||||
return true;
|
||||
}
|
||||
else if (isspace((unsigned char) *(state->ptr)))
|
||||
else if (scanner_isspace((unsigned char) *(state->ptr)))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
@ -255,7 +256,7 @@ parse_hstore(HSParser *state)
|
||||
{
|
||||
PRSEOF;
|
||||
}
|
||||
else if (!isspace((unsigned char) *(state->ptr)))
|
||||
else if (!scanner_isspace((unsigned char) *(state->ptr)))
|
||||
{
|
||||
PRSSYNTAXERROR;
|
||||
}
|
||||
@ -309,7 +310,7 @@ parse_hstore(HSParser *state)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
else if (!isspace((unsigned char) *(state->ptr)))
|
||||
else if (!scanner_isspace((unsigned char) *(state->ptr)))
|
||||
{
|
||||
PRSSYNTAXERROR;
|
||||
}
|
||||
|
Reference in New Issue
Block a user