From dec34d6c7bc0849a469ab517ad5f24e9c3ab9e4b Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Sat, 6 Jun 2020 18:02:15 +0900 Subject: Split `MRB_BINARY_FORMAT` to major and minor. The minor versions should be upper compatible. So mere opcode, section addition can be done without breaking compiled binary. --- include/mruby/dump.h | 10 ++++++++-- src/dump.c | 3 ++- src/load.c | 7 ++++++- 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/include/mruby/dump.h b/include/mruby/dump.h index bad27fdf5..b8161e055 100644 --- a/include/mruby/dump.h +++ b/include/mruby/dump.h @@ -49,7 +49,12 @@ MRB_API mrb_irep *mrb_read_irep_buf(mrb_state*, const void*, size_t); /* Rite Binary File header */ #define RITE_BINARY_IDENT "RITE" -#define RITE_BINARY_FORMAT_VER "0007" +/* Binary Format Version Major:Minor */ +/* Major: Incompatible to prior versions */ +/* Minor: Upper-compatible to prior versions */ +#define RITE_BINARY_MAJOR_VER "01" +#define RITE_BINARY_MINOR_VER "00" +#define RITE_BINARY_FORMAT_VER RITE_BINARY_MAJOR_VER RITE_BINARY_MINOR_VER #define RITE_COMPILER_NAME "MATZ" #define RITE_COMPILER_VERSION "0000" @@ -66,7 +71,8 @@ MRB_API mrb_irep *mrb_read_irep_buf(mrb_state*, const void*, size_t); /* binary header */ struct rite_binary_header { uint8_t binary_ident[4]; /* Binary Identifier */ - uint8_t binary_version[4]; /* Binary Format Version */ + uint8_t major_version[2]; /* Binary Format Major Version */ + uint8_t minor_version[2]; /* Binary Format Minor Version */ uint8_t binary_crc[2]; /* Binary CRC */ uint8_t binary_size[4]; /* Binary Size */ uint8_t compiler_name[4]; /* Compiler name */ diff --git a/src/dump.c b/src/dump.c index c0f0ca0a8..8cd69cd29 100644 --- a/src/dump.c +++ b/src/dump.c @@ -726,7 +726,8 @@ write_rite_binary_header(mrb_state *mrb, size_t binary_size, uint8_t *bin, uint8 uint32_t offset; memcpy(header->binary_ident, RITE_BINARY_IDENT, sizeof(header->binary_ident)); - memcpy(header->binary_version, RITE_BINARY_FORMAT_VER, sizeof(header->binary_version)); + memcpy(header->major_version, RITE_BINARY_MAJOR_VER, sizeof(header->major_version)); + memcpy(header->minor_version, RITE_BINARY_MAJOR_VER, sizeof(header->minor_version)); memcpy(header->compiler_name, RITE_COMPILER_NAME, sizeof(header->compiler_name)); memcpy(header->compiler_version, RITE_COMPILER_VERSION, sizeof(header->compiler_version)); mrb_assert(binary_size <= UINT32_MAX); diff --git a/src/load.c b/src/load.c index 0dc6e93fe..2002af3ab 100644 --- a/src/load.c +++ b/src/load.c @@ -525,7 +525,12 @@ read_binary_header(const uint8_t *bin, size_t bufsize, size_t *bin_size, uint16_ return MRB_DUMP_INVALID_FILE_HEADER; } - if (memcmp(header->binary_version, RITE_BINARY_FORMAT_VER, sizeof(header->binary_version)) != 0) { + /* if major version is different, they are incompatible */ + if (memcmp(header->major_version, RITE_BINARY_MAJOR_VER, sizeof(header->major_version)) != 0) { + return MRB_DUMP_INVALID_FILE_HEADER; + } + /* if minor version is different, we can accept the older version */ + if (memcmp(header->minor_version, RITE_BINARY_MINOR_VER, sizeof(header->minor_version)) <= 0) { return MRB_DUMP_INVALID_FILE_HEADER; } -- cgit v1.2.3