|
Description
|
It's possible to wedge kernel threads in ip by doing the following:
1. Plumb two IPv6 addresses on interface A (A and A:1).
2. Join an IPv6 multicast group on interface A.
3. Bring interface A down (ifconfig A inet6 down)
4. Unplumb A:1 (ifconfig A:1 inet6 unplumb)
4 becomes wedged issuing SIOCLIFREMOVEIF due to some inccorect logic in ipif_is_freeable():
/* This is the last ipif going down or being deleted on this ill */
if (!ILL_FREE_OK(ill) || ill->ill_refcnt != 0) {
return (B_FALSE);
}
ILL_FREE_OK() will return B_FALSE in this case (as it should), as there's another ipif on this ill. It just happens to be down...
A simple C program that joins a multicast group to help to reproduce this problem is attached to this CR.
|