Skip to content

Commit

Permalink
add sym_validate_len() to validate symbol length
Browse files Browse the repository at this point in the history
This also fixes an off-by-one in mrb_check_intern().
  • Loading branch information
cremno committed Aug 29, 2014
1 parent 607795f commit 0e28f4b
Showing 1 changed file with 11 additions and 6 deletions.
17 changes: 11 additions & 6 deletions src/symbol.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
{
Expand All @@ -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;
Expand Down Expand Up @@ -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;

Expand Down

0 comments on commit 0e28f4b

Please sign in to comment.