Module Name:    src
Committed By:   ozaki-r
Date:           Wed Apr  6 07:59:26 UTC 2016

Modified Files:
        src/sys/net: if_llatbl.c

Log Message:
Fill sdl with sockaddr_dl_init

And add an assertion of if_addrlen and ll_addr.

>From christos@


To generate a diff of this commit:
cvs rdiff -u -r1.11 -r1.12 src/sys/net/if_llatbl.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/net/if_llatbl.c
diff -u src/sys/net/if_llatbl.c:1.11 src/sys/net/if_llatbl.c:1.12
--- src/sys/net/if_llatbl.c:1.11	Mon Apr  4 07:37:07 2016
+++ src/sys/net/if_llatbl.c	Wed Apr  6 07:59:26 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_llatbl.c,v 1.11 2016/04/04 07:37:07 ozaki-r Exp $	*/
+/*	$NetBSD: if_llatbl.c,v 1.12 2016/04/06 07:59:26 ozaki-r Exp $	*/
 /*
  * Copyright (c) 2004 Luigi Rizzo, Alessandro Cerri. All rights reserved.
  * Copyright (c) 2004-2008 Qing Li. All rights reserved.
@@ -79,25 +79,20 @@ lltable_dump_entry(struct lltable *llt, 
     struct rt_walkarg *w, struct sockaddr *sa)
 {
 	struct ifnet *ifp = llt->llt_ifp;
-	int error = 0;
+	int error;
+	void *a;
 	struct sockaddr_dl sdl;
 	int size;
 	struct rt_addrinfo info;
 
 	memset(&info, 0, sizeof(info));
 	info.rti_info[RTAX_DST] = sa;
-	memset(&sdl, 0, sizeof(sdl));
-	sdl.sdl_family = AF_LINK;
-	sdl.sdl_len = sizeof(sdl);
-	sdl.sdl_index = ifp->if_index;
-	sdl.sdl_type = ifp->if_type;
-	if ((lle->la_flags & LLE_VALID) == LLE_VALID) {
-		sdl.sdl_alen = ifp->if_addrlen;
-		memcpy(LLADDR(&sdl), &lle->ll_addr, ifp->if_addrlen);
-	} else {
-		sdl.sdl_alen = 0;
-		memset(LLADDR(&sdl), 0, ifp->if_addrlen);
-	}
+
+	a = (lle->la_flags & LLE_VALID) == LLE_VALID ? &lle->ll_addr : NULL;
+	if (sockaddr_dl_init(&sdl, sizeof(sdl), ifp->if_index, ifp->if_type,
+	    NULL, 0, a, ifp->if_addrlen) == NULL)
+		return EINVAL;
+
 	info.rti_info[RTAX_GATEWAY] = sstocsa(&sdl);
 	if (sa->sa_family == AF_INET && lle->la_flags & LLE_PUB) {
 		struct sockaddr_inarp *sin;
@@ -643,7 +638,7 @@ lla_rt_output(const u_char rtm_type, con
 			return (ENOMEM);
 		}
 
-
+		KASSERT(ifp->if_addrlen <= sizeof(lle->ll_addr));
 		memcpy(&lle->ll_addr, CLLADDR(dl), ifp->if_addrlen);
 		if ((rtm_flags & RTF_ANNOUNCE))
 			lle->la_flags |= LLE_PUB;

Reply via email to