diff options
Diffstat (limited to 'src/load.c')
| -rw-r--r-- | src/load.c | 56 |
1 files changed, 47 insertions, 9 deletions
diff --git a/src/load.c b/src/load.c index 92799eb49..553a08af8 100644 --- a/src/load.c +++ b/src/load.c @@ -4,6 +4,7 @@ ** See Copyright Notice in mruby.h */ +#include <stdlib.h> #include <string.h> #include "mruby/dump.h" @@ -11,6 +12,15 @@ #include "mruby/proc.h" #include "mruby/irep.h" +#ifdef ENABLE_STDIO +typedef struct _RiteFILE +{ + FILE* fp; + unsigned char buf[256]; + int cnt; + int readlen; +} RiteFILE; +#endif #ifndef _WIN32 # if SIZE_MAX < UINT32_MAX @@ -278,9 +288,10 @@ mrb_read_irep(mrb_state *mrb, const uint8_t *bin) } static void -irep_error(mrb_state *mrb, const char *msg) +irep_error(mrb_state *mrb, int n) { - mrb->exc = (struct RObject*)mrb_object(mrb_exc_new(mrb, E_SCRIPT_ERROR, msg, strlen(msg))); + static const char msg[] = "irep load error"; + mrb->exc = mrb_obj_ptr(mrb_exc_new(mrb, E_SCRIPT_ERROR, msg, sizeof(msg) - 1)); } mrb_value @@ -290,7 +301,7 @@ mrb_load_irep(mrb_state *mrb, const uint8_t *bin) n = mrb_read_irep(mrb, bin); if (n < 0) { - irep_error(mrb, "irep load error"); + irep_error(mrb, n); return mrb_nil_value(); } return mrb_run(mrb, mrb_proc_new(mrb, mrb->irep[n]), mrb_top_self(mrb)); @@ -309,9 +320,11 @@ read_rite_section_irep_file(mrb_state *mrb, FILE *fp) uint32_t len, buf_size; uint8_t *buf = NULL; const size_t record_header_size = 1 + 4; - struct rite_section_irep_header header; - fread(&header, sizeof(struct rite_section_irep_header), 1, fp); + + if (fread(&header, sizeof(struct rite_section_irep_header), 1, fp) != sizeof(struct rite_section_irep_header)) { + return MRB_DUMP_READ_FAULT; + } sirep = mrb->irep_len; nirep = bin_to_uint16(header.nirep); @@ -321,10 +334,16 @@ read_rite_section_irep_file(mrb_state *mrb, FILE *fp) //Read Binary Data Section for (n = 0, i = sirep; n < nirep; n++, i++) { - fread(buf, record_header_size, 1, fp); + if (fread(buf, record_header_size, 1, fp) != record_header_size) { + result = MRB_DUMP_READ_FAULT; + goto error_exit; + } buf_size = bin_to_uint32(&buf[0]); buf = (uint8_t *)mrb_realloc(mrb, buf, buf_size); - fread(&buf[record_header_size], buf_size - record_header_size, 1, fp); + if (fread(&buf[record_header_size], buf_size - record_header_size, 1, fp) != buf_size - record_header_size) { + result = MRB_DUMP_READ_FAULT; + goto error_exit; + } result = read_rite_irep_record(mrb, buf, &len); if (result != MRB_DUMP_OK) goto error_exit; @@ -372,7 +391,10 @@ mrb_read_irep_file(mrb_state *mrb, FILE* fp) } buf = mrb_malloc(mrb, buf_size); - fread(buf, buf_size, 1, fp); + if (fread(buf, buf_size, 1, fp) != buf_size) { + mrb_free(mrb, buf); + return MRB_DUMP_READ_FAULT; + } result = read_rite_binary_header(buf, NULL, &crc); mrb_free(mrb, buf); if(result != MRB_DUMP_OK) { @@ -387,6 +409,9 @@ mrb_read_irep_file(mrb_state *mrb, FILE* fp) crcwk = calc_crc_16_ccitt(buf, nbytes, crcwk); } mrb_free(mrb, buf); + if (nbytes < 0) { + return MRB_DUMP_READ_FAULT; + } if(crcwk != crc) { return MRB_DUMP_INVALID_FILE_HEADER; } @@ -395,7 +420,9 @@ mrb_read_irep_file(mrb_state *mrb, FILE* fp) // read sections do { fpos = ftell(fp); - fread(§ion_header, sizeof(struct rite_section_header), 1, fp); + if (fread(§ion_header, sizeof(struct rite_section_header), 1, fp) != sizeof(struct rite_section_header)) { + return MRB_DUMP_READ_FAULT; + } section_size = bin_to_uint32(section_header.section_size); if(memcmp(section_header.section_identify, RITE_SECTION_IREP_IDENTIFIER, sizeof(section_header.section_identify)) == 0) { @@ -413,4 +440,15 @@ mrb_read_irep_file(mrb_state *mrb, FILE* fp) return total_nirep; } +mrb_value +mrb_load_irep_file(mrb_state *mrb, FILE* fp) +{ + int n = mrb_read_irep_file(mrb, fp); + + if (n < 0) { + irep_error(mrb, n); + return mrb_nil_value(); + } + return mrb_run(mrb, mrb_proc_new(mrb, mrb->irep[n]), mrb_top_self(mrb)); +} #endif /* ENABLE_STDIO */ |
