summaryrefslogtreecommitdiffhomepage
path: root/src/symbol.c
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2020-04-28 22:18:06 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2020-10-12 16:20:44 +0900
commit76d752c03b3a681685ab4d0f7b7dcfc854a02e0c (patch)
tree3a5bce0b21d511e00a91da024d9aa8a20a4c5908 /src/symbol.c
parent33647b904ebdc0555f40328d2e8b3905181e90c1 (diff)
downloadmruby-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.c19
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;