Changeset 237595d8 in rtems


Ignore:
Timestamp:
Feb 23, 2015, 3:46:22 PM (5 years ago)
Author:
Till Straumann <strauman@…>
Branches:
4.9
Children:
344856b8
Parents:
e446d32
git-author:
Till Straumann <strauman@…> (02/23/15 15:46:22)
git-committer:
Gedare Bloom <gedare@…> (02/23/15 15:46:22)
Message:

networking: alignment exception in ioctl(SIOCGIFCONF)

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

File:
1 edited

Legend:

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

    re446d32 r237595d8  
    716716        struct ifaddr *ifa;
    717717        struct ifreq ifr, *ifrp;
     718        char              *ifrpc;
    718719        int space = ifc->ifc_len, error = 0;
    719720
    720         ifrp = ifc->ifc_req;
     721        ifrpc = (char*)ifc->ifc_req;
    721722        for (; space > sizeof (ifr) && ifp; ifp = ifp->if_next) {
    722723                char workbuf[64];
     
    732733                if ((ifa = ifp->if_addrlist) == 0) {
    733734                        bzero((caddr_t)&ifr.ifr_addr, sizeof(ifr.ifr_addr));
    734                         error = copyout((caddr_t)&ifr, (caddr_t)ifrp,
     735                        error = copyout((caddr_t)&ifr, (caddr_t)ifrpc,
    735736                            sizeof (ifr));
    736737                        if (error)
    737738                                break;
    738                         space -= sizeof (ifr), ifrp++;
     739                        space -= sizeof (ifr); ifrpc+=sizeof(ifr);
    739740                } else
    740741                    for ( ; space > sizeof (ifr) && ifa; ifa = ifa->ifa_next) {
     
    746747                                ifr.ifr_addr = *sa;
    747748                                osa->sa_family = sa->sa_family;
    748                                 error = copyout((caddr_t)&ifr, (caddr_t)ifrp,
     749                                error = copyout((caddr_t)&ifr, (caddr_t)ifrpc,
    749750                                                sizeof (ifr));
    750                                 ifrp++;
     751                                ifrpc+=sizeof(ifr);
    751752                        } else
    752753#endif
    753754                        if (sa->sa_len <= sizeof(*sa)) {
    754755                                ifr.ifr_addr = *sa;
    755                                 error = copyout((caddr_t)&ifr, (caddr_t)ifrp,
     756                                error = copyout((caddr_t)&ifr, (caddr_t)ifrpc,
    756757                                                sizeof (ifr));
    757                                 ifrp++;
     758                                ifrpc+=sizeof(ifr);
    758759                        } else {
    759760                                space -= sa->sa_len - sizeof(*sa);
    760761                                if (space < sizeof (ifr))
    761762                                        break;
    762                                 error = copyout((caddr_t)&ifr, (caddr_t)ifrp,
     763                                error = copyout((caddr_t)&ifr, (caddr_t)ifrpc,
    763764                                                sizeof (ifr.ifr_name));
     765                                ifrpc+=sizeof(ifr.ifr_name);
    764766                                if (error == 0)
    765767                                    error = copyout((caddr_t)sa,
    766                                       (caddr_t)&ifrp->ifr_addr, sa->sa_len);
    767                                 ifrp = (struct ifreq *)
    768                                         (sa->sa_len + (caddr_t)&ifrp->ifr_addr);
     768                                      (caddr_t)ifrpc, sa->sa_len);
     769                                ifrpc += sa->sa_len;
    769770                        }
    770771                        if (error)
Note: See TracChangeset for help on using the changeset viewer.