summaryrefslogtreecommitdiffhomepage
path: root/src/load.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/load.c')
-rw-r--r--src/load.c56
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(&section_header, sizeof(struct rite_section_header), 1, fp);
+ if (fread(&section_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 */