summaryrefslogtreecommitdiff
path: root/contrib/jsonb_plperl/jsonb_plperl.c
diff options
context:
space:
mode:
authorPeter Eisentraut <peter_e@gmx.net>2018-04-30 12:28:45 -0400
committerPeter Eisentraut <peter_e@gmx.net>2018-04-30 13:22:57 -0400
commite348e7ae5727a6da8678036d748e5c5af7deb6c9 (patch)
treead29dc9987af244f9a240f05f9c1c44611ecd96e /contrib/jsonb_plperl/jsonb_plperl.c
parentf7df8043f08a9d00811fb4aa054ed3221f5f9b5e (diff)
downloadpostgresql-e348e7ae5727a6da8678036d748e5c5af7deb6c9.tar.gz
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>
Diffstat (limited to 'contrib/jsonb_plperl/jsonb_plperl.c')
-rw-r--r--contrib/jsonb_plperl/jsonb_plperl.c16
1 files changed, 14 insertions, 2 deletions
diff --git a/contrib/jsonb_plperl/jsonb_plperl.c b/contrib/jsonb_plperl/jsonb_plperl.c
index cde38b295c..bde93a71fc 100644
--- a/contrib/jsonb_plperl/jsonb_plperl.c
+++ b/contrib/jsonb_plperl/jsonb_plperl.c
@@ -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 =