Skip to content

Commit 1a0a3c1

Browse files
committed
check for undef in decode
1 parent f3e59f0 commit 1a0a3c1

2 files changed

Lines changed: 17 additions & 9 deletions

File tree

build_config.rb

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,17 +4,17 @@ def for_windows?
44
('A'..'Z').to_a.any? { |vol| Dir.exist?("#{vol}:") }
55
end
66
unless for_windows?
7-
#conf.enable_sanitizer "address,undefined"
7+
conf.enable_sanitizer "address,undefined"
88
end
9-
#conf.cxx.flags << '-fno-omit-frame-pointer' << '-g3' << '-ggdb3' << '-Og'
10-
#conf.cc.flags << '-fno-omit-frame-pointer' << '-g3' << '-ggdb3' << '-Og'
11-
#conf.enable_debug
9+
conf.cxx.flags << '-fno-omit-frame-pointer' << '-g3' << '-ggdb3' << '-Og'
10+
conf.cc.flags << '-fno-omit-frame-pointer' << '-g3' << '-ggdb3' << '-Og'
11+
conf.enable_debug
1212
conf.cc.defines << 'MRB_UTF8_STRING'
1313
conf.cxx.defines << 'MRB_UTF8_STRING'
1414
conf.enable_test
1515
conf.gembox 'default'
16-
conf.cc.flags << '-O3' << '-march=native'
17-
conf.cxx.flags << '-O3' << '-march=native'
16+
#conf.cc.flags << '-O3' << '-march=native'
17+
#conf.cxx.flags << '-O3' << '-march=native'
1818
conf.gem github: 'Asmod4n/mruby-benchmark-plus', branch: "main"
1919
conf.gem mgem: 'mruby-simplemsgpack'
2020
conf.gem mgem: 'mruby-fast-json'

src/mrb_cbor.c

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -374,13 +374,17 @@ decode_map(mrb_state* mrb, Reader* r, mrb_value src,
374374
mrb_value hash = mrb_hash_new(mrb);
375375
int idx = mrb_gc_arena_save(mrb);
376376

377+
// assign an ID to this hash for logging
378+
mrb_int hid = mrb_obj_id(hash);
379+
377380
if (reg && mrb_array_p(sharedrefs)) {
378381
mrb_ary_push(mrb, sharedrefs, hash);
379382
}
380383

381384
for (mrb_int i = 0; i < len; i++) {
382385
mrb_value key = decode_value(mrb, r, src, sharedrefs);
383386
mrb_value val = decode_value(mrb, r, src, sharedrefs);
387+
384388
mrb_hash_set(mrb, hash, key, val);
385389
mrb_gc_arena_restore(mrb, idx);
386390
}
@@ -760,7 +764,7 @@ decode_value(mrb_state* mrb, Reader* r, mrb_value src, mrb_value sharedrefs)
760764
result = decode_unhandled_tag(mrb, r, src, sharedrefs, tag);
761765
} break;
762766

763-
case 7:
767+
case 7: {
764768
if (info < 20) { result = mrb_nil_value(); break; }
765769
switch (info) {
766770
case 20: result = mrb_false_value(); break;
@@ -778,14 +782,18 @@ decode_value(mrb_state* mrb, Reader* r, mrb_value src, mrb_value sharedrefs)
778782
} break;
779783
if (unlikely(mrb_undef_p(result)))
780784
mrb_raise(mrb, E_RUNTIME_ERROR, "invalid simple/float");
781-
break;
785+
} break;
782786

783787
default:
784788
mrb_raisef(mrb, E_NOTIMP_ERROR, "Not implemented major type %d", major);
785789
}
786790

787791
r->depth--;
788-
return result;
792+
if (likely(!mrb_undef_p(result))) {
793+
return result;
794+
} else {
795+
mrb_raise(mrb, E_RUNTIME_ERROR, "CBOR internal error: failed to decode value");
796+
}
789797
}
790798

791799
static void

0 commit comments

Comments
 (0)