Author: bz
Date: Sun Feb  7 22:53:03 2016
New Revision: 295386
URL: https://svnweb.freebsd.org/changeset/base/295386

Log:
  MFC r295202:
  
   Try to fix a bug introduced in r228623 (head).
   We started to copy the ifa_msghdr as otherwise platforms with strict
   alignment would break.  It is unclear to me if there's also a problem with
   access to the address list following the structure.
   However we never copied the address list after the structure and thus are
   pointing at random memory.  For now just use a pointer to the original
   memory for accessing the address list making it at least work on
   platforms with weak memory access.
  
   PR:                   195445
   Reported by:          wolfgang lyxys.ka.sub.org
   Tested by:            wolfgang lyxys.ka.sub.org (x86)
  
  Approved by:          re (marius)

Modified:
  stable/10/contrib/bsnmp/snmp_mibII/mibII.c
Directory Properties:
  stable/10/   (props changed)

Modified: stable/10/contrib/bsnmp/snmp_mibII/mibII.c
==============================================================================
--- stable/10/contrib/bsnmp/snmp_mibII/mibII.c  Sun Feb  7 22:12:39 2016        
(r295385)
+++ stable/10/contrib/bsnmp/snmp_mibII/mibII.c  Sun Feb  7 22:53:03 2016        
(r295386)
@@ -969,7 +969,7 @@ handle_rtmsg(struct rt_msghdr *rtm)
 {
        struct sockaddr *addrs[RTAX_MAX];
        struct if_msghdr *ifm;
-       struct ifa_msghdr ifam;
+       struct ifa_msghdr ifam, *ifamp;
        struct ifma_msghdr *ifmam;
 #ifdef RTM_IFANNOUNCE
        struct if_announcemsghdr *ifan;
@@ -989,8 +989,9 @@ handle_rtmsg(struct rt_msghdr *rtm)
        switch (rtm->rtm_type) {
 
          case RTM_NEWADDR:
-               memcpy(&ifam, rtm, sizeof(ifam));
-               mib_extract_addrs(ifam.ifam_addrs, (u_char *)(&ifam + 1), 
addrs);
+               ifamp = (struct ifa_msghdr *)rtm;
+               memcpy(&ifam, ifamp, sizeof(ifam));
+               mib_extract_addrs(ifam.ifam_addrs, (u_char *)(ifamp + 1), 
addrs);
                if (addrs[RTAX_IFA] == NULL || addrs[RTAX_NETMASK] == NULL)
                        break;
 
@@ -1016,8 +1017,9 @@ handle_rtmsg(struct rt_msghdr *rtm)
                break;
 
          case RTM_DELADDR:
-               memcpy(&ifam, rtm, sizeof(ifam));
-               mib_extract_addrs(ifam.ifam_addrs, (u_char *)(&ifam + 1), 
addrs);
+               ifamp = (struct ifa_msghdr *)rtm;
+               memcpy(&ifam, ifamp, sizeof(ifam));
+               mib_extract_addrs(ifam.ifam_addrs, (u_char *)(ifamp + 1), 
addrs);
                if (addrs[RTAX_IFA] == NULL)
                        break;
 
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to