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.
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>
(cherry picked from commit
416e2f11c35f5d55f91090b30b4db1a9bf6d6e07)
Change-Id: I91bd09c3e6d87476de8c66c2eb710c0fd424cadd
Reviewed-on: http://gerrit.openafs.org/762
Tested-by: Andrew Deason <adeason@sinenomine.net>
Reviewed-by: Derrick Brashear <shadow@dementia.org>
if (thost->hostFlags & HERRORTRANS)
translate = 1;
h_ReleaseClient_r(tclient);
- held = h_Held_r(thost);
- if (held)
- h_Release_r(thost);
if (ahost && ahost != thost) {
char hoststr[16], hoststr2[16];
ViceLog(0, ("CallPostamble: ahost %s:%d (%x) != thost %s:%d (%x)\n",
afs_inet_ntoa_r(thost->host, hoststr), ntohs(thost->port),
thost));
}
+ held = h_Held_r(thost);
+ if (held)
+ 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 {
h_Unlock_r(host);
if (!*heldp)
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);
- if (!held)
- h_Release_r(host);
ViceLog(125,
("Host %s:%d starting h_Lookup again\n",
afs_inet_ntoa_r(host->host, hoststr),
ntohs(host->port)));
+ if (!held)
+ h_Release_r(host);
goto retry;
}
host->hostFlags |= HWHO_INPROGRESS;
ntohs(host->port)));
h_Lock_r(host);
h_Unlock_r(host);
- if (!held)
- h_Release_r(host);
ViceLog(125,
("Host %s:%d starting h_Lookup again\n",
afs_inet_ntoa_r(host->host, hoststr),
ntohs(host->port)));
+ if (!held)
+ h_Release_r(host);
goto retry;
}
/* We need to check whether the identity in the host structure