summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2014-08-30 10:24:14 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2014-08-30 10:24:14 +0900
commit5e9689c4492b6fea166e815d2bad62c302d66efb (patch)
tree5ac52b7f482c78e0550fd74fbfded701c0635fba /src
parent607795ffdd4ea172de557d6e4983d87e011d7698 (diff)
parentc219c2a15eec04040144ba5cd478b5c5dff14f65 (diff)
downloadmruby-5e9689c4492b6fea166e815d2bad62c302d66efb.tar.gz
mruby-5e9689c4492b6fea166e815d2bad62c302d66efb.zip
Merge pull request #2576 from cremno/correctly-validate-symbol-length
correctly validate symbol length
Diffstat (limited to 'src')
-rw-r--r--src/symbol.c18
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;