diff --git a/folly/json.cpp b/folly/json.cpp index f248ef8e324a416af14a973b7636c1c6cfd80948..28fe5f11e992806f3949d6b42a32d26c66894b74 100644 --- a/folly/json.cpp +++ b/folly/json.cpp @@ -126,6 +126,11 @@ struct Printer { void operator()(dynamic const& v) const { switch (v.type()) { case dynamic::DOUBLE: + if (!opts_.allow_nan_inf && + (isnan(v.asDouble()) || isinf(v.asDouble()))) { + throw std::runtime_error("folly::toJson: JSON object value was a " + "NaN or INF"); + } toAppend(v.asDouble(), &out_); break; case dynamic::INT64: { @@ -751,6 +756,7 @@ fbstring toPrettyJson(dynamic const& dyn) { void dynamic::print_as_pseudo_json(std::ostream& out) const { json::serialization_opts opts; opts.allow_non_string_keys = true; + opts.allow_nan_inf = true; out << json::serialize(*this, opts); } diff --git a/folly/json.h b/folly/json.h index 527eb235a765d2ba71a5ae509db835a8a2bed134..8b5ce55a2f4e26d6df87b9e9a485399a32decfa4 100644 --- a/folly/json.h +++ b/folly/json.h @@ -61,6 +61,7 @@ namespace json { , allow_trailing_comma(false) , sort_keys(false) , skip_invalid_utf8(false) + , allow_nan_inf(false) {} // If true, keys in an object can be non-strings. (In strict @@ -93,6 +94,9 @@ namespace json { // Replace invalid utf8 characters with U+FFFD and continue bool skip_invalid_utf8; + + // true to allow NaN or INF values + bool allow_nan_inf; }; /*