From 40f52b16dd31aa9ddc3bd42daa78459562693567 Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <peter_e@gmx.net>
Date: Wed, 2 May 2018 15:58:34 -0400
Subject: [PATCH] Prevent NaN in jsonb/plpython transform

As in e348e7ae5727a6da8678036d748e5c5af7deb6c9 for jsonb/plperl, prevent
putting a NaN into a jsonb numeric field.

Tests for this had been removed in
6278a2a262b63faaf47eb2371f6bcb5b6e3ff118, but in case they are ever
resurrected: This would change the output of the test1nan() function to
an error.
---
 contrib/jsonb_plpython/jsonb_plpython.c | 11 +++++++++++
 1 file changed, 11 insertions(+)

diff --git a/contrib/jsonb_plpython/jsonb_plpython.c b/contrib/jsonb_plpython/jsonb_plpython.c
index 645238f15b..f752d6c3cd 100644
--- a/contrib/jsonb_plpython/jsonb_plpython.c
+++ b/contrib/jsonb_plpython/jsonb_plpython.c
@@ -5,6 +5,7 @@
 #include "plpy_typeio.h"
 #include "utils/jsonb.h"
 #include "utils/fmgrprotos.h"
+#include "utils/numeric.h"
 
 PG_MODULE_MAGIC;
 
@@ -343,6 +344,16 @@ PLyNumber_ToJsonbValue(PyObject *obj, JsonbValue *jbvNum)
 
 	pfree(str);
 
+	/*
+	 * jsonb doesn't allow NaN (per JSON specification), so we have to prevent
+	 * it here explicitly.  (Infinity is also not allowed in jsonb, but
+	 * numeric_in above already catches that.)
+	 */
+	if (numeric_is_nan(num))
+		ereport(ERROR,
+				(errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
+				 (errmsg("cannot convert NaN to jsonb"))));
+
 	jbvNum->type = jbvNumeric;
 	jbvNum->val.numeric = num;
 
-- 
2.49.0