]> PatchyGit - patchyircd.git/commitdiff
trie: limit key size
authorEgor <egor@patchysicp.xyz>
Sun, 22 Oct 2023 21:34:09 +0000 (00:34 +0300)
committerEgor <egor@patchysicp.xyz>
Sun, 22 Oct 2023 21:34:09 +0000 (00:34 +0300)
src/map.h
src/map_trie.c

index 4126273..02f62d2 100644 (file)
--- a/src/map.h
+++ b/src/map.h
@@ -41,12 +41,12 @@ struct trie_node {
        struct trie_node *data[1];
 };
 typedef struct trie_node *map_t;
+#define TRIE_MAX_KEY 256
 struct trie_find {
        struct trie_node *n;
        void *value;
        size_t len;
-       size_t cap;
-       char key[1];
+       char key[TRIE_MAX_KEY];
 };
 typedef struct trie_find *map_find_t;
 #define map_findfree(f) (free(*(f)), *(f) = 0)
index 19723cc..5c28b20 100644 (file)
@@ -44,6 +44,8 @@ void *map_get(map_t *root, const char *key)
 int map_set(map_t *root, const char *key, const void *value, void **oldvalue)
 {
        int rv = 0;
+       if (strlen(key)+1 > TRIE_MAX_KEY)
+               return -1;
        if (oldvalue)
                *oldvalue = NULL;
        struct trie_node *n = *root;
@@ -139,16 +141,6 @@ int map_findnext(map_find_t *pf) {
        int ent = 0; // go to the first child node
        for (;;) {
                if (!trie_is_end(ent, f->n)) {
-                       if (f->len == f->cap) {
-                               f->cap *= 2;
-                               void *nf = realloc(f, sizeof(*f)+f->cap);
-                               if (!nf) {
-                                       *pf = NULL;
-                                       free(f);
-                                       return -1;
-                               }
-                               *pf = f = nf;
-                       }
                        f->n = f->n->data[ent];
                        f->key[f->len++] = f->n->key;
                        if (f->n->value) { // found a value
@@ -176,11 +168,10 @@ int map_findfirst(map_find_t *pf, map_t *root) {
        if (*pf) {
                f = *pf;
        } else {
-               f = *pf = malloc(sizeof(*f)+16);
+               f = *pf = malloc(sizeof(*f));
                if (!f)
                        return -1;
                f->len = 0;
-               f->cap = 16;
        }
        f->n = *root;
        if (f->n->value) {