fix(data): reject partial and malformed map data

This commit is contained in:
2026-08-14 23:09:55 +09:00
parent 38475318db
commit bfe83d0119
10 changed files with 220 additions and 125 deletions

View File

@@ -406,17 +406,18 @@ static int
maplookup(Trie *t, Str *key, Str *out)
{
char buf[Maxutf], *v;
int klen, vlen;
int klen, match, vlen;
if(key->n == 0)
if(out != nil)
sclear(out);
if(t == nil || key == nil || key->n == 0)
return 0;
v = nil;
vlen = 0;
klen = stoutf(key, buf, sizeof(buf));
if(!trielookup(t, buf, klen, &v, &vlen))
match = trielookup(t, buf, klen, &v, &vlen);
if(match == TrieMiss)
return 0;
if(match == TrieExact && out != nil && !sinit(out, v, vlen))
return 0;
if(out != nil && v != nil)
sinit(out, v, vlen);
return 1;
}
@@ -1043,16 +1044,17 @@ int
mapget(Trie *t, Str *key, Str *out)
{
char buf[Maxutf], *v;
int klen, vlen;
int klen, match, vlen;
if(key->n == 0)
if(out != nil)
sclear(out);
if(key == nil || out == nil || key->n == 0)
return 0;
klen = stoutf(key, buf, sizeof(buf));
v = trieget(t, buf, klen, &vlen);
if(v == nil)
match = trielookup(t, buf, klen, &v, &vlen);
if(match != TrieExact)
return 0;
sinit(out, v, vlen);
return 1;
return sinit(out, v, vlen);
}
void