From a8b7a1e017a5e16137c00f66701913044bb8ef05 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. Reviewed-on: http://gerrit.openafs.org/4530 Tested-by: BuildBot Reviewed-by: Derrick Brashear (cherry picked from commit 211e906c86be9ad9cba324e776d56093579b6653) Change-Id: Iceb1e2961e9bbb11640c6fccdeb8713a9657df99 Reviewed-on: http://gerrit.openafs.org/4534 Reviewed-by: Derrick Brashear Tested-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 2e8347670..662bf2b49 100644 --- a/src/viced/host.c +++ b/src/viced/host.c @@ -1018,6 +1018,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 */ @@ -1098,6 +1108,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)); -- 2.39.5