Prevent stack overflow in json-related functions.
authorNoah Misch <[email protected]>
Mon, 5 Oct 2015 14:06:29 +0000 (10:06 -0400)
committerNoah Misch <[email protected]>
Mon, 5 Oct 2015 14:06:35 +0000 (10:06 -0400)
Sufficiently-deep recursion heretofore elicited a SIGSEGV.  If an
application constructs PostgreSQL json or jsonb values from arbitrary
user input, application users could have exploited this to terminate all
active database connections.  That applies to 9.3, where the json parser
adopted recursive descent, and later versions.  Only row_to_json() and
array_to_json() were at risk in 9.2, both in a non-security capacity.
Back-patch to 9.2, where the json type was introduced.

Oskari Saarenmaa, reviewed by Michael Paquier.

Security: CVE-2015-5289

src/backend/utils/adt/json.c

index f0cbb3959961288dc8653b8c9f281fa8a3de20ea..fd1d8fb988fdcfbcbbd9cb06b34ca610eabaee91 100644 (file)
@@ -18,6 +18,7 @@
 #include "lib/stringinfo.h"
 #include "libpq/pqformat.h"
 #include "mb/pg_wchar.h"
+#include "miscadmin.h"
 #include "parser/parse_coerce.h"
 #include "utils/array.h"
 #include "utils/builtins.h"
@@ -895,6 +896,8 @@ datum_to_json(Datum val, bool is_null, StringInfo result,
    bool        numeric_error;
    JsonLexContext dummy_lex;
 
+   check_stack_depth();
+
    if (is_null)
    {
        appendStringInfoString(result, "null");