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;