summaryrefslogtreecommitdiffhomepage
path: root/src/cdump.c
diff options
context:
space:
mode:
authorYukihiro Matsumoto <[email protected]>2012-07-05 01:13:09 +0900
committerYukihiro Matsumoto <[email protected]>2012-07-05 01:13:09 +0900
commit0e9e0693b46438e37e915d9973210d39048db2c1 (patch)
treee1d952e6aae819160df7e1ebe229331bb100542e /src/cdump.c
parentee32521f908ae8f27cb38bc98aa619426704c02b (diff)
downloadmruby-0e9e0693b46438e37e915d9973210d39048db2c1.tar.gz
mruby-0e9e0693b46438e37e915d9973210d39048db2c1.zip
big init function in cdump may overflow arena
Diffstat (limited to 'src/cdump.c')
-rw-r--r--src/cdump.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/src/cdump.c b/src/cdump.c
index 0df2bb491..1b67f6205 100644
--- a/src/cdump.c
+++ b/src/cdump.c
@@ -112,6 +112,7 @@ make_cdump_irep(mrb_state *mrb, int irep_no, FILE *f)
return MRB_CDUMP_GENERAL_FAILURE;
}
+ SOURCE_CODE0 (" ai = mrb->arena_idx;");
SOURCE_CODE0 (" irep = mrb->irep[idx] = mrb_malloc(mrb, sizeof(mrb_irep));");
SOURCE_CODE0 (" irep->idx = idx++;");
SOURCE_CODE (" irep->flags = %d | MRB_ISEQ_NOFREE;", irep->flags);
@@ -155,6 +156,8 @@ make_cdump_irep(mrb_state *mrb, int irep_no, FILE *f)
}
else
SOURCE_CODE0 (" irep->pool = NULL;");
+ SOURCE_CODE0 (" mrb->irep_len = idx;");
+ SOURCE_CODE0 (" ai = mrb->arena_idx;");
SOURCE_CODE0("");
return MRB_CDUMP_OK;
}
@@ -185,6 +188,7 @@ mrb_cdump_irep(mrb_state *mrb, int n, FILE *f,const char *initname)
SOURCE_CODE0("{");
SOURCE_CODE0(" int n = mrb->irep_len;");
SOURCE_CODE0(" int idx = n;");
+ SOURCE_CODE0(" int ai;");
SOURCE_CODE0(" mrb_irep *irep;");
SOURCE_CODE0("");
SOURCE_CODE (" mrb_add_irep(mrb, idx+%d);", irep_num);
@@ -194,8 +198,6 @@ mrb_cdump_irep(mrb_state *mrb, int n, FILE *f,const char *initname)
return -1;
}
- SOURCE_CODE0(" mrb->irep_len = idx;");
- SOURCE_CODE0("");
SOURCE_CODE0(" mrb_run(mrb, mrb_proc_new(mrb, mrb->irep[n]), mrb_top_self(mrb));");
SOURCE_CODE0("}");