summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libudev/libudev-list.c13
1 files changed, 11 insertions, 2 deletions
diff --git a/libudev/libudev-list.c b/libudev/libudev-list.c
index 295ee682bc..f74a88ca49 100644
--- a/libudev/libudev-list.c
+++ b/libudev/libudev-list.c
@@ -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);