Changeset 49ff36b in rtems


Ignore:
Timestamp:
Feb 23, 2015, 5:06:21 PM (5 years ago)
Author:
Jeffrey Hill <johill@…>
Branches:
4.11, master
Children:
ced84fc0
Parents:
748fbd1
git-author:
Jeffrey Hill <johill@…> (02/23/15 17:06:21)
git-committer:
Gedare Bloom <gedare@…> (02/23/15 17:08:33)
Message:

rpc: misaligned address exception in get_myaddress.c

closes #2249 see #1401

File:
1 edited

Legend:

Unmodified
Added
Removed
  • cpukit/librpc/src/rpc/get_myaddress.c

    r748fbd1 r49ff36b  
    5050#include <sys/socket.h>
    5151#include <stdio.h>
     52#include <stdlib.h>
    5253#include <unistd.h>
    53 #include <sys/mbuf.h>
    5454#include <net/if.h>
    5555#include <sys/ioctl.h>
    5656#include <netinet/in.h>
    5757#include <arpa/inet.h>
     58
     59
     60/*
     61 * Determine the size of an ifreq structure when addresses larger
     62 * than the pifreq structure size may be returned from the kernel.
     63 */
     64static size_t ifreqSize ( struct ifreq *pifreq )
     65{
     66  size_t size = pifreq->ifr_addr.sa_len + sizeof(pifreq->ifr_name);
     67  if ( size < sizeof ( *pifreq ) ) {
     68    size = sizeof ( *pifreq );
     69  }
     70  return size;
     71}
    5872
    5973/*
     
    6882{
    6983        int s;
    70         char buf[BUFSIZ];
    7184        struct ifconf ifc;
    72         struct ifreq ifreq, *ifr, *end;
     85        struct ifreq ifreq, *ifr;
    7386        int loopback = 0, gotit = 0;
    7487
     
    7689                return(-1);
    7790        }
    78         ifc.ifc_len = sizeof (buf);
    79         ifc.ifc_buf = buf;
     91again:
     92        ifc.ifc_len = sizeof ( struct ifreq ) * 8u;
     93        ifc.ifc_buf = malloc ( ifc.ifc_len );
     94  if ( ! ifc.ifc_buf ) {
     95                _RPC_close(s);
     96    return -1;
     97  }
    8098        if (ioctl(s, SIOCGIFCONF, (char *)&ifc) < 0) {
    8199                _RPC_close(s);
     100    free ( ifc.ifc_buf );
    82101                return(-1);
    83102        }
    84 again:
    85103        ifr = ifc.ifc_req;
    86         end = (struct ifreq *) (ifc.ifc_buf + ifc.ifc_len);
    87104
    88         while (ifr < end) {
    89                 ifreq = *ifr;
    90                 if (ioctl(s, SIOCGIFFLAGS, (char *)&ifreq) < 0) {
     105        while ( ifc.ifc_len >= ifreqSize ( ifr ) ) {
     106    ifreq = *ifr;
     107                if (ioctl(s, SIOCGIFFLAGS, (char *) &ifreq ) < 0) {
    91108                        _RPC_close(s);
     109      free ( ifc.ifc_buf );
    92110                        return(-1);
    93111                }
     
    103121                        break;
    104122                }
    105                 if (ifr->ifr_addr.sa_len)
    106                         ifr = (struct ifreq *) ((caddr_t) ifr +
    107                               ifr->ifr_addr.sa_len -
    108                               sizeof(struct sockaddr));
    109                 ifr++;
     123
     124    const size_t len = ifreqSize ( ifr );
     125    ifc.ifc_len -= len;
     126    /*
     127     * RTEMS seems to require copy up to properly aligned
     128     * boundary at the beginning of the buffer?
     129     */
     130    memmove ( ifr, len + (char *) ifr, ifc.ifc_len );
    110131        }
    111132        if (gotit == 0 && loopback == 0) {
     133    free ( ifc.ifc_buf );
    112134                loopback = 1;
    113135                goto again;
    114136        }
    115137        (void)_RPC_close(s);
     138  free ( ifc.ifc_buf );
    116139        return (gotit ? 0 : -1);
    117140}
Note: See TracChangeset for help on using the changeset viewer.