From: "U.Nakamura" Date: 2007-06-21T20:40:05+09:00 Subject: [ruby-dev:31034] Re: [ruby-cvs:19815] Ruby:r12579 (trunk): * parse.y (rb_intern2): name may not be NUL-terminated. こんにちは、なかむら(う)です。 In message "[ruby-cvs:19815] Ruby:r12579 (trunk): * parse.y (rb_intern2): name may not be NUL-terminated." on Jun.21,2007 17:12:32, wrote: | Log: | * parse.y (rb_intern2): name may not be NUL-terminated. mをnameと関係ないポインタに変えていますが、後ろの方のwhileル ープでmとname + lastを比較してるので正常に動作しなくなってい ます。 その部分を直したのと、あとついでにmを取得した後はnameをもう見 ないようにしてみました。 Index: parse.y =================================================================== --- parse.y (revision 12580) +++ parse.y (working copy) @@ -8421,7 +8421,7 @@ ID rb_intern2(const char *name, long len) { VALUE str = rb_str_new(name, len); - const char *m = RSTRING_PTR(str); + const char *m = RSTRING_PTR(str), *end; ID id; int last; @@ -8429,46 +8429,46 @@ rb_intern2(const char *name, long len) return id; last = len-1; + end = m + last; id = 0; - switch (*name) { + switch (*m) { case '$': id |= ID_GLOBAL; if (is_special_global_name(++m)) goto new_id; break; case '@': - if (name[1] == '@') { + if (*++m == '@') { m++; id |= ID_CLASS; } else { id |= ID_INSTANCE; } - m++; break; default: - if (name[0] != '_' && ISASCII(name[0]) && !ISALNUM(name[0])) { + if (*m != '_' && ISASCII(*m) && !ISALNUM(*m)) { /* operators */ int i; for (i=0; op_tbl[i].token; i++) { - if (*op_tbl[i].name == *name && - strcmp(op_tbl[i].name, name) == 0) { + if (*op_tbl[i].name == *m && + strcmp(op_tbl[i].name, m) == 0) { id = op_tbl[i].token; goto id_register; } } } - if (name[last] == '=') { + if (*end == '=') { /* attribute assignment */ - id = rb_intern2(name, last); + id = rb_intern2(m, last); if (id > tLAST_TOKEN && !is_attrset_id(id)) { id = rb_id_attrset(id); goto id_register; } id = ID_ATTRSET; } - else if (ISUPPER(name[0])) { + else if (ISUPPER(*m)) { id = ID_CONST; } else { @@ -8477,7 +8477,7 @@ rb_intern2(const char *name, long len) break; } if (!ISDIGIT(*m)) { - while (m <= name + last && is_identchar(*m)) { + while (m <= end && is_identchar(*m)) { m += mbclen(*m); } } それでは。 -- U.Nakamura