about: Correct handling of ring in fetch_about_poll

Signed-off-by: Daniel Silverstone <dsilvers@digital-scurf.org>
This commit is contained in:
Daniel Silverstone 2020-02-24 09:46:59 +00:00
parent 5a028f61d3
commit 89e468422d
No known key found for this signature in database
GPG Key ID: C30DF439F2987D74

View File

@ -1644,6 +1644,7 @@ static void fetch_about_abort(void *ctx)
static void fetch_about_poll(lwc_string *scheme) static void fetch_about_poll(lwc_string *scheme)
{ {
struct fetch_about_context *c, *next; struct fetch_about_context *c, *next;
bool was_last_item = false;
if (ring == NULL) return; if (ring == NULL) return;
@ -1671,14 +1672,28 @@ static void fetch_about_poll(lwc_string *scheme)
* as processing this item may have added to the ring * as processing this item may have added to the ring
*/ */
next = c->r_next; next = c->r_next;
was_last_item = next == c;
fetch_remove_from_queues(c->fetchh); fetch_remove_from_queues(c->fetchh);
fetch_free(c->fetchh); fetch_free(c->fetchh);
/* Having called into the fetch machinery, our ring might
* have been updated
*/
if (was_last_item) {
/* We were previously the last item in the ring
* so let's reset to the head of the ring
* and try again
*/
c = ring;
} else {
c = next;
}
/* Advance to next ring entry, exiting if we've reached /* Advance to next ring entry, exiting if we've reached
* the start of the ring or the ring has become empty * the start of the ring or the ring has become empty
*/ */
} while ( (c = next) != ring && ring != NULL); } while (ring != NULL);
} }