summaryrefslogtreecommitdiffhomepage
path: root/src/dump.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/dump.c')
-rw-r--r--src/dump.c14
1 files changed, 8 insertions, 6 deletions
diff --git a/src/dump.c b/src/dump.c
index fb5bb5e7c..d96b2778e 100644
--- a/src/dump.c
+++ b/src/dump.c
@@ -12,7 +12,6 @@
#include "mruby/irep.h"
#include "mruby/numeric.h"
-
static size_t
get_irep_record_size(mrb_state *mrb, mrb_irep *irep);
@@ -172,7 +171,7 @@ get_syms_block_size(mrb_state *mrb, mrb_irep *irep)
{
size_t size = 0;
size_t sym_no;
- int len;
+ size_t len;
size += sizeof(uint32_t); /* slen */
for (sym_no = 0; sym_no < irep->slen; sym_no++) {
@@ -189,7 +188,7 @@ get_syms_block_size(mrb_state *mrb, mrb_irep *irep)
static int
write_syms_block(mrb_state *mrb, mrb_irep *irep, uint8_t *buf)
{
- int result, len;
+ int result;
size_t sym_no;
size_t buf_size;
uint8_t *cur = buf;
@@ -208,7 +207,10 @@ write_syms_block(mrb_state *mrb, mrb_irep *irep, uint8_t *buf)
for (sym_no = 0; sym_no < irep->slen; sym_no++) {
if (irep->syms[sym_no] != 0) {
+ size_t len;
+
name = mrb_sym2name_len(mrb, irep->syms[sym_no], &len);
+ if (len > UINT16_MAX) goto error_exit;
nlen = (uint16_t)len;
if (nlen > buf_size - 1) {
buf_size = nlen + 1;
@@ -354,14 +356,14 @@ write_rite_binary_header(mrb_state *mrb, size_t binary_size, uint8_t* bin)
static int
mrb_dump_irep(mrb_state *mrb, size_t start_index, uint8_t **bin, size_t *bin_size)
{
- int result;
+ int result = MRB_DUMP_GENERAL_FAILURE;
size_t section_irep_size;
size_t irep_no;
uint8_t *cur = NULL;
if (mrb == NULL || start_index >= mrb->irep_len) {
*bin = NULL;
- goto error_exit;
+ return MRB_DUMP_GENERAL_FAILURE;
}
section_irep_size = sizeof(struct rite_section_irep_header);
@@ -388,7 +390,7 @@ mrb_dump_irep(mrb_state *mrb, size_t start_index, uint8_t **bin, size_t *bin_siz
result = write_rite_binary_header(mrb, *bin_size, *bin);
error_exit:
- if(result != MRB_DUMP_OK) {
+ if (result != MRB_DUMP_OK) {
mrb_free(mrb, *bin);
*bin = NULL;
}