chiark / gitweb /
udev: hwdb - properly initialize search structure
authorKay Sievers <kay@vrfy.org>
Thu, 25 Oct 2012 19:39:01 +0000 (21:39 +0200)
committerKay Sievers <kay@vrfy.org>
Thu, 25 Oct 2012 19:44:33 +0000 (21:44 +0200)
src/udev/udevadm-hwdb.c

index 52fe1d4..ce8eff4 100644 (file)
@@ -135,19 +135,28 @@ static int trie_values_cmp(const void *v1, const void *v2, void *arg) {
 
 static int trie_node_add_value(struct trie *trie, struct trie_node *node,
                           const char *key, const char *value) {
-        size_t k, v;
+        ssize_t k, v;
         struct trie_value_entry *val;
-        struct trie_value_entry search;
 
         k = strbuf_add_string(trie->strings, key, strlen(key));
+        if (k < 0)
+                return k;
         v = strbuf_add_string(trie->strings, value, strlen(value));
+        if (v < 0)
+                return v;
 
-        /* replace existing earlier key with new value */
-        search.value_off = k;
-        val = xbsearch_r(&search, node->values, node->values_count, sizeof(struct trie_value_entry), trie_values_cmp, trie);
-        if (val) {
-                val->value_off = v;
-                return 0;
+        if (node->values_count) {
+                struct trie_value_entry search = {
+                        .key_off = k,
+                        .value_off = v,
+                };
+
+                val = xbsearch_r(&search, node->values, node->values_count, sizeof(struct trie_value_entry), trie_values_cmp, trie);
+                if (val) {
+                        /* replace existing earlier key with new value */
+                        val->value_off = v;
+                        return 0;
+                }
         }
 
         /* extend array, add new entry, sort for bisection */