]> git.michaelhowe.org Git - packages/o/openafs.git/commitdiff
STABLE14-h-enumerate-r-safety-20051128
authorChaskiel M Grundman <cg2v@andrew.cmu.edu>
Tue, 29 Nov 2005 03:41:48 +0000 (03:41 +0000)
committerDerrick Brashear <shadow@dementia.org>
Tue, 29 Nov 2005 03:41:48 +0000 (03:41 +0000)
FIXES 23336

needs further testing, configure a low number of callbacks and hit the server.

(cherry picked from commit 390fd697a05fc51ddc5e7789b210736838780da4)

src/viced/host.c

index 102efd1c19dd5302160d3aaec4498b9fd9a80005..5c9cc8cdd387d2f4e275b6fa496b0d060d224f05 100644 (file)
@@ -895,18 +895,21 @@ h_Enumerate(int (*proc) (), char *param)
 void
 h_Enumerate_r(int (*proc) (), struct host *enumstart, char *param)
 {
-    register struct host *host;
-    register int held;
+    register struct host *host, *next;
+    register int held, nheld;
 
     if (hostCount == 0) {
        return;
     }
-    for (host = enumstart; host; host = host->next) {
-       if (!(held = h_Held_r(host)))
-           h_Hold_r(host);
+    if (!(held = h_Held_r(host)))
+       h_Hold_r(host);
+    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);
        if (!held)
-           h_Release_r(host);  /* this might free up the host */
+           h_Release_r(host); /* this might free up the host */
     }
 }                              /*h_Enumerate_r */