Changeset 25e14e3 in rtems


Ignore:
Timestamp:
Feb 23, 2015, 3:46:22 PM (4 years ago)
Author:
Till Straumann <strauman@…>
Branches:
4.11, master
Children:
748fbd1
Parents:
1281c34
git-author:
Till Straumann <strauman@…> (02/23/15 15:46:22)
git-committer:
Gedare Bloom <gedare@…> (02/23/15 15:49:50)
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

    r1281c34 r25e14e3  
    717717        struct ifaddr *ifa;
    718718        struct ifreq ifr, *ifrp;
     719        char              *ifrpc;
    719720        int space = ifc->ifc_len, error = 0;
    720721
    721         ifrp = ifc->ifc_req;
     722        ifrpc = (char*)ifc->ifc_req;
    722723        for (; space > sizeof (ifr) && ifp; ifp = ifp->if_next) {
    723724                char workbuf[64];
     
    733734                if ((ifa = ifp->if_addrlist) == 0) {
    734735                        bzero((caddr_t)&ifr.ifr_addr, sizeof(ifr.ifr_addr));
    735                         error = copyout((caddr_t)&ifr, (caddr_t)ifrp,
     736                        error = copyout((caddr_t)&ifr, (caddr_t)ifrpc,
    736737                            sizeof (ifr));
    737738                        if (error)
    738739                                break;
    739                         space -= sizeof (ifr), ifrp++;
     740                        space -= sizeof (ifr); ifrpc+=sizeof(ifr);
    740741                } else
    741742                    for ( ; space > sizeof (ifr) && ifa; ifa = ifa->ifa_next) {
     
    747748                                ifr.ifr_addr = *sa;
    748749                                osa->sa_family = sa->sa_family;
    749                                 error = copyout((caddr_t)&ifr, (caddr_t)ifrp,
     750                                error = copyout((caddr_t)&ifr, (caddr_t)ifrpc,
    750751                                                sizeof (ifr));
    751                                 ifrp++;
     752                                ifrpc+=sizeof(ifr);
    752753                        } else
    753754#endif
    754755                        if (sa->sa_len <= sizeof(*sa)) {
    755756                                ifr.ifr_addr = *sa;
    756                                 error = copyout((caddr_t)&ifr, (caddr_t)ifrp,
     757                                error = copyout((caddr_t)&ifr, (caddr_t)ifrpc,
    757758                                                sizeof (ifr));
    758                                 ifrp++;
     759                                ifrpc+=sizeof(ifr);
    759760                        } else {
    760761                                space -= sa->sa_len - sizeof(*sa);
    761762                                if (space < sizeof (ifr))
    762763                                        break;
    763                                 error = copyout((caddr_t)&ifr, (caddr_t)ifrp,
     764                                error = copyout((caddr_t)&ifr, (caddr_t)ifrpc,
    764765                                                sizeof (ifr.ifr_name));
     766                                ifrpc+=sizeof(ifr.ifr_name);
    765767                                if (error == 0)
    766768                                    error = copyout((caddr_t)sa,
    767                                       (caddr_t)&ifrp->ifr_addr, sa->sa_len);
    768                                 ifrp = (struct ifreq *)
    769                                         (sa->sa_len + (caddr_t)&ifrp->ifr_addr);
     769                                      (caddr_t)ifrpc, sa->sa_len);
     770                                ifrpc += sa->sa_len;
    770771                        }
    771772                        if (error)
Note: See TracChangeset for help on using the changeset viewer.