diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2014-08-30 10:24:14 +0900 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2014-08-30 10:24:14 +0900 |
| commit | 5e9689c4492b6fea166e815d2bad62c302d66efb (patch) | |
| tree | 5ac52b7f482c78e0550fd74fbfded701c0635fba | |
| parent | 607795ffdd4ea172de557d6e4983d87e011d7698 (diff) | |
| parent | c219c2a15eec04040144ba5cd478b5c5dff14f65 (diff) | |
| download | mruby-5e9689c4492b6fea166e815d2bad62c302d66efb.tar.gz mruby-5e9689c4492b6fea166e815d2bad62c302d66efb.zip | |
Merge pull request #2576 from cremno/correctly-validate-symbol-length
correctly validate symbol length
| -rw-r--r-- | src/symbol.c | 18 |
1 files changed, 12 insertions, 6 deletions
diff --git a/src/symbol.c b/src/symbol.c index 69f9c90ee..1736a12b7 100644 --- a/src/symbol.c +++ b/src/symbol.c @@ -9,6 +9,7 @@ #include "mruby.h" #include "mruby/khash.h" #include "mruby/string.h" +#include "mruby/dump.h" /* ------------------------------------------------------ */ typedef struct symbol_name { @@ -34,6 +35,15 @@ sym_hash_func(mrb_state *mrb, const symbol_name s) KHASH_DECLARE(n2s, symbol_name, mrb_sym, TRUE) KHASH_DEFINE (n2s, symbol_name, mrb_sym, TRUE, sym_hash_func, sym_hash_equal) /* ------------------------------------------------------ */ + +static void +sym_validate_len(mrb_state *mrb, size_t len) +{ + if (len >= RITE_LV_NULL_MARK) { + mrb_raise(mrb, E_ARGUMENT_ERROR, "symbol length too long"); + } +} + static mrb_sym sym_intern(mrb_state *mrb, const char *name, size_t len, mrb_bool lit) { @@ -43,9 +53,7 @@ sym_intern(mrb_state *mrb, const char *name, size_t len, mrb_bool lit) mrb_sym sym; char *p; - if (len > (UINT16_MAX-1)) { /* UINT16_MAX is reverved */ - mrb_raise(mrb, E_ARGUMENT_ERROR, "symbol length too long"); - } + sym_validate_len(mrb, len); sname.lit = lit; sname.len = (uint16_t)len; sname.name = name; @@ -100,9 +108,7 @@ mrb_check_intern(mrb_state *mrb, const char *name, size_t len) symbol_name sname = { 0 }; khiter_t k; - if (len > UINT16_MAX) { - mrb_raise(mrb, E_ARGUMENT_ERROR, "symbol length too long"); - } + sym_validate_len(mrb, len); sname.len = (uint16_t)len; sname.name = name; |
