From: Alan Jenkins Date: Mon, 8 Sep 2008 19:51:30 +0000 (+0200) Subject: fix name compare bug name_list_key_add() X-Git-Tag: 174~1582 X-Git-Url: https://err.no/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=cb8896cd74814acc9360db3156e37233fcfbc20c;p=systemd fix name compare bug name_list_key_add() The search for an existing key e.g. FOO would match longer keys e.g. FOOBAR. Reuse the correct code from name_list_remove(). --- diff --git a/udev/udev_utils.c b/udev/udev_utils.c index 1649b8cb..2df8fab1 100644 --- a/udev/udev_utils.c +++ b/udev/udev_utils.c @@ -89,14 +89,17 @@ struct name_entry *name_list_key_add(struct udev *udev, struct list_head *name_l { struct name_entry *name_loop; struct name_entry *name_new; + size_t keylen = strlen(key); list_for_each_entry(name_loop, name_list, node) { - if (strncmp(name_loop->name, key, strlen(key)) == 0) { - dbg(udev, "key already present '%s', replace it\n", name_loop->name); - snprintf(name_loop->name, sizeof(name_loop->name), "%s=%s", key, value); - name_loop->name[sizeof(name_loop->name)-1] = '\0'; - return name_loop; - } + if (strncmp(name_loop->name, key, keylen) != 0) + continue; + if (name_loop->name[keylen] != '=') + continue; + dbg(udev, "key already present '%s', replace it\n", name_loop->name); + snprintf(name_loop->name, sizeof(name_loop->name), "%s=%s", key, value); + name_loop->name[sizeof(name_loop->name)-1] = '\0'; + return name_loop; } name_new = malloc(sizeof(struct name_entry));