Hi,

Struct sockaddr_in and sockaddr_in6 should always be initialized
to zero.  Most of the kernel does this already, this diff fixes all
other places there sin_family is assigned.  Do not pass around
pointers to uninitialized stack memory.

There are some global route variables, I think the padding fields
are always zero and do not change.  I did not touch them.

While there, the call to in6_recoverscope() in fill_drlist() looked
very broken.

I prefered memset() over bzero(), but if a source file was only
using the latter, I have chosen this.

ok?

bluhm

Index: net/pipex.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/net/pipex.c,v
retrieving revision 1.72
diff -u -p -r1.72 pipex.c
--- net/pipex.c 16 Jul 2015 16:12:15 -0000      1.72
+++ net/pipex.c 19 Aug 2015 19:02:39 -0000
@@ -1736,12 +1736,14 @@ drop:
 struct pipex_session *
 pipex_pptp_userland_lookup_session_ipv4(struct mbuf *m0, struct in_addr dst)
 {
-       struct sockaddr_in sin4;
+       struct sockaddr_in sin;
 
-       sin4.sin_family = AF_INET;
-       sin4.sin_addr = dst;
+       memset(&sin, 0, sizeof(sin));
+       sin.sin_len = sizeof(sin);
+       sin.sin_family = AF_INET;
+       sin.sin_addr = dst;
 
-       return pipex_pptp_userland_lookup_session(m0, (struct sockaddr *)&sin4);
+       return pipex_pptp_userland_lookup_session(m0, sintosa(&sin));
 }
 
 #ifdef INET6
