On 11/08/15(Tue) 16:25, Alexander Bluhm wrote:
> On Mon, Aug 10, 2015 at 10:43:46PM +0200, Martin Pieuchot wrote:
> > In general these messages do not help. Here we have two cases of
> > messages, either logged at LOG_INFO or LOG_ERR.
>
> Yes, multiple logs for the same error are bad. But there is a path
> where we ignore the return code of in6_update_ifa().
>
> in6_update_ifa()
> in6_ifattach_loopback()
> in6_ifattach()
>
> The latter is called without error check from
> if_up()
> ifioctl()
> ifnewlladdr()
> in6_control()
>
> So we should either propagate the error in these functions or add
> a log somewhere in the call stack.
What about committing this diff first?
Index: net/if.c
===================================================================
RCS file: /cvs/src/sys/net/if.c,v
retrieving revision 1.359
diff -u -p -r1.359 if.c
--- net/if.c 16 Aug 2015 12:19:06 -0000 1.359
+++ net/if.c 17 Aug 2015 11:04:39 -0000
@@ -1314,11 +1314,11 @@ ifioctl(struct socket *so, u_long cmd, c
case AF_INET6:
s = splsoftnet();
if (cmd == SIOCIFAFATTACH)
- in6_ifattach(ifp);
+ error = in6_ifattach(ifp);
else
in6_ifdetach(ifp);
splx(s);
- return (0);
+ return (error);
#endif /* INET6 */
default:
return (EAFNOSUPPORT);
@@ -1382,8 +1382,10 @@ ifioctl(struct socket *so, u_long cmd, c
#ifdef INET6
if (ISSET(ifr->ifr_flags, IFXF_AUTOCONF6)) {
s = splsoftnet();
- in6_ifattach(ifp);
+ error = in6_ifattach(ifp);
splx(s);
+ if (error != 0)
+ return (error);
}
if ((ifr->ifr_flags & IFXF_AUTOCONF6) &&
Index: netinet6//in6.c
===================================================================
RCS file: /cvs/src/sys/netinet6/in6.c,v
retrieving revision 1.162
diff -u -p -r1.162 in6.c
--- netinet6//in6.c 12 Aug 2015 09:06:18 -0000 1.162
+++ netinet6//in6.c 17 Aug 2015 11:00:04 -0000
@@ -479,7 +479,11 @@ in6_control(struct socket *so, u_long cm
* is no link-local yet.
*/
s = splsoftnet();
- in6_ifattach(ifp);
+ error = in6_ifattach(ifp);
+ if (error != 0) {
+ splx(s);
+ return (error);
+ }
error = in6_update_ifa(ifp, ifra, ia6);
splx(s);
if (error != 0)