From 36a8e29045adfcf5d3c144b0ff0bc9d1398d11b0 Mon Sep 17 00:00:00 2001 From: Jeffrey Altman Date: Wed, 1 Mar 2006 19:12:05 +0000 Subject: [PATCH] viced-h_Enumerate_r-fix-20060301 In h_Enumerate_r it is possible that the host may be released by the called procedure. Therefore, we must preserve the pointer to host->next before the call and hold the host it points to in order to ensure that it does not disappear out from under us. This ensures that although the H_LOCK can be dropped during the procedure and the host list can be rearranged we won't miss more than a handful of hosts during the enumeration. --- src/viced/host.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/viced/host.c b/src/viced/host.c index 1dc27ffb0..71162d193 100644 --- a/src/viced/host.c +++ b/src/viced/host.c @@ -904,10 +904,10 @@ h_Enumerate_r(int (*proc) (), struct host *enumstart, char *param) if (enumstart && !(held = h_Held_r(enumstart))) h_Hold_r(enumstart); for (host = enumstart; host; host = next, held = nheld) { - held = (*proc) (host, held, param); next = host->next; if (next && !(nheld = h_Held_r(next))) h_Hold_r(next); + held = (*proc) (host, held, param); if (!held) h_Release_r(host); /* this might free up the host */ } -- 2.39.5