oj 3.6.12 → 3.6.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/ext/oj/dump.c +40 -15
- data/ext/oj/parse.c +2 -1
- data/ext/oj/sparse.c +4 -2
- data/lib/oj/version.rb +1 -1
- data/test/foo.rb +61 -8
- data/test/test_various.rb +6 -0
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1f5fd9fac91126f270714362850b976b7f4cf1102462aab26c2f4f65f457a905
|
4
|
+
data.tar.gz: e2e200e2ec9e76f073206c084c1a7e45592710e0fbb43a5ba4f9593af74ff583
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3b5f0e4bede1f60d010a51e32141c6b864f92abe17fbe12d310e805ce16b8ef67483cf51dee0914f6a29f54556817d91ed2ffa5dccb64cbd8468c68de0d50f83
|
7
|
+
data.tar.gz: 390a4c2953392485757949aee885fb82b3c54b456f659ba672ae7b8da0b45bee484eb3b7c3ee0ef31a01dd33fe0bac8e877d01c91649c197970defe3e7727399
|
data/ext/oj/dump.c
CHANGED
@@ -230,12 +230,37 @@ dump_hex(uint8_t c, Out out) {
|
|
230
230
|
*out->cur++ = hex_chars[d];
|
231
231
|
}
|
232
232
|
|
233
|
+
static void
|
234
|
+
raise_invalid_unicode(const char *str, int len, int pos) {
|
235
|
+
char buf[len + 1];
|
236
|
+
char c;
|
237
|
+
char code[32];
|
238
|
+
char *cp = code;
|
239
|
+
int i;
|
240
|
+
uint8_t d;
|
241
|
+
|
242
|
+
*cp++ = '[';
|
243
|
+
for (i = pos; i < len && i - pos < 5; i++) {
|
244
|
+
c = str[i];
|
245
|
+
d = (c >> 4) & 0x0F;
|
246
|
+
*cp++ = hex_chars[d];
|
247
|
+
d = c & 0x0F;
|
248
|
+
*cp++ = hex_chars[d];
|
249
|
+
*cp++ = ' ';
|
250
|
+
}
|
251
|
+
cp--;
|
252
|
+
*cp++ = ']';
|
253
|
+
*cp = '\0';
|
254
|
+
strncpy(buf, str, len);
|
255
|
+
rb_raise(oj_json_generator_error_class, "Invalid Unicode %s at %d in '%s'", code, pos, buf);
|
256
|
+
}
|
257
|
+
|
233
258
|
static const char*
|
234
|
-
dump_unicode(const char *str, const char *end, Out out) {
|
259
|
+
dump_unicode(const char *str, const char *end, Out out, const char *orig) {
|
235
260
|
uint32_t code = 0;
|
236
261
|
uint8_t b = *(uint8_t*)str;
|
237
262
|
int i, cnt;
|
238
|
-
|
263
|
+
|
239
264
|
if (0xC0 == (0xE0 & b)) {
|
240
265
|
cnt = 1;
|
241
266
|
code = b & 0x0000001F;
|
@@ -253,13 +278,13 @@ dump_unicode(const char *str, const char *end, Out out) {
|
|
253
278
|
code = b & 0x00000001;
|
254
279
|
} else {
|
255
280
|
cnt = 0;
|
256
|
-
|
281
|
+
raise_invalid_unicode(orig, (int)(end - orig), (int)(str - orig));
|
257
282
|
}
|
258
283
|
str++;
|
259
284
|
for (; 0 < cnt; cnt--, str++) {
|
260
285
|
b = *(uint8_t*)str;
|
261
286
|
if (end <= str || 0x80 != (0xC0 & b)) {
|
262
|
-
|
287
|
+
raise_invalid_unicode(orig, (int)(end - orig), (int)(str - orig));
|
263
288
|
}
|
264
289
|
code = (code << 6) | (b & 0x0000003F);
|
265
290
|
}
|
@@ -284,7 +309,7 @@ dump_unicode(const char *str, const char *end, Out out) {
|
|
284
309
|
}
|
285
310
|
|
286
311
|
static const char*
|
287
|
-
check_unicode(const char *str, const char *end) {
|
312
|
+
check_unicode(const char *str, const char *end, const char *orig) {
|
288
313
|
uint8_t b = *(uint8_t*)str;
|
289
314
|
int cnt;
|
290
315
|
|
@@ -299,13 +324,13 @@ check_unicode(const char *str, const char *end) {
|
|
299
324
|
} else if (0xFC == (0xFE & b)) {
|
300
325
|
cnt = 5;
|
301
326
|
} else {
|
302
|
-
|
327
|
+
raise_invalid_unicode(orig, (int)(end - orig), (int)(str - orig));
|
303
328
|
}
|
304
329
|
str++;
|
305
330
|
for (; 0 < cnt; cnt--, str++) {
|
306
331
|
b = *(uint8_t*)str;
|
307
332
|
if (end <= str || 0x80 != (0xC0 & b)) {
|
308
|
-
|
333
|
+
raise_invalid_unicode(orig, (int)(end - orig), (int)(str - orig));
|
309
334
|
}
|
310
335
|
}
|
311
336
|
return str;
|
@@ -783,9 +808,9 @@ oj_dump_cstr(const char *str, size_t cnt, bool is_sym, bool escape1, Out out) {
|
|
783
808
|
if (JXEsc == out->opts->escape_mode && check_start <= str) {
|
784
809
|
if (0 != (0x80 & (uint8_t)*str)) {
|
785
810
|
if (0xC0 == (0xC0 & (uint8_t)*str)) {
|
786
|
-
check_start = check_unicode(str, end);
|
811
|
+
check_start = check_unicode(str, end, orig);
|
787
812
|
} else {
|
788
|
-
|
813
|
+
raise_invalid_unicode(orig, (int)(end - orig), (int)(str - orig));
|
789
814
|
}
|
790
815
|
}
|
791
816
|
}
|
@@ -806,14 +831,14 @@ oj_dump_cstr(const char *str, size_t cnt, bool is_sym, bool escape1, Out out) {
|
|
806
831
|
case '3': // Unicode
|
807
832
|
if (0xe2 == (uint8_t)*str && JXEsc == out->opts->escape_mode && 2 <= end - str) {
|
808
833
|
if (0x80 == (uint8_t)str[1] && (0xa8 == (uint8_t)str[2] || 0xa9 == (uint8_t)str[2])) {
|
809
|
-
str = dump_unicode(str, end, out);
|
834
|
+
str = dump_unicode(str, end, out, orig);
|
810
835
|
} else {
|
811
|
-
check_start = check_unicode(str, end);
|
836
|
+
check_start = check_unicode(str, end, orig);
|
812
837
|
*out->cur++ = *str;
|
813
838
|
}
|
814
839
|
break;
|
815
840
|
}
|
816
|
-
str = dump_unicode(str, end, out);
|
841
|
+
str = dump_unicode(str, end, out, orig);
|
817
842
|
break;
|
818
843
|
case '6': // control characters
|
819
844
|
if (*(uint8_t*)str < 0x80) {
|
@@ -825,14 +850,14 @@ oj_dump_cstr(const char *str, size_t cnt, bool is_sym, bool escape1, Out out) {
|
|
825
850
|
} else {
|
826
851
|
if (0xe2 == (uint8_t)*str && JXEsc == out->opts->escape_mode && 2 <= end - str) {
|
827
852
|
if (0x80 == (uint8_t)str[1] && (0xa8 == (uint8_t)str[2] || 0xa9 == (uint8_t)str[2])) {
|
828
|
-
str = dump_unicode(str, end, out);
|
853
|
+
str = dump_unicode(str, end, out, orig);
|
829
854
|
} else {
|
830
|
-
check_start = check_unicode(str, end);
|
855
|
+
check_start = check_unicode(str, end, orig);
|
831
856
|
*out->cur++ = *str;
|
832
857
|
}
|
833
858
|
break;
|
834
859
|
}
|
835
|
-
str = dump_unicode(str, end, out);
|
860
|
+
str = dump_unicode(str, end, out, orig);
|
836
861
|
}
|
837
862
|
break;
|
838
863
|
default:
|
data/ext/oj/parse.c
CHANGED
@@ -971,7 +971,7 @@ oj_pi_parse(int argc, VALUE *argv, ParseInfo pi, char *json, size_t len, int yie
|
|
971
971
|
if (0 != line) {
|
972
972
|
VALUE ec = rb_obj_class(rb_errinfo());
|
973
973
|
|
974
|
-
if (rb_eArgError != ec) {
|
974
|
+
if (rb_eArgError != ec && 0 != ec) {
|
975
975
|
err_class = ec;
|
976
976
|
}
|
977
977
|
}
|
@@ -1008,6 +1008,7 @@ oj_pi_parse(int argc, VALUE *argv, ParseInfo pi, char *json, size_t len, int yie
|
|
1008
1008
|
oj_rxclass_cleanup(&pi->str_rx);
|
1009
1009
|
}
|
1010
1010
|
if (err_has(&pi->err)) {
|
1011
|
+
rb_set_errinfo(Qnil);
|
1011
1012
|
if (Qnil != pi->err_class) {
|
1012
1013
|
pi->err.clas = pi->err_class;
|
1013
1014
|
}
|
data/ext/oj/sparse.c
CHANGED
@@ -844,7 +844,8 @@ oj_pi_sparse(int argc, VALUE *argv, ParseInfo pi, int fd) {
|
|
844
844
|
if (0 != line) {
|
845
845
|
VALUE ec = rb_obj_class(rb_errinfo());
|
846
846
|
|
847
|
-
|
847
|
+
// Sometimes the claass of the error is 0 which seems broken.
|
848
|
+
if (rb_eArgError != ec && 0 != ec) {
|
848
849
|
err_class = ec;
|
849
850
|
}
|
850
851
|
}
|
@@ -876,7 +877,8 @@ oj_pi_sparse(int argc, VALUE *argv, ParseInfo pi, int fd) {
|
|
876
877
|
close(fd);
|
877
878
|
}
|
878
879
|
if (err_has(&pi->err)) {
|
879
|
-
|
880
|
+
rb_set_errinfo(Qnil);
|
881
|
+
if (Qnil != pi->err_class && 0 != pi->err_class) {
|
880
882
|
pi->err.clas = pi->err_class;
|
881
883
|
}
|
882
884
|
if (CompatMode == pi->options.mode) {
|
data/lib/oj/version.rb
CHANGED
data/test/foo.rb
CHANGED
@@ -6,12 +6,65 @@ $: << '../ext'
|
|
6
6
|
|
7
7
|
require 'oj'
|
8
8
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
9
|
+
#Oj.load(StringIO.new(Oj.dump({ records: 1.upto(25).map{|i| { id: i, name: "record_#{i}" }} }, mode: :strict)))
|
10
|
+
|
11
|
+
class MyParser
|
12
|
+
attr_accessor :enum
|
13
|
+
|
14
|
+
def initialize
|
15
|
+
@io = StringIO.new
|
16
|
+
@writer = Oj::StreamWriter.new(@io)
|
17
|
+
|
18
|
+
json_string = Oj.dump({ records: 1.upto(25).map{|i| { id: i, name: "record_#{i}" }} }, mode: :strict)
|
19
|
+
@test_json = StringIO.new(json_string)
|
20
|
+
|
21
|
+
@enum = Enumerator.new do |yielder|
|
22
|
+
@yielder = yielder
|
23
|
+
Oj.sc_parse(self, @test_json)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
# Stream parsing methods
|
28
|
+
def hash_start
|
29
|
+
@writer.push_object
|
30
|
+
end
|
31
|
+
|
32
|
+
def hash_end
|
33
|
+
@writer.pop unless @io.eof
|
34
|
+
end
|
35
|
+
|
36
|
+
def hash_key(key)
|
37
|
+
@writer.push_key(key)
|
38
|
+
end
|
39
|
+
|
40
|
+
def hash_set(h, key, value)
|
41
|
+
@writer.push_value(value)
|
42
|
+
end
|
43
|
+
|
44
|
+
def array_start
|
45
|
+
@writer.push_array
|
46
|
+
end
|
47
|
+
|
48
|
+
def array_end
|
49
|
+
@writer.pop
|
50
|
+
end
|
51
|
+
|
52
|
+
def array_append(a, value)
|
53
|
+
yield_data
|
54
|
+
end
|
55
|
+
|
56
|
+
def add_value(value);end
|
57
|
+
|
58
|
+
def yield_data
|
59
|
+
@writer.pop_all
|
60
|
+
@yielder << @io.string
|
61
|
+
@io.reopen("")
|
62
|
+
array_start
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
MyParser.new.enum.each.with_index do |r, i|
|
67
|
+
break if i == 0
|
68
|
+
end
|
69
|
+
|
17
70
|
|
data/test/test_various.rb
CHANGED
@@ -393,6 +393,12 @@ class Juice < Minitest::Test
|
|
393
393
|
out = Oj.dump(x)
|
394
394
|
assert_equal(json, out)
|
395
395
|
end
|
396
|
+
def test_dump_invalid_utf8
|
397
|
+
Oj.default_options = { :escape_mode => :ascii }
|
398
|
+
assert_raises(EncodingError) {
|
399
|
+
Oj.dump(["abc\xbe\x1f\x11"], mode: :strict)
|
400
|
+
}
|
401
|
+
end
|
396
402
|
|
397
403
|
# Symbol
|
398
404
|
def test_symbol_null
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: oj
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.6.
|
4
|
+
version: 3.6.13
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Peter Ohler
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-10-
|
11
|
+
date: 2018-10-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake-compiler
|
@@ -271,7 +271,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
271
271
|
version: '0'
|
272
272
|
requirements: []
|
273
273
|
rubyforge_project:
|
274
|
-
rubygems_version: 2.7.
|
274
|
+
rubygems_version: 2.7.7
|
275
275
|
signing_key:
|
276
276
|
specification_version: 4
|
277
277
|
summary: A fast JSON parser and serializer.
|