mirror of
https://github.com/mruby/mruby
synced 2026-06-08 16:11:16 +00:00
instance variable name validation based on <ctype.h>; fix #2584
This commit is contained in:
+3
-6
@@ -542,23 +542,20 @@ mrb_iv_defined(mrb_state *mrb, mrb_value obj, mrb_sym sym)
|
||||
return mrb_obj_iv_defined(mrb, mrb_obj_ptr(obj), sym);
|
||||
}
|
||||
|
||||
#define identchar(c) (ISALNUM(c) || (c) == '_' || !ISASCII(c))
|
||||
|
||||
MRB_API mrb_bool
|
||||
mrb_iv_p(mrb_state *mrb, mrb_sym iv_name)
|
||||
{
|
||||
const char *s;
|
||||
mrb_int i, len;
|
||||
size_t j;
|
||||
const char *invalid = "@$!? ";
|
||||
|
||||
s = mrb_sym2name_len(mrb, iv_name, &len);
|
||||
if (len < 2) return FALSE;
|
||||
if (s[0] != '@') return FALSE;
|
||||
if (s[1] == '@') return FALSE;
|
||||
for (i=1; i<len; i++) {
|
||||
char c = s[i];
|
||||
for (j=0; j<sizeof(invalid); j++) {
|
||||
if (c == invalid[j]) return FALSE;
|
||||
}
|
||||
if (!identchar(s[i])) return FALSE;
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user