fix a series of oob reads in evry search matching

This commit is contained in:
Mike Blumenkrantz 2014-07-30 11:57:32 -04:00
parent 119dfb1bd8
commit 3c5cc9c0a0
1 changed files with 6 additions and 4 deletions

View File

@ -68,6 +68,7 @@ evry_fuzzy_match(const char *str, const char *match)
unsigned int m_cnt = 0; unsigned int m_cnt = 0;
unsigned int m_min[MAX_WORDS]; unsigned int m_min[MAX_WORDS];
unsigned int m_len = 0; unsigned int m_len = 0;
unsigned int s_len = 0;
if (!match || !str || !match[0] || !str[0]) if (!match || !str || !match[0] || !str[0])
return 0; return 0;
@ -87,6 +88,7 @@ evry_fuzzy_match(const char *str, const char *match)
if (ip && ispunct(*m)) ip = 0; if (ip && ispunct(*m)) ip = 0;
m_len = strlen(match); m_len = strlen(match);
s_len = strlen(str);
/* with less than 3 chars match must be a prefix */ /* with less than 3 chars match must be a prefix */
if (m_len < 3) m_len = 0; if (m_len < 3) m_len = 0;
@ -180,7 +182,7 @@ evry_fuzzy_match(const char *str, const char *match)
{ {
ii = 0; ii = 0;
/* go to next match */ /* go to next match */
for (; (*m != 0) && !isspace(*m); m += ii) for (; (m[0] && m[ii]) && !isspace(*m); m += ii)
if (!eina_unicode_utf8_next_get(m, &ii)) break; if (!eina_unicode_utf8_next_get(m, &ii)) break;
} }
@ -188,7 +190,7 @@ evry_fuzzy_match(const char *str, const char *match)
{ {
ii = 0; ii = 0;
/* test next match */ /* test next match */
for (; (*m != 0) && isspace(*m); m += ii) for (; (m[0] && m[ii]) && !isspace(*m); m += ii)
if (!eina_unicode_utf8_next_get(m, &ii)) break; if (!eina_unicode_utf8_next_get(m, &ii)) break;
m_cnt++; m_cnt++;
break; break;
@ -197,10 +199,10 @@ evry_fuzzy_match(const char *str, const char *match)
{ {
ii = 0; ii = 0;
/* go to next word */ /* go to next word */
for (; (*p != 0) && !((isspace(*p) || (ip && ispunct(*p)))); p += ii) for (; (p[0] && (s_len - (p - str) >= ii)) && !((isspace(*p) || (ip && ispunct(*p)))); p += ii)
if (!eina_unicode_utf8_next_get(p, &ii)) break; if (!eina_unicode_utf8_next_get(p, &ii)) break;
ii = 0; ii = 0;
for (; (*p != 0) && ((isspace(*p) || (ip && ispunct(*p)))); p += ii) for (; (p[0] && (s_len - (p - str) >= ii)) && ((isspace(*p) || (ip && ispunct(*p)))); p += ii)
if (!eina_unicode_utf8_next_get(p, &ii)) break; if (!eina_unicode_utf8_next_get(p, &ii)) break;
cnt++; cnt++;
next = p; next = p;