]> granicus.if.org Git - jq/commitdiff
Fix #802
authorNicolas Williams <nico@cryptonector.com>
Thu, 18 Jun 2015 05:03:46 +0000 (00:03 -0500)
committerNicolas Williams <nico@cryptonector.com>
Thu, 18 Jun 2015 05:03:46 +0000 (00:03 -0500)
jv.c
jv_parse.c

diff --git a/jv.c b/jv.c
index bf3d4f836a878fcb6bf35349913fd78e2677b3eb..80e3ac9130797eeb9f5a67a0777df41c80688309 100644 (file)
--- a/jv.c
+++ b/jv.c
@@ -717,7 +717,10 @@ jv jv_string_implode(jv j) {
   for (i = 0; i < len; i++) {
     jv n = jv_array_get(jv_copy(j), i);
     assert(jv_get_kind(n) == JV_KIND_NUMBER);
-    s = jv_string_append_codepoint(s, jv_number_value(n));
+    int nv = jv_number_value(n);
+    if (nv > 0x10FFFF)
+      nv = 0xFFFD; // U+FFFD REPLACEMENT CHARACTER
+    s = jv_string_append_codepoint(s, nv);
   }
 
   jv_free(j);
index d560bd691108af7ad1e51bae9ef52fa7e49bd80b..63d5394982d4701f7eaa8e9341fb986873bc64e2 100644 (file)
@@ -447,7 +447,8 @@ static pfunc found_string(struct jv_parser* p) {
           codepoint = 0x10000 + (((codepoint - 0xD800) << 10)
                                  |(surrogate - 0xDC00));
         }
-        // FIXME assert valid codepoint
+        if (codepoint > 0x10FFFF)
+          codepoint = 0xFFFD; // U+FFFD REPLACEMENT CHARACTER
         out += jvp_utf8_encode(codepoint, out);
         break;