VirtualBox

Changeset 38905 in vbox for trunk/src/VBox/Devices


Ignore:
Timestamp:
Sep 30, 2011 2:33:47 AM (14 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
74241
Message:

NAT: clean up. Fix vbox/9371. before processing response from ICMP API
checking of the valideness of the returned pointer was added.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/Network/slirp/socket.c

    r38402 r38905  
    13531353    ICMP_ECHO_REPLY *icr;
    13541354    int hlen = 0;
    1355     int data_len = 0;
    13561355    int nbytes = 0;
    13571356    u_char code = ~0;
     
    13711370    for (i = 0; i < len; ++i)
    13721371    {
     1372        LogFunc(("icr[%d] Data:%p, DataSize:%d\n",
     1373                 i, icr[i].Data, icr[i].DataSize));
    13731374        switch(icr[i].Status)
    13741375        {
     
    14011402
    14021403                m = m_getjcl(pData, M_NOWAIT, MT_HEADER, M_PKTHDR, size);
     1404                LogFunc(("m_getjcl returns m: %p\n", m));
    14031405                if (m == NULL)
    14041406                    return;
    14051407                m->m_len = 0;
    14061408                m->m_data += if_maxlinkhdr;
     1409                m->m_pkthdr.header = mtod(m, void *);
     1410
    14071411                ip = mtod(m, struct ip *);
    14081412                ip->ip_src.s_addr = icr[i].Address;
    14091413                ip->ip_p = IPPROTO_ICMP;
    14101414                ip->ip_dst.s_addr = so->so_laddr.s_addr; /*XXX: still the hack*/
    1411                 data_len = sizeof(struct ip);
    1412                 ip->ip_hl =  data_len >> 2; /* requiered for icmp_reflect, no IP options */
     1415                ip->ip_hl =  sizeof(struct ip) >> 2; /* requiered for icmp_reflect, no IP options */
    14131416                ip->ip_ttl = icr[i].Options.Ttl;
    14141417
     
    14281431                }
    14291432
    1430                 data_len += ICMP_MINLEN;
    14311433
    14321434                hlen = (ip->ip_hl << 2);
    1433                 m->m_pkthdr.header = mtod(m, void *);
    1434                 m->m_len = data_len;
    1435 
    1436                 m_copyback(pData, m, hlen + 8, icr[i].DataSize, icr[i].Data);
    1437 
    1438                 data_len += icr[i].DataSize;
    1439 
    1440                 ip->ip_len = data_len;
    1441                 m->m_len = ip->ip_len;
     1435                Assert((hlen >= sizeof(struct ip)));
     1436
     1437                m->m_data += hlen + ICMP_MINLEN;
     1438                if (!RT_VALID_PTR(icr[i].Data))
     1439                {
     1440                    m_freem(pData, m);
     1441                    break;
     1442                }
     1443                m_copyback(pData, m, 0, icr[i].DataSize, icr[i].Data);
     1444                m->m_data -= hlen + ICMP_MINLEN;
     1445                m->m_len += hlen + ICMP_MINLEN;
     1446
     1447
     1448                ip->ip_len = m_length(m, NULL);
     1449                Assert((ip->ip_len == hlen + ICMP_MINLEN + icr[i].DataSize));
    14421450
    14431451                icmp_reflect(pData, m);
     
    14531461                m = icm->im_m;
    14541462                ip = mtod(m, struct ip *);
     1463                Assert(((ip_broken->ip_hl >> 2) >= sizeof(struct ip)));
    14551464                ip->ip_ttl = icr[i].Options.Ttl;
    14561465                src = ip->ip_src.s_addr;
     
    14611470                icp = (struct icmp *)((char *)ip + hlen);
    14621471                ip_broken->ip_src.s_addr = src; /*it packet sent from host not from guest*/
    1463                 data_len = (ip_broken->ip_hl << 2) + 64;
    1464 
    1465                 m->m_len = data_len;
     1472
     1473                m->m_len = (ip_broken->ip_hl << 2) + 64;
    14661474                m->m_pkthdr.header = mtod(m, void *);
    14671475                m_copyback(pData, m, ip->ip_hl >> 2, icr[i].DataSize, icr[i].Data);
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette