Module Name: src Committed By: christos Date: Mon Jan 30 20:02:55 UTC 2012
Modified Files: src/sys/net: rtsock.c Log Message: - don't copy past the end of sockaddr if we are rounding, zero it out instead, from mlelstv@ - put a comment explaining the 6 nuls. To generate a diff of this commit: cvs rdiff -u -r1.139 -r1.140 src/sys/net/rtsock.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/rtsock.c diff -u src/sys/net/rtsock.c:1.139 src/sys/net/rtsock.c:1.140 --- src/sys/net/rtsock.c:1.139 Sat Dec 31 15:41:58 2011 +++ src/sys/net/rtsock.c Mon Jan 30 15:02:55 2012 @@ -1,4 +1,4 @@ -/* $NetBSD: rtsock.c,v 1.139 2011/12/31 20:41:58 christos Exp $ */ +/* $NetBSD: rtsock.c,v 1.140 2012/01/30 20:02:55 christos Exp $ */ /* * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. @@ -61,7 +61,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: rtsock.c,v 1.139 2011/12/31 20:41:58 christos Exp $"); +__KERNEL_RCSID(0, "$NetBSD: rtsock.c,v 1.140 2012/01/30 20:02:55 christos Exp $"); #ifdef _KERNEL_OPT #include "opt_inet.h" @@ -683,6 +683,10 @@ COMPATNAME(rt_msg1)(int type, struct rt_ dlen = RT_XROUNDUP(sa->sa_len); m_copyback(m, len, sa->sa_len, sa); if (dlen != sa->sa_len) { + /* + * Up to 6 + 1 nul's since roundup is to + * sizeof(uint64_t) (8 bytes) + */ m_copyback(m, len + sa->sa_len, dlen - sa->sa_len, "\0\0\0\0\0\0"); } @@ -735,8 +739,13 @@ again: rtinfo->rti_addrs |= (1 << i); dlen = RT_XROUNDUP(sa->sa_len); if (cp) { - (void)memcpy(cp, sa, (size_t)dlen); - cp += dlen; + int diff = dlen - sa->sa_len; + (void)memcpy(cp, sa, (size_t)sa->sa_len); + cp += sa->sa_len; + if (diff > 0) { + (void)memset(cp, 0, (size_t)diff); + cp += diff; + } } len += dlen; }