From 211e906c86be9ad9cba324e776d56093579b6653 Mon Sep 17 00:00:00 2001 From: Andrew Deason Date: Sat, 23 Apr 2011 16:52:30 -0500 Subject: [PATCH] viced: Release all hosts in h_Enumerate* h_Enumerate and h_Enumerate_r were not releasing all of the holds they obtained when the callback function caused the enumeration to bail early. Correct them so all host holds are released. Change-Id: I6f405fad3d2767c9e0b3567c40cbbd1de8ac26aa Reviewed-on: http://gerrit.openafs.org/4530 Tested-by: BuildBot Reviewed-by: Derrick Brashear --- src/viced/host.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/viced/host.c b/src/viced/host.c index 6249ec513f..7cf9b76f3d 100644 --- a/src/viced/host.c +++ b/src/viced/host.c @@ -1007,6 +1007,16 @@ h_Enumerate(int (*proc) (struct host*, void *), void *param) ShutDownAndCore(PANIC); } } + if (i < count-1) { + /* we bailed out of enumerating hosts early; we still have holds on + * some of the hosts in 'list', so release them */ + i++; + H_LOCK; + for ( ; i < count; i++) { + h_Release_r(list[i]); + } + H_UNLOCK; + } free((void *)list); } /* h_Enumerate */ @@ -1087,6 +1097,9 @@ h_Enumerate_r(int (*proc) (struct host *, void *), flags = (*proc) (host, param); if (H_ENUMERATE_ISSET_BAIL(flags)) { h_Release_r(host); /* this might free up the host */ + if (next) { + h_Release_r(next); + } break; } else if (flags) { ViceLog(0, ("h_Enumerate_r got back invalid return value %d\n", flags));