mirror of
https://github.com/postgres/postgres.git
synced 2025-06-11 20:28:21 +03:00
Prevent infinity and NaN in jsonb/plperl transform
jsonb uses numeric internally, and numeric can store NaN, but that is not allowed by jsonb on input, so we shouldn't store it. Also prevent infinity to get a consistent error message. (numeric input would reject infinity anyway.) Reported-by: Dagfinn Ilmari Mannsåker <ilmari@ilmari.org> Reviewed-by: Tom Lane <tgl@sss.pgh.pa.us>
This commit is contained in:
@ -211,10 +211,22 @@ SV_to_JsonbValue(SV *in, JsonbParseState **jsonb_state, bool is_elem)
|
||||
{
|
||||
double nval = SvNV(in);
|
||||
|
||||
/*
|
||||
* jsonb doesn't allow infinity or NaN (per JSON
|
||||
* specification), but the numeric type that is used for the
|
||||
* storage accepts NaN, so we have to prevent it here
|
||||
* explicitly. We don't really have to check for isinf()
|
||||
* here, as numeric doesn't allow it and it would be caught
|
||||
* later, but it makes for a nicer error message.
|
||||
*/
|
||||
if (isinf(nval))
|
||||
ereport(ERROR,
|
||||
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
|
||||
(errmsg("cannot convert infinite value to jsonb"))));
|
||||
(errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
|
||||
(errmsg("cannot convert infinity to jsonb"))));
|
||||
if (isnan(nval))
|
||||
ereport(ERROR,
|
||||
(errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
|
||||
(errmsg("cannot convert NaN to jsonb"))));
|
||||
|
||||
out.type = jbvNumeric;
|
||||
out.val.numeric =
|
||||
|
Reference in New Issue
Block a user