Re: [PATCH] Fix pointer handling in nm_system_set_ip6_route()



On Sun, 2012-02-12 at 20:25 +0100, Tomáš Trnka wrote:
> Hello,
> 
> nm_system_set_ip6_route() incorrectly takes addresses of the two in6_addr
> pointers passed in (ip6_dest and ip6_gateway) and passes that to
> nm_netlink_route_add(). That function takes two void* so the compiler doesn't
> complain at all that in6_addr** is passed in instead of the correct in6_addr*.
> The only symptom of this (except for correct v6 routes not getting added) is
> these two recurring messages:

Ah, good catch.  I've pushed a patch that actually makes
nm_netlink_route_add() private, and instead adds two helpers that ensure
we can use compiler type checking so this doesn't happen again.  Which
exposed another bug, the add_ip6_route_to_gateway() function was passing
AF_INET instead of AF_INET6, which doesn't seem right.

Thanks!
Dan

> <warn> Failed to add route Netlink Error (errno = No route to host)
> <error> [1328969308.177075] [nm-system.c:595] nm_system_apply_ip6_config():
> (wlan0): failed to set IPv6 route: Netlink Error (errno = No route to host)
> 
> (Because nm_netlink_route_add() uses the *value of the pointer*
> ip6_dest/gateway as IPv6 addresses, most often those addresses are
> unreachable. However, I've seen several mystery routes getting added this
> way.)
> 
> This is fixed by this one-liner (prepared and tested on the NM 0.9.2.0 in
> Fedora 16; AFAICS the bug is still present in git master):
> 
> Signed-off-by: Tomáš Trnka <tomastrnka gmx com>
> 
> diff -u -r NetworkManager-0.9.2.0.orig/src/nm-system.c NetworkManager-0.9.2.0/src/nm-system.c
> --- NetworkManager-0.9.2.0.orig/src/nm-system.c 2012-02-11 13:00:11.188000033 +0100
> +++ NetworkManager-0.9.2.0/src/nm-system.c      2012-02-11 14:53:53.231341828 +0100
> @@ -479,7 +479,7 @@
>         g_return_val_if_fail (route != NULL, -1);
>  
>         /* Add the route */
> -       err = nm_netlink_route_add(route, AF_INET6, &ip6_dest, ip6_prefix, &ip6_gateway, 0);
> +       err = nm_netlink_route_add(route, AF_INET6, ip6_dest, ip6_prefix, ip6_gateway, 0);
>         if (err == -NLE_OBJ_NOTFOUND && ip6_gateway) {
>                 /* Gateway might be over a bridge; try adding a route to gateway first */
>                 struct rtnl_route *route2;
> 
> _______________________________________________
> networkmanager-list mailing list
> networkmanager-list gnome org
> http://mail.gnome.org/mailman/listinfo/networkmanager-list




[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]