VirtualBox

Changeset 23241 in vbox for trunk


Ignore:
Timestamp:
Sep 23, 2009 3:15:55 AM (15 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
52715
Message:

NAT: do UDP/ICMP errno analisys.

File:
1 edited

Legend:

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

    r23178 r23241  
    542542sorecvfrom(PNATState pData, struct socket *so)
    543543{
     544    ssize_t ret = 0;
    544545    struct sockaddr_in addr;
    545546    socklen_t addrlen = sizeof(struct sockaddr_in);
     
    568569        int size;
    569570#endif
    570         int rc = 0;
     571            int rc = 0;
    571572        static int signaled = 0;
    572573
     
    592593        {
    593594            rc = ioctlsocket(so->s, FIONREAD, &n);
    594            
     595            if (   (rc == -1)
     596                && (errno == EAGAIN
     597                   || errno == EWOULDBLOCK
     598                   || errno == EINPROGRESS
     599                   || errno == ENOTCONN))
     600            {
     601                m_free(pData, m);
     602                return;
     603            }
    595604            if (rc == -1 && signaled == 0)
    596605            {
    597606                LogRel(("NAT: can't fetch amount of bytes on socket %R[natsock], so message will be truncated.\n", so));
    598607                signaled = 1;
     608                m_free(pData, m);
     609                return;
    599610            }
    600611
     
    606617            }
    607618        }
    608         m->m_len = recvfrom(so->s, m->m_data, len, 0,
     619        ret = recvfrom(so->s, m->m_data, len, 0,
    609620                            (struct sockaddr *)&addr, &addrlen);
    610621        Log2((" did recvfrom %d, errno = %d-%s\n",
     
    652663        m->m_pkthdr.header = mtod(m, void *);
    653664        m->m_data += sizeof(struct udpiphdr);
    654         len = recvfrom(so->s, mtod(m, char *), n, 0,
     665        ret = recvfrom(so->s, mtod(m, char *), n, 0,
    655666                            (struct sockaddr *)&addr, &addrlen);
    656         m->m_len = len;
    657667        /* @todo (r=vvl) check which flags and type should be passed */
    658668#endif
    659         if(len < 0)
     669        m->m_len = ret;
     670        if(ret < 0)
    660671        {
    661672            u_char code = ICMP_UNREACH_PORT;
     
    666677                code = ICMP_UNREACH_NET;
    667678
    668             Log2((dfd," rx error, tx icmp ICMP_UNREACH:%i\n", code));
     679            m_free(pData, m);
     680            if (   errno == EAGAIN
     681                || errno == EWOULDBLOCK
     682                || errno == EINPROGRESS
     683                || errno == ENOTCONN)
     684            {
     685                return;
     686            }
     687
     688            Log2((" rx error, tx icmp ICMP_UNREACH:%i\n", code));
    669689            icmp_error(pData, so->so_m, ICMP_UNREACH, code, 0, strerror(errno));
    670690            so->so_m = NULL;
    671             m_free(pData, m);
    672691        }
    673692        else
     
    12531272    static int signalled = 0;
    12541273    rc = ioctlsocket(so->s, FIONREAD, &len);
    1255     if (rc != -1 && signalled == 0)
     1274    if (   rc == -1
     1275        && (errno == EAGAIN
     1276        || errno == EWOULDBLOCK
     1277        || errno == EINPROGRESS
     1278        || errno == ENOTCONN))
     1279    {
     1280        return;
     1281    }
     1282    if (rc == -1 && signalled == 0)
    12561283    {
    12571284        signalled = 1;
    1258         LogRel(("NAT: fetching number of bits has been failed for ICMP socket \n"));
     1285        LogRel(("NAT: fetching number of bits has been failed for ICMP socket (%d: %s)\n",
     1286            errno, strerror(errno)));
     1287        return;
    12591288    }
    12601289    len = (len != 0 && rc != -1 ? len : 1500);
     
    12661295    if (len == -1 || len == 0)
    12671296    {
    1268         u_char code = ICMP_UNREACH_PORT;
     1297        u_char code;
     1298        if (   len == -1
     1299            && (errno == EAGAIN
     1300            || errno == EWOULDBLOCK
     1301            || errno == EINPROGRESS
     1302            || errno == ENOTCONN))
     1303        {
     1304            return;
     1305        }
     1306        code = ICMP_UNREACH_PORT;
    12691307
    12701308        if (errno == EHOSTUNREACH)
     
    12731311            code = ICMP_UNREACH_NET;
    12741312
    1275         DEBUG_MISC((dfd," udp icmp rx errno = %d-%s\n",
     1313        LogRel((" udp icmp rx errno = %d-%s\n",
    12761314                    errno, strerror(errno)));
    12771315        icmp_error(pData, so->so_m, ICMP_UNREACH, code, 0, strerror(errno));
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