summaryrefslogtreecommitdiff
blob: 9f1bff9b691e44b0be6b0e725c63f9e7e0b9d8e7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
commit e7da0fc34e8ed7fa250fc38f1109e4944cbad808
Author: eregon <eregon@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>
Date:   Fri Aug 3 15:11:36 2018 +0000

    ext/json/parser/parser.c: do not call rb_str_resize() on Time object
    
    * See https://github.com/flori/json/issues/342
    
    git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@64177 b2dd03c8-39d4-4d8f-98ff-823fe69b080e

diff --git a/ext/json/parser/parser.c b/ext/json/parser/parser.c
index b5ed093c1f..c8012796a4 100644
--- a/ext/json/ext/parser/parser.c
+++ b/ext/json/ext/parser/parser.c
@@ -1659,7 +1659,9 @@ case 7:
     if (json->symbolize_names && json->parsing_name) {
       *result = rb_str_intern(*result);
     } else {
-      rb_str_resize(*result, RSTRING_LEN(*result));
+          if (RB_TYPE_P(*result, T_STRING)) {
+              rb_str_resize(*result, RSTRING_LEN(*result));
+          }
     }
     if (cs >= JSON_string_first_final) {
         return p + 1;
@@ -1830,7 +1832,7 @@ static VALUE cParser_initialize(int argc, VALUE *argv, VALUE self)
 }
 
 
-#line 1834 "parser.c"
+#line 1836 "parser.c"
 enum {JSON_start = 1};
 enum {JSON_first_final = 10};
 enum {JSON_error = 0};
@@ -1838,7 +1840,7 @@ enum {JSON_error = 0};
 enum {JSON_en_main = 1};
 
 
-#line 742 "parser.rl"
+#line 744 "parser.rl"
 
 
 /*
@@ -1855,16 +1857,16 @@ static VALUE cParser_parse(VALUE self)
   GET_PARSER;
 
 
-#line 1859 "parser.c"
+#line 1861 "parser.c"
 	{
 	cs = JSON_start;
 	}
 
-#line 758 "parser.rl"
+#line 760 "parser.rl"
   p = json->source;
   pe = p + json->len;
 
-#line 1868 "parser.c"
+#line 1870 "parser.c"
 	{
 	if ( p == pe )
 		goto _test_eof;
@@ -1898,7 +1900,7 @@ st0:
 cs = 0;
 	goto _out;
 tr2:
-#line 734 "parser.rl"
+#line 736 "parser.rl"
 	{
         char *np = JSON_parse_value(json, p, pe, &result, 0);
         if (np == NULL) { p--; {p++; cs = 10; goto _out;} } else {p = (( np))-1;}
@@ -1908,7 +1910,7 @@ st10:
 	if ( ++p == pe )
 		goto _test_eof10;
 case 10:
-#line 1912 "parser.c"
+#line 1914 "parser.c"
 	switch( (*p) ) {
 		case 13: goto st10;
 		case 32: goto st10;
@@ -1997,7 +1999,7 @@ case 9:
 	_out: {}
 	}
 
-#line 761 "parser.rl"
+#line 763 "parser.rl"
 
   if (cs >= JSON_first_final && p == pe) {
     return result;
diff --git a/ext/json/parser/parser.rl b/ext/json/parser/parser.rl
index fba01ac0e5..edab32b78f 100644
--- a/ext/json/ext/parser/parser.rl
+++ b/ext/json/ext/parser/parser.rl
@@ -554,7 +554,9 @@ static char *JSON_parse_string(JSON_Parser *json, char *p, char *pe, VALUE *resu
     if (json->symbolize_names && json->parsing_name) {
       *result = rb_str_intern(*result);
     } else {
-      rb_str_resize(*result, RSTRING_LEN(*result));
+          if (RB_TYPE_P(*result, T_STRING)) {
+              rb_str_resize(*result, RSTRING_LEN(*result));
+          }
     }
     if (cs >= JSON_string_first_final) {
         return p + 1;