Fix panic when trying to delete non-existent gateway in multipath route.
IF non-existend gateway was specified, the code responsible for calculating an updated nexthop group, returned the same already-used nexthop group. After the route table update, the operation result contained the same old & new nexthop groups. Thus, the code responsible for decomposing the notification to the list of simple nexthop-level notifications, was not able to find any differences. As a result, it hasn't updated any of the "simple" notification fields, resulting in empty rtentry pointer. This empty pointer was the direct reason of a panic. Fix the problem by returning ESRCH when the new nexthop group is the same as the old one after applying gateway filter. Reported by: Michael <michael.adm at gmail.com> PR: 255665 MFC after: 3 days
This commit is contained in:
parent
ac200a9c38
commit
aad59c79f5
@ -181,10 +181,15 @@ del_route_mpath(struct rib_head *rh, struct rt_addrinfo *info,
|
||||
if ((info->rti_info[RTAX_GATEWAY] == NULL) && (info->rti_filter == NULL))
|
||||
return (ESRCH);
|
||||
|
||||
error = nhgrp_get_filtered_group(rh, nhg, gw_filter_func, (void *)&ri,
|
||||
&rnd);
|
||||
if (error == 0)
|
||||
error = nhgrp_get_filtered_group(rh, nhg, gw_filter_func, (void *)&ri, &rnd);
|
||||
if (error == 0) {
|
||||
if (rnd.rnd_nhgrp == nhg) {
|
||||
/* No gateway match, unreference new group and return. */
|
||||
nhop_free_any(rnd.rnd_nhop);
|
||||
return (ESRCH);
|
||||
}
|
||||
error = change_route_nhop(rh, rt, info, &rnd, rc);
|
||||
}
|
||||
return (error);
|
||||
}
|
||||
|
||||
|
@ -578,9 +578,9 @@ nhgrp_get_group(struct rib_head *rh, struct weightened_nhop *wn, int num_nhops,
|
||||
}
|
||||
|
||||
/*
|
||||
* Creates new nexthop group based on @src group with the nexthops defined in bitmask
|
||||
* @nhop_mask removed.
|
||||
* Returns referenced nexthop group or NULL on failure.
|
||||
* Creates new nexthop group based on @src group without the nexthops
|
||||
* chosen by @flt_func.
|
||||
* Returns 0 on success, storring the reference nhop group/object in @rnd.
|
||||
*/
|
||||
int
|
||||
nhgrp_get_filtered_group(struct rib_head *rh, const struct nhgrp_object *src,
|
||||
|
Loading…
Reference in New Issue
Block a user