mirror of
https://git.openafs.org/openafs.git
synced 2025-01-19 15:30:14 +00:00
viced: Avoid dangling uuid hash table entry
Currently we add a given host to the uuid hash table, then call RXAFS_InitCallBackState3, and then only initialize the host->interface structure if the ICBS3 call succeeded. If the ICBS3 call fails, we have added a host to the uuid hash table, but the host structure does not contain that uuid. If the host is then deleted, we will not remove the host from the uuid hash table (since host->interface is NULL), and so the uuid hash table entry will still point to the freed host. If that host is then later looked up via that uuid, we can reference a freed host, which can cause all kinds of undefined behavior. So instead, add the host to the uuid hash table at the same time that we initialize the host->interface structure, inside initInterfaceAddr_r. FIXES 131277 Change-Id: Ib2ca82cc498877ec896ab1806cf675f1271ec214 Reviewed-on: http://gerrit.openafs.org/8846 Reviewed-by: Derrick Brashear <shadow@your-file-system.com> Tested-by: BuildBot <buildbot@rampaginggeek.com>
This commit is contained in:
parent
89d85da604
commit
7b642173c7
@ -2127,7 +2127,6 @@ h_GetHost_r(struct rx_connection *tcon)
|
||||
/* the new host is held and locked */
|
||||
} else {
|
||||
/* This really is a new host */
|
||||
h_AddHostToUuidHashTable_r(&identP->uuid, host);
|
||||
cb_conn = host->callback_rxcon;
|
||||
rx_GetConnection(cb_conn);
|
||||
H_UNLOCK;
|
||||
@ -4123,6 +4122,8 @@ initInterfaceAddr_r(struct host *host, struct interfaceAddr *interf)
|
||||
opr_Assert(!host->interface);
|
||||
host->interface = interface;
|
||||
|
||||
h_AddHostToUuidHashTable_r(&interface->uuid, host);
|
||||
|
||||
if (LogLevel >= 125) {
|
||||
afsUUID_to_string(&interface->uuid, uuidstr, 127);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user