diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2020-04-28 22:18:06 +0900 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2020-10-12 16:20:44 +0900 |
| commit | 76d752c03b3a681685ab4d0f7b7dcfc854a02e0c (patch) | |
| tree | 3a5bce0b21d511e00a91da024d9aa8a20a4c5908 /src/symbol.c | |
| parent | 33647b904ebdc0555f40328d2e8b3905181e90c1 (diff) | |
| download | mruby-76d752c03b3a681685ab4d0f7b7dcfc854a02e0c.tar.gz mruby-76d752c03b3a681685ab4d0f7b7dcfc854a02e0c.zip | |
Fix `presym_find` for strings without `NUL` terminators.
Diffstat (limited to 'src/symbol.c')
| -rw-r--r-- | src/symbol.c | 19 |
1 files changed, 9 insertions, 10 deletions
diff --git a/src/symbol.c b/src/symbol.c index 8a98e9e2e..35c3c3015 100644 --- a/src/symbol.c +++ b/src/symbol.c @@ -24,21 +24,21 @@ static const char *presym_table[] = { }; static mrb_sym -presym_find(const char *name) +presym_find(const char *name, size_t len) { int start = 0; int end = MRB_PRESYM_MAX-1; while (start<=end) { int mid = (start+end)/2; - int cmp = strcmp(name, presym_table[mid]); + int cmp = strncmp(name, presym_table[mid], len); - if (cmp == 0) { + if (cmp == 0 && presym_table[mid][len] == '\0') { return mid+1; - } else if (cmp < 0) { - end = mid-1; - } else { + } else if (cmp > 0) { start = mid+1; + } else { + end = mid-1; } } return 0; @@ -170,10 +170,9 @@ find_symbol(mrb_state *mrb, const char *name, size_t len, uint8_t *hashp) uint8_t hash; /* presym */ - if (strlen(name) == len) { - i = presym_find(name); - if (i > 0) return i<<SYMBOL_NORMAL_SHIFT; - } + i = presym_find(name, len); + if (i > 0) return i<<SYMBOL_NORMAL_SHIFT; + /* inline symbol */ i = sym_inline_pack(name, len); if (i > 0) return i; |
