In case of interface initialization failure remove struct in_ifaddr* from
in_ifaddrhashtbl in in_ifinit because error handler in in_control removes entries only for AF_INET addresses. If in_ifinit is called for the cloned inteface that has just been created its address family is not AF_INET and therefor LIST_REMOVE is not called for respective LIST_INSERT_HEAD and freed entries remain in in_ifaddrhashtbl and lead to memory corruption. PR: kern/124384
This commit is contained in:
parent
7de1ecef2d
commit
cf77b84879
@ -734,6 +734,14 @@ in_ifinit(struct ifnet *ifp, struct in_ifaddr *ia, struct sockaddr_in *sin,
|
||||
if (ia->ia_addr.sin_family == AF_INET)
|
||||
LIST_INSERT_HEAD(INADDR_HASH(
|
||||
ia->ia_addr.sin_addr.s_addr), ia, ia_hash);
|
||||
else
|
||||
/*
|
||||
* If oldaddr family is not AF_INET (e.g.
|
||||
* interface has been just created) in_control
|
||||
* does not call LIST_REMOVE, and we end up
|
||||
* with bogus ia entries in hash
|
||||
*/
|
||||
LIST_REMOVE(ia, ia_hash);
|
||||
return (error);
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user