VirtualBox

Ignore:
Timestamp:
Nov 11, 2019 10:23:37 PM (5 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
134575
Message:

NAT/Network: On Linux a socket returned by accept(2) does not inherit
socket options from the listening sockets. Fix it up to make it
non-blocking.

Location:
trunk/src/VBox/NetworkServices/NAT
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/NetworkServices/NAT/fwtcp.c

    r76553 r81784  
    239239    }
    240240
     241#ifdef RT_OS_LINUX
     242    status = proxy_fixup_accepted_socket(newsock);
     243    if (status < 0) {
     244        proxy_reset_socket(newsock);
     245        return POLLIN;
     246    }
     247#endif
    241248
    242249    if (ss.ss_family == PF_INET) {
  • trunk/src/VBox/NetworkServices/NAT/proxy.c

    r76553 r81784  
    410410    return s;
    411411}
     412
     413
     414#ifdef RT_OS_LINUX
     415/**
     416 * Fixup a socket returned by accept(2).
     417 *
     418 * On Linux a socket returned by accept(2) does NOT inherit the socket
     419 * options from the listening socket!  We need to repeat parts of the
     420 * song and dance we did above to make it non-blocking.
     421 */
     422int
     423proxy_fixup_accepted_socket(SOCKET s)
     424{
     425    int sflags;
     426    int status;
     427
     428    sflags = fcntl(s, F_GETFL, 0);
     429    if (sflags < 0) {
     430        DPRINTF(("F_GETFL: %R[sockerr]\n", SOCKERRNO()));
     431        return -1;
     432    }
     433
     434    status = fcntl(s, F_SETFL, sflags | O_NONBLOCK);
     435    if (status < 0) {
     436        DPRINTF(("O_NONBLOCK: %R[sockerr]\n", SOCKERRNO()));
     437        return -1;
     438    }
     439
     440    return 0;
     441}
     442#endif  /* RT_OS_LINUX */
    412443
    413444
  • trunk/src/VBox/NetworkServices/NAT/proxy.h

    r76576 r81784  
    6868SOCKET proxy_connected_socket(int, int, ipX_addr_t *, u16_t);
    6969SOCKET proxy_bound_socket(int, int, struct sockaddr *);
     70#ifdef RT_OS_LINUX
     71int proxy_fixup_accepted_socket(SOCKET);
     72#endif
    7073void proxy_reset_socket(SOCKET);
    7174int proxy_sendto(SOCKET, struct pbuf *, void *, size_t);
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