mirror of
https://github.com/systemd/systemd.git
synced 2024-10-28 11:55:44 +03:00
libudev: fix udev_queue_get_seqnum_sequence_is_finished() with empty queue file
We an empty or garbage-collected queue file, we might not have a record for the first sequence we wait for, and therefore must not wait for it.
This commit is contained in:
parent
484e1b2d11
commit
e0d9c042f8
@ -29,7 +29,7 @@ CLEANFILES =
|
||||
# libudev
|
||||
# ------------------------------------------------------------------------------
|
||||
LIBUDEV_CURRENT=8
|
||||
LIBUDEV_REVISION=1
|
||||
LIBUDEV_REVISION=2
|
||||
LIBUDEV_AGE=8
|
||||
|
||||
SUBDIRS += libudev/docs
|
||||
|
@ -299,7 +299,7 @@ int udev_queue_get_queue_is_empty(struct udev_queue *udev_queue)
|
||||
if (queue_file == NULL)
|
||||
return 1;
|
||||
|
||||
while (1) {
|
||||
for (;;) {
|
||||
unsigned long long int seqnum;
|
||||
ssize_t devpath_len;
|
||||
|
||||
@ -348,7 +348,7 @@ out:
|
||||
int udev_queue_get_seqnum_sequence_is_finished(struct udev_queue *udev_queue,
|
||||
unsigned long long int start, unsigned long long int end)
|
||||
{
|
||||
unsigned long long int seqnum = 0;
|
||||
unsigned long long int seqnum;
|
||||
ssize_t devpath_len;
|
||||
int unfinished;
|
||||
FILE *queue_file;
|
||||
@ -368,20 +368,33 @@ int udev_queue_get_seqnum_sequence_is_finished(struct udev_queue *udev_queue,
|
||||
fclose(queue_file);
|
||||
return -EOVERFLOW;
|
||||
}
|
||||
unfinished = (end - start) + 1;
|
||||
|
||||
while (unfinished > 0) {
|
||||
/*
|
||||
* we might start with 0, and handle the initial seqnum
|
||||
* only when we find an entry in the queue file
|
||||
**/
|
||||
unfinished = end - start;
|
||||
|
||||
do {
|
||||
if (udev_queue_read_seqnum(queue_file, &seqnum) < 0)
|
||||
break;
|
||||
devpath_len = udev_queue_skip_devpath(queue_file);
|
||||
if (devpath_len < 0)
|
||||
break;
|
||||
|
||||
/*
|
||||
* we might start with an empty or re-build queue file, where
|
||||
* the initial seqnum is not recorded as finished
|
||||
*/
|
||||
if (start == seqnum && devpath_len > 0)
|
||||
unfinished++;
|
||||
|
||||
if (devpath_len == 0) {
|
||||
if (seqnum >= start && seqnum <= end)
|
||||
unfinished--;
|
||||
}
|
||||
}
|
||||
} while (unfinished > 0);
|
||||
|
||||
fclose(queue_file);
|
||||
|
||||
return (unfinished == 0);
|
||||
|
Loading…
Reference in New Issue
Block a user