From: Andrew Deason Date: Sat, 23 Apr 2011 21:52:30 +0000 (-0500) Subject: viced: Release all hosts in h_Enumerate* X-Git-Tag: upstream/1.6.0.pre5^2~11 X-Git-Url: https://git.michaelhowe.org/gitweb/?a=commitdiff_plain;h=a8b7a1e017a5e16137c00f66701913044bb8ef05;p=packages%2Fo%2Fopenafs.git 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 --- 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));