libudev-enumerate.c:udev_enumerate_get_list_entry() fixed possible stale pointer
If a realloc() happens in syspath_add(), the move_later pointer could point to an invalid memory region. Let move_later store the array index, instead of the pointer to the entry.
This commit is contained in:
parent
4bb3a126b7
commit
763a24a3b6
|
@ -270,8 +270,9 @@ _public_ struct udev_list_entry *udev_enumerate_get_list_entry(struct udev_enume
|
||||||
return NULL;
|
return NULL;
|
||||||
if (!udev_enumerate->devices_uptodate) {
|
if (!udev_enumerate->devices_uptodate) {
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
|
int move_later = -1;
|
||||||
unsigned int max;
|
unsigned int max;
|
||||||
struct syspath *prev = NULL, *move_later = NULL;
|
struct syspath *prev = NULL;
|
||||||
size_t move_later_prefix = 0;
|
size_t move_later_prefix = 0;
|
||||||
|
|
||||||
udev_list_cleanup(&udev_enumerate->devices_list);
|
udev_list_cleanup(&udev_enumerate->devices_list);
|
||||||
|
@ -303,23 +304,25 @@ _public_ struct udev_list_entry *udev_enumerate_get_list_entry(struct udev_enume
|
||||||
move_later_prefix = devices_delay_later(udev_enumerate->udev, entry->syspath);
|
move_later_prefix = devices_delay_later(udev_enumerate->udev, entry->syspath);
|
||||||
|
|
||||||
if (move_later_prefix > 0) {
|
if (move_later_prefix > 0) {
|
||||||
move_later = entry;
|
move_later = i;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (move_later &&
|
if ((move_later >= 0) &&
|
||||||
!strneq(entry->syspath, move_later->syspath, move_later_prefix)) {
|
!strneq(entry->syspath, udev_enumerate->devices[move_later].syspath, move_later_prefix)) {
|
||||||
|
|
||||||
udev_list_entry_add(&udev_enumerate->devices_list, move_later->syspath, NULL);
|
udev_list_entry_add(&udev_enumerate->devices_list,
|
||||||
move_later = NULL;
|
udev_enumerate->devices[move_later].syspath, NULL);
|
||||||
|
move_later = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
udev_list_entry_add(&udev_enumerate->devices_list, entry->syspath, NULL);
|
udev_list_entry_add(&udev_enumerate->devices_list, entry->syspath, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (move_later)
|
if (move_later >= 0)
|
||||||
udev_list_entry_add(&udev_enumerate->devices_list, move_later->syspath, NULL);
|
udev_list_entry_add(&udev_enumerate->devices_list,
|
||||||
|
udev_enumerate->devices[move_later].syspath, NULL);
|
||||||
|
|
||||||
/* add and cleanup delayed devices from end of list */
|
/* add and cleanup delayed devices from end of list */
|
||||||
for (i = max; i < udev_enumerate->devices_cur; i++) {
|
for (i = max; i < udev_enumerate->devices_cur; i++) {
|
||||||
|
|
Loading…
Reference in a new issue