]> err.no Git - systemd/commitdiff
libudev: list - properly sort linked list not only the index
authorKay Sievers <kay.sievers@vrfy.org>
Sun, 28 Aug 2011 20:41:46 +0000 (22:41 +0200)
committerKay Sievers <kay.sievers@vrfy.org>
Sun, 28 Aug 2011 20:45:34 +0000 (22:45 +0200)
<mgorny> it seems that udev-git is b0rked while tag '173' works fine for me
<mgorny> the rule in question is:
<mgorny> also, with >173 persistent-net rules seem to get constantly recreated
         for same devices
<kay> mgorny: logic bug. we only sort the keys in an index, but we don't care
      about the index when reading the list, which doesn't work too well for
      the rules file list where we depend on the order

libudev/libudev-list.c

index 295ee682bcb60b1e4a3c9c859afa9d88c6d1f756..f74a88ca49e9a15d82aa03721c4081b45478c5fb 100644 (file)
@@ -180,7 +180,6 @@ struct udev_list_entry *udev_list_entry_add(struct udev_list *list, const char *
                        return NULL;
                }
        }
-       udev_list_entry_append(entry, list);
 
        if (list->unique) {
                /* allocate or enlarge sorted array if needed */
@@ -199,12 +198,22 @@ struct udev_list_entry *udev_list_entry_add(struct udev_list *list, const char *
                        list->entries_max += add;
                }
 
-               /* insert into sorted array */
+               /* the negative i returned the insertion index */
                i = (-i)-1;
+
+               /* insert into sorted list */
+               if ((unsigned int)i < list->entries_cur)
+                       udev_list_entry_insert_before(entry, list->entries[i]);
+               else
+                       udev_list_entry_append(entry, list);
+
+               /* insert into sorted array */
                memmove(&list->entries[i+1], &list->entries[i],
                        (list->entries_cur - i) * sizeof(struct udev_list_entry *));
                list->entries[i] = entry;
                list->entries_cur++;
+       } else {
+               udev_list_entry_append(entry, list);
        }
 
        dbg(list->udev, "'%s=%s' added\n", entry->name, entry->value);