Since h_Release_r has the possibility of freeing a host, we should not
be using a host after it has been released. A few places can still use a
released host, potentially causing heap corruption, double frees, and
generally weird behavior.
So either move calls of h_Release_r until after we finish using a host,
or make sure to set the pointer to NULL after it has been released.
Change-Id: I3d5275c3862003e372d3c19a5462e62bf9cb269e
Reviewed-on: http://gerrit.openafs.org/747
Tested-by: Andrew Deason <adeason@sinenomine.net>
Reviewed-by: Dan Hyde <drh@umich.edu>
Reviewed-by: Derrick Brashear <shadow@dementia.org>
translate = 1;
h_ReleaseClient_r(tclient);
- /* return the reference taken in local h_FindClient_r--h_ReleaseClient_r
- * does not decrement refcount on client->host */
- h_Release_r(thost);
-
if (ahost) {
if (ahost != thost) {
/* host/client recycle */
thost));
}
+ /* return the reference taken in local h_FindClient_r--h_ReleaseClient_r
+ * does not decrement refcount on client->host */
+ h_Release_r(thost);
+
busyout:
H_UNLOCK;
return (translate ? sys_error_to_et(ret) : ret);
h_Release_r(hp);
return 0;
}
- if (lih_host_held2)
+ if (lih_host_held2) {
h_Release_r(hp);
+ hp = NULL;
+ }
hp1 = hp;
hp2 = hostList;
} else {
if (host->hostFlags & HOSTDELETED) {
h_Unlock_r(host);
h_Release_r(host);
+ host = NULL;
goto restart;
}
h_Unlock_r(host);
if (!(host->hostFlags & ALTADDR)) {
/* Another thread is doing initialization */
h_Unlock_r(host);
- h_Release_r(host);
ViceLog(125,
("Host %" AFS_PTR_FMT " (%s:%d) starting h_Lookup again\n",
host, afs_inet_ntoa_r(host->host, hoststr),
ntohs(host->port)));
+ h_Release_r(host);
goto retry;
}
host->hostFlags |= HWHO_INPROGRESS;
ntohs(host->port)));
h_Lock_r(host);
h_Unlock_r(host);
- h_Release_r(host);
ViceLog(125,
("Host %" AFS_PTR_FMT " (%s:%d) starting h_Lookup again\n",
host, afs_inet_ntoa_r(host->host, hoststr),
ntohs(host->port)));
+ h_Release_r(host);
goto retry;
}
/* We need to check whether the identity in the host structure