Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

bgpd: Avoid use-after-free when flushing bgp_distance_table #17748

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion bgpd/bgp_route.c
Original file line number Diff line number Diff line change
Expand Up @@ -15794,7 +15794,7 @@ void bgp_address_family_distance_delete(void)
bgp_distance_free(bdistance);

bgp_dest_set_bgp_distance_info(dest, NULL);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

hmm - I'm not quite following.
above, the one-dest code calls bgp_dest_set_bgp_path_info(dest, NULL) instead of set_bgp_distance_info() - is one of these wrong?
and why does adding the dest = help ? if that unlock_node frees dest, it'll be NULL, and the iteration will stop - and that seems ... wrong: shouldn't the iteration continue through all of the dests?
I thought in some other places where a loop could free an object, we find the "next" at the top of the clause, instead of using the object in the for clause directly?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe you are right, I'm just trying to fix use-after-free by using the same pattern it's used somewhere else in the code too. You can see bgp_static_delete() as an example.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

shouldn't this just be a dest_next = bgp_route_next() before the unlock? and in the for loop we set dest = dest_next;?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think that's one question, yes.
The other (that I had) was about the inconsistency in the clean-up api to use: "set...path_info()" above, vs "set...distance_info()" in this new code.

bgp_dest_unlock_node(dest);
dest = bgp_dest_unlock_node(dest);
}
}
}
Expand Down
Loading