From 0e28f4b9739093a30732738b3bdb9bf2d750ce28 Mon Sep 17 00:00:00 2001 From: cremno Date: Fri, 29 Aug 2014 15:43:14 +0200 Subject: add sym_validate_len() to validate symbol length This also fixes an off-by-one in mrb_check_intern(). --- src/symbol.c | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) (limited to 'src') diff --git a/src/symbol.c b/src/symbol.c index 69f9c90ee..5c55e5b65 100644 --- a/src/symbol.c +++ b/src/symbol.c @@ -34,6 +34,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 > (UINT16_MAX-1)) { /* UINT16_MAX is reverved */ + 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 +52,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 +107,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; -- cgit v1.2.3