Changeset 70148ee in rtems


Ignore:
Timestamp:
Feb 23, 2015, 3:46:22 PM (5 years ago)
Author:
Till Straumann <strauman@…>
Branches:
4.10
Children:
2fc3deae
Parents:
0863e8e3
git-author:
Till Straumann <strauman@…> (02/23/15 15:46:22)
git-committer:
Gedare Bloom <gedare@…> (02/23/15 15:48:56)
Message:

networking: alignment exception in ioctl(SIOCGIFCONF)

Access memory using a byte stream when copying to avoid unaligned
access. update #1401

File:
1 edited

Legend:

Unmodified
Added
Removed
  • cpukit/libnetworking/net/if.c

    r0863e8e3 r70148ee  
    720720        struct ifaddr *ifa;
    721721        struct ifreq ifr, *ifrp;
     722        char              *ifrpc;
    722723        int space = ifc->ifc_len, error = 0;
    723724
    724         ifrp = ifc->ifc_req;
     725        ifrpc = (char*)ifc->ifc_req;
    725726        for (; space > sizeof (ifr) && ifp; ifp = ifp->if_next) {
    726727                char workbuf[64];
     
    736737                if ((ifa = ifp->if_addrlist) == 0) {
    737738                        bzero((caddr_t)&ifr.ifr_addr, sizeof(ifr.ifr_addr));
    738                         error = copyout((caddr_t)&ifr, (caddr_t)ifrp,
     739                        error = copyout((caddr_t)&ifr, (caddr_t)ifrpc,
    739740                            sizeof (ifr));
    740741                        if (error)
    741742                                break;
    742                         space -= sizeof (ifr), ifrp++;
     743                        space -= sizeof (ifr); ifrpc+=sizeof(ifr);
    743744                } else
    744745                    for ( ; space > sizeof (ifr) && ifa; ifa = ifa->ifa_next) {
     
    750751                                ifr.ifr_addr = *sa;
    751752                                osa->sa_family = sa->sa_family;
    752                                 error = copyout((caddr_t)&ifr, (caddr_t)ifrp,
     753                                error = copyout((caddr_t)&ifr, (caddr_t)ifrpc,
    753754                                                sizeof (ifr));
    754                                 ifrp++;
     755                                ifrpc+=sizeof(ifr);
    755756                        } else
    756757#endif
    757758                        if (sa->sa_len <= sizeof(*sa)) {
    758759                                ifr.ifr_addr = *sa;
    759                                 error = copyout((caddr_t)&ifr, (caddr_t)ifrp,
     760                                error = copyout((caddr_t)&ifr, (caddr_t)ifrpc,
    760761                                                sizeof (ifr));
    761                                 ifrp++;
     762                                ifrpc+=sizeof(ifr);
    762763                        } else {
    763764                                space -= sa->sa_len - sizeof(*sa);
    764765                                if (space < sizeof (ifr))
    765766                                        break;
    766                                 error = copyout((caddr_t)&ifr, (caddr_t)ifrp,
     767                                error = copyout((caddr_t)&ifr, (caddr_t)ifrpc,
    767768                                                sizeof (ifr.ifr_name));
     769                                ifrpc+=sizeof(ifr.ifr_name);
    768770                                if (error == 0)
    769771                                    error = copyout((caddr_t)sa,
    770                                       (caddr_t)&ifrp->ifr_addr, sa->sa_len);
    771                                 ifrp = (struct ifreq *)
    772                                         (sa->sa_len + (caddr_t)&ifrp->ifr_addr);
     772                                      (caddr_t)ifrpc, sa->sa_len);
     773                                ifrpc += sa->sa_len;
    773774                        }
    774775                        if (error)
Note: See TracChangeset for help on using the changeset viewer.