Fix misuse of lfind()
authorHarald Geyer <[email protected]>
Mon, 27 Jan 2025 21:51:15 +0000 (27 22:51 +0100)
committerHarald Geyer <[email protected]>
Wed, 29 Jan 2025 19:34:24 +0000 (29 20:34 +0100)
This completely broke some (rarely used) functionality.

lib/managed_data.h
tools/atmreplay.c

index d2f34c0..9800805 100644 (file)
@@ -15,7 +15,7 @@
 #endif
 
 struct MD_LUT_ENTRY {
-       const char *key; /* Needs to be first, so that strcmp() works */
+       const char *key;
        void *data;
 };
 
@@ -25,17 +25,15 @@ struct MD_LUT {
        struct MD_LUT_ENTRY *start;
 };
 
-/*
-MD_DECL int _md_lut_compare(struct MD_LUT_ENTRY *k1, struct MD_LUT_ENTRY *k2) {
-       return strcmp(k1->key, k2->key);
+MD_DECL int _md_lut_compare(const void *key, const void *entry) {
+       const struct MD_LUT_ENTRY *e = entry;
+       return strcmp((const char *) key, e->key);
 }
-*/
 
 MD_DECL struct MD_LUT_ENTRY *md_lut_find(struct MD_LUT *t, const char *key) {
-       struct MD_LUT_ENTRY ref = {key, NULL};
 
-       return lfind(&ref, t->start, &t->n, sizeof(struct MD_LUT_ENTRY),
-                    (int (*)(const void *, const void *)) strcmp);
+       return lfind(key, t->start, &t->n, sizeof(struct MD_LUT_ENTRY),
+                    _md_lut_compare);
 }
 
 MD_DECL void md_lut_insert(struct MD_LUT *t, const char *key, void *data) {
index 5b31fbc..30f8b01 100644 (file)
@@ -66,6 +66,10 @@ static int mygetline(char **line_ptr, size_t *line_n, FILE *stream) {
        return len;
 }
 
+static int lfind_strcmp(const void *key, const void *objp) {
+       return strcmp((const char *) key, *(const char **) objp);
+}
+
 int main(int argc, char **argv) {
        struct DATA data, timer_overrun_data = {-1, USHRT_MAX, 0};
        ATM_SHM mem = NULL;
@@ -147,7 +151,7 @@ int main(int argc, char **argv) {
                puts(line);
                if (logname && !strcmp(line, logname))
                        logid = num_keys;
-               if (!(all || lfind(line, &argv[i], &num_args, sizeof(argv[i]), strcmp))){
+               if (!(all || lfind(line, &argv[i], &num_args, sizeof(argv[i]), lfind_strcmp))){
                        keys[num_keys].value_index = -1;
                        continue;
                }