diff options
author | melifaro <melifaro@FreeBSD.org> | 2015-12-13 16:37:01 +0000 |
---|---|---|
committer | melifaro <melifaro@FreeBSD.org> | 2015-12-13 16:37:01 +0000 |
commit | a10bfcd45d602a114cacad4e651b55cd4b351624 (patch) | |
tree | 5ccc343aaf2a96b61a305dfc22f9e772baedd9c4 /sys/net/route.c | |
parent | 9d2d111f78903eb9c4c84bfd4ec3a5641e1824c4 (diff) | |
download | FreeBSD-src-a10bfcd45d602a114cacad4e651b55cd4b351624.zip FreeBSD-src-a10bfcd45d602a114cacad4e651b55cd4b351624.tar.gz |
Fix PINNED routes handling.
Before r291643, adding new interface prefix had the following logic:
try_add:
EEXIST && (PINNED) {
try_del(w/o PINNED flag)
if (OK)
try_add(PINNED)
}
In r291643, deletion was performed w/ PINNED flag held which leaded
to new interface prefixes (like ::1) overriding older ones.
Fix this by requesting deletion w/o RTF_PINNED.
PR: kern/205285
Submitted by: Fabian Keil <fk at fabiankeil.de>
Diffstat (limited to 'sys/net/route.c')
-rw-r--r-- | sys/net/route.c | 3 |
1 files changed, 3 insertions, 0 deletions
diff --git a/sys/net/route.c b/sys/net/route.c index 6b19edd..86f99ee 100644 --- a/sys/net/route.c +++ b/sys/net/route.c @@ -1586,7 +1586,10 @@ rtrequest1_fib(int req, struct rt_addrinfo *info, struct rtentry **ret_nrt, */ struct sockaddr *info_dst = info->rti_info[RTAX_DST]; info->rti_info[RTAX_DST] = ndst; + /* Do not delete existing PINNED(interface) routes */ + info->rti_flags &= ~RTF_PINNED; rt_old = rt_unlinkrte(rnh, info, &error); + info->rti_flags |= RTF_PINNED; info->rti_info[RTAX_DST] = info_dst; if (rt_old != NULL) rn = rnh->rnh_addaddr(ndst, netmask, rnh, |