VirtualBox

Ignore:
Timestamp:
Sep 24, 2019 3:31:55 PM (6 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
133573
Message:

NAT: Make sure tftpSendError() always terminate the session.

Location:
trunk/src/VBox/Devices/Network/slirp
Files:
2 edited

Legend:

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

    r76553 r80980  
    529529}
    530530
    531 static inline struct mbuf *slirpTftpMbufAlloc(PNATState pData)
    532 {
    533     return slirpServiceMbufAlloc(pData, CTL_TFTP);
    534 }
    535531static inline struct mbuf *slirpDnsMbufAlloc(PNATState pData)
    536532{
  • trunk/src/VBox/Devices/Network/slirp/tftp.c

    r80585 r80980  
    124124};
    125125
     126
     127DECLINLINE(struct mbuf *) slirpTftpMbufAlloc(PNATState pData)
     128{
     129    struct mbuf *m = slirpServiceMbufAlloc(pData, CTL_TFTP);
     130    if (RT_UNLIKELY(m == NULL))
     131        LogFlowFunc(("LEAVE: Can't allocate mbuf\n"));
     132    return m;
     133}
     134
     135
    126136/**
    127137 * This function evaluate file name.
     
    636646}
    637647
     648
    638649DECLINLINE(int) tftpSendError(PNATState pData,
    639650                              PTFTPSESSION pTftpSession,
     
    643654{
    644655    struct mbuf *m = NULL;
    645     PTFTPIPHDR pTftpIpHeader = NULL;
    646     u_int cbMsg = (u_int)strlen(msg) + 1; /* ending zero */
    647656
    648657    LogFlowFunc(("ENTER: errorcode: %RX16, msg: %s\n", errorcode, msg));
    649658    m = slirpTftpMbufAlloc(pData);
    650     if (!m)
    651     {
    652         LogFlowFunc(("LEAVE: Can't allocate mbuf\n"));
    653         return -1;
    654     }
    655 
    656     m->m_data += if_maxlinkhdr;
    657     m->m_len = sizeof(TFTPIPHDR) + cbMsg;
    658     m->m_pkthdr.header = mtod(m, void *);
    659     pTftpIpHeader = mtod(m, PTFTPIPHDR);
    660 
    661     pTftpIpHeader->u16TftpOpType = RT_H2N_U16_C(TFTP_ERROR);
    662     pTftpIpHeader->Core.u16TftpOpCode = RT_H2N_U16(errorcode);
    663 
    664     m_copyback(pData, m, sizeof(TFTPIPHDR), cbMsg, (c_caddr_t)msg);
    665 
    666     tftpSend(pData, pTftpSession, m, pcTftpIpHeaderRecv);
     659    if (m != NULL)
     660    {
     661        u_int cbMsg = (u_int)strlen(msg) + 1; /* ending zero */
     662        PTFTPIPHDR pTftpIpHeader;
     663
     664        m->m_data += if_maxlinkhdr;
     665        m->m_len = sizeof(TFTPIPHDR) + cbMsg;
     666        m->m_pkthdr.header = mtod(m, void *);
     667        pTftpIpHeader = mtod(m, PTFTPIPHDR);
     668
     669        pTftpIpHeader->u16TftpOpType = RT_H2N_U16_C(TFTP_ERROR);
     670        pTftpIpHeader->Core.u16TftpOpCode = RT_H2N_U16(errorcode);
     671
     672        m_copyback(pData, m, sizeof(TFTPIPHDR), cbMsg, (c_caddr_t)msg);
     673
     674        tftpSend(pData, pTftpSession, m, pcTftpIpHeaderRecv);
     675    }
    667676
    668677    tftpSessionTerminate(pTftpSession);
     
    671680    return 0;
    672681}
     682
    673683
    674684static int tftpSendData(PNATState pData,
     
    687697    {
    688698        tftpSendError(pData, pTftpSession, 6, "ACK is wrong", pcTftpIpHeaderRecv);
    689         tftpSessionTerminate(pTftpSession);
    690699        return -1;
    691700    }
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