@@ -1750,10 +1752,12 @@ pipex_pptp_userland_lookup_session_ipv6(
 {
        struct sockaddr_in6 sin6;
 
+       memset(&sin6, 0, sizeof(sin6));
+       sin6.sin6_len = sizeof(sin6);
        sin6.sin6_family = AF_INET6;
        in6_recoverscope(&sin6, &dst, NULL);
 
-       return pipex_pptp_userland_lookup_session(m0, (struct sockaddr *)&sin6);
+       return pipex_pptp_userland_lookup_session(m0, sin6tosa(&sin6));
 }
 #endif
 
@@ -2168,12 +2172,14 @@ drop:
 struct pipex_session *
 pipex_l2tp_userland_lookup_session_ipv4(struct mbuf *m0, struct in_addr dst)
 {
-       struct sockaddr_in sin4;
+       struct sockaddr_in sin;
 
-       sin4.sin_family = AF_INET;
-       sin4.sin_addr = dst;
+       memset(&sin, 0, sizeof(sin));
+       sin.sin_len = sizeof(sin);
+       sin.sin_family = AF_INET;
+       sin.sin_addr = dst;
 
-       return pipex_l2tp_userland_lookup_session(m0, (struct sockaddr *)&sin4);
+       return pipex_l2tp_userland_lookup_session(m0, sintosa(&sin));
 }
 
 #ifdef INET6
@@ -2182,10 +2188,12 @@ pipex_l2tp_userland_lookup_session_ipv6(
 {
        struct sockaddr_in6 sin6;
 
+       memset(&sin6, 0, sizeof(sin6));
+       sin6.sin6_len = sizeof(sin6);
        sin6.sin6_family = AF_INET6;
        in6_recoverscope(&sin6, &dst, NULL);
 
-       return pipex_l2tp_userland_lookup_session(m0, (struct sockaddr *)&sin6);
+       return pipex_l2tp_userland_lookup_session(m0, sin6tosa(&sin6));
 }
 #endif
 
Index: netinet/in.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/netinet/in.c,v
retrieving revision 1.120
diff -u -p -r1.120 in.c
--- netinet/in.c        8 Jul 2015 07:56:51 -0000       1.120
+++ netinet/in.c        19 Aug 2015 19:18:55 -0000
@@ -809,7 +809,7 @@ in_addmulti(struct in_addr *ap, struct i
                 * New address; allocate a new multicast record
                 * and link it into the interface's multicast list.
                 */
-               inm = malloc(sizeof(*inm), M_IPMADDR, M_NOWAIT);
+               inm = malloc(sizeof(*inm), M_IPMADDR, M_NOWAIT | M_ZERO);
                if (inm == NULL)
                        return (NULL);
 
@@ -824,6 +824,7 @@ in_addmulti(struct in_addr *ap, struct i
                 * Ask the network driver to update its multicast reception
                 * filter appropriately for the new address.
                 */
+               memset(&ifr, 0, sizeof(ifr));
                memcpy(&ifr.ifr_addr, &inm->inm_sin, sizeof(inm->inm_sin));
                if ((*ifp->if_ioctl)(ifp, SIOCADDMULTI,(caddr_t)&ifr) != 0) {
                        free(inm, M_IPMADDR, sizeof(*inm));
@@ -867,6 +868,7 @@ in_delmulti(struct in_multi *inm)
                 * reception filter.
                 */
                if (ifp != NULL) {
+                       memset(&ifr, 0, sizeof(ifr));
                        satosin(&ifr.ifr_addr)->sin_len =
                            sizeof(struct sockaddr_in);
                        satosin(&ifr.ifr_addr)->sin_family = AF_INET;
Index: netinet/ip_mroute.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/netinet/ip_mroute.c,v
retrieving revision 1.79
diff -u -p -r1.79 ip_mroute.c
--- netinet/ip_mroute.c 15 Jul 2015 17:55:08 -0000      1.79
+++ netinet/ip_mroute.c 19 Aug 2015 19:25:51 -0000
@@ -889,6 +889,7 @@ add_vif(struct mbuf *m)
                        return (EOPNOTSUPP);
 
                /* Enable promiscuous reception of all IP multicasts. */
+               memset(&ifr, 0, sizeof(ifr));
                satosin(&ifr.ifr_addr)->sin_len = sizeof(struct sockaddr_in);
                satosin(&ifr.ifr_addr)->sin_family = AF_INET;
                satosin(&ifr.ifr_addr)->sin_addr = zeroin_addr;
@@ -943,6 +944,7 @@ reset_vif(struct vif *vifp)
                reg_vif_num = VIFI_INVALID;
 #endif
        } else {
+               memset(&ifr, 0, sizeof(ifr));
                satosin(&ifr.ifr_addr)->sin_len = sizeof(struct sockaddr_in);
                satosin(&ifr.ifr_addr)->sin_family = AF_INET;
                satosin(&ifr.ifr_addr)->sin_addr = zeroin_addr;
Index: netinet6/in6.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/netinet6/in6.c,v
retrieving revision 1.165
diff -u -p -r1.165 in6.c
--- netinet6/in6.c      19 Aug 2015 13:27:38 -0000      1.165
+++ netinet6/in6.c      19 Aug 2015 19:02:39 -0000
@@ -868,7 +868,7 @@ in6_update_ifa(struct ifnet *ifp, struct
                 * join interface-local all-nodes address.
                 * (ff01::1%ifN, and ff01::%ifN/32)
                 */
-               bzero(&mltaddr.sin6_addr, sizeof(mltaddr.sin6_addr));
+               bzero(&mltaddr, sizeof(mltaddr));
                mltaddr.sin6_len = sizeof(struct sockaddr_in6);
                mltaddr.sin6_family = AF_INET6;
                mltaddr.sin6_addr = in6addr_intfacelocal_allnodes;
@@ -1346,7 +1346,7 @@ in6_addmulti(struct in6_addr *maddr6, st
                 * New address; allocate a new multicast record
                 * and link it into the interface's multicast list.
                 */
-               in6m = malloc(sizeof(*in6m), M_IPMADDR, M_NOWAIT);
+               in6m = malloc(sizeof(*in6m), M_IPMADDR, M_NOWAIT | M_ZERO);
                if (in6m == NULL) {
                        *errorp = ENOBUFS;
                        return (NULL);
Index: netinet6/ip6_mroute.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/netinet6/ip6_mroute.c,v
retrieving revision 1.86
diff -u -p -r1.86 ip6_mroute.c
--- netinet6/ip6_mroute.c       15 Jul 2015 17:56:05 -0000      1.86
+++ netinet6/ip6_mroute.c       19 Aug 2015 19:02:39 -0000
@@ -557,6 +557,7 @@ ip6_mrouter_done(void)
                for (mifi = 0; mifi < nummifs; mifi++) {
                        if (mif6table[mifi].m6_ifp &&
                            !(mif6table[mifi].m6_flags & MIFF_REGISTER)) {
+                               memset(&ifr, 0, sizeof(ifr));
                                ifr.ifr_addr.sin6_family = AF_INET6;
                                ifr.ifr_addr.sin6_addr= in6addr_any;
                                ifp = mif6table[mifi].m6_ifp;
@@ -695,6 +696,7 @@ add_m6if(struct mif6ctl *mifcp)
                 * Enable promiscuous reception of all IPv6 multicasts
                 * from the interface.
                 */
+               memset(&ifr, 0, sizeof(ifr));
                ifr.ifr_addr.sin6_family = AF_INET6;
                ifr.ifr_addr.sin6_addr = in6addr_any;
                error = (*ifp->if_ioctl)(ifp, SIOCADDMULTI, (caddr_t)&ifr);
@@ -760,6 +762,7 @@ del_m6if(mifi_t *mifip)
                 */
                ifp = mifp->m6_ifp;
 
+               memset(&ifr, 0, sizeof(ifr));
                ifr.ifr_addr.sin6_family = AF_INET6;
                ifr.ifr_addr.sin6_addr = in6addr_any;
                (*ifp->if_ioctl)(ifp, SIOCDELMULTI, (caddr_t)&ifr);
Index: netinet6/nd6.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/netinet6/nd6.c,v
retrieving revision 1.145
diff -u -p -r1.145 nd6.c
--- netinet6/nd6.c      19 Aug 2015 13:27:38 -0000      1.145
+++ netinet6/nd6.c      19 Aug 2015 19:02:39 -0000
@@ -1834,9 +1834,7 @@ fill_drlist(void *oldp, size_t *oldlenp,
                        bzero(d, sizeof(*d));
                        d->rtaddr.sin6_family = AF_INET6;
                        d->rtaddr.sin6_len = sizeof(struct sockaddr_in6);
-                       d->rtaddr.sin6_addr = dr->rtaddr;
-                       in6_recoverscope(&d->rtaddr, &d->rtaddr.sin6_addr,
-                           dr->ifp);
+                       in6_recoverscope(&d->rtaddr, &dr->rtaddr, dr->ifp);
                        d->flags = dr->flags;
                        d->rtlifetime = dr->rtlifetime;
                        d->expire = dr->expire;
@@ -1927,9 +1925,9 @@ fill_prlist(void *oldp, size_t *oldlenp,
                                        continue;
                                }
                                s6 = &sin6[advrtrs];
+                               bzero(s6, sizeof(*s6));
                                s6->sin6_family = AF_INET6;
                                s6->sin6_len = sizeof(struct sockaddr_in6);
-                               s6->sin6_addr = pfr->router->rtaddr;
                                in6_recoverscope(s6, &pfr->router->rtaddr,
                                    pfr->router->ifp);
                                advrtrs++;
Index: nfs/krpc_subr.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/nfs/krpc_subr.c,v
retrieving revision 1.28
diff -u -p -r1.28 krpc_subr.c
--- nfs/krpc_subr.c     15 Jul 2015 22:16:42 -0000      1.28
+++ nfs/krpc_subr.c     19 Aug 2015 19:32:32 -0000
@@ -270,7 +270,8 @@ krpc_call(struct sockaddr_in *sa, u_int 
 
        MGET(m, M_WAIT, MT_SONAME);
        sin = mtod(m, struct sockaddr_in *);
-       sin->sin_len = m->m_len = sizeof (struct sockaddr_in);
+       memset(sin, 0, sizeof(*sin));
+       sin->sin_len = m->m_len = sizeof(struct sockaddr_in);
        sin->sin_family = AF_INET;
        sin->sin_addr.s_addr = INADDR_ANY;
        sin->sin_port = htons(0);
Index: nfs/nfs_socket.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/nfs/nfs_socket.c,v
retrieving revision 1.110
diff -u -p -r1.110 nfs_socket.c
--- nfs/nfs_socket.c    15 Jul 2015 22:16:42 -0000      1.110
+++ nfs/nfs_socket.c    19 Aug 2015 19:34:28 -0000
@@ -258,7 +258,8 @@ nfs_connect(struct nfsmount *nmp, struct
 
                MGET(m, M_WAIT, MT_SONAME);
                sin = mtod(m, struct sockaddr_in *);
-               sin->sin_len = m->m_len = sizeof (struct sockaddr_in);
+               memset(sin, 0, sizeof(*sin));
+               sin->sin_len = m->m_len = sizeof(struct sockaddr_in);
                sin->sin_family = AF_INET;
                sin->sin_addr.s_addr = INADDR_ANY;
                sin->sin_port = htons(0);

Reply via email to