mirror of
https://github.com/mruby/mruby
synced 2026-06-08 16:11:16 +00:00
call kh_get before kh_put to avoid potential key lost; reported by @mirichi
This commit is contained in:
+8
-2
@@ -313,7 +313,10 @@ mrb_define_method_raw(mrb_state *mrb, struct RClass *c, mrb_sym mid, struct RPro
|
||||
khiter_t k;
|
||||
|
||||
if (!h) h = c->mt = kh_init(mt, mrb);
|
||||
k = kh_put(mt, mrb, h, mid);
|
||||
k = kh_get(mt, mrb, h, mid);
|
||||
if (k == kh_end(h)) {
|
||||
k = kh_put(mt, mrb, h, mid);
|
||||
}
|
||||
kh_value(h, k) = p;
|
||||
if (p) {
|
||||
mrb_field_write_barrier(mrb, (struct RBasic *)c, (struct RBasic *)p);
|
||||
@@ -346,7 +349,10 @@ mrb_define_method_vm(mrb_state *mrb, struct RClass *c, mrb_sym name, mrb_value b
|
||||
struct RProc *p;
|
||||
|
||||
if (!h) h = c->mt = kh_init(mt, mrb);
|
||||
k = kh_put(mt, mrb, h, name);
|
||||
k = kh_get(mt, mrb, h, name);
|
||||
if (k == kh_end(h)) {
|
||||
k = kh_put(mt, mrb, h, name);
|
||||
}
|
||||
p = mrb_proc_ptr(body);
|
||||
kh_value(h, k) = p;
|
||||
if (p) {
|
||||
|
||||
+4
-1
@@ -308,7 +308,10 @@ iv_put(mrb_state *mrb, iv_tbl *t, mrb_sym sym, mrb_value val)
|
||||
khash_t(iv) *h = &t->h;
|
||||
khiter_t k;
|
||||
|
||||
k = kh_put(iv, mrb, h, sym);
|
||||
k = kh_get(mt, mrb, h, sym);
|
||||
if (k == kh_end(h)) {
|
||||
k = kh_put(mt, mrb, h, sym);
|
||||
}
|
||||
kh_value(h, k) = val;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user