From 76d752c03b3a681685ab4d0f7b7dcfc854a02e0c Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Tue, 28 Apr 2020 22:18:06 +0900 Subject: Fix `presym_find` for strings without `NUL` terminators. --- src/symbol.c | 19 +++++++++---------- 1 file 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< 0) return i< 0) return i; -- cgit v1.2.3