Changeset 3676


Ignore:
Timestamp:
Mar 14, 2011, 6:37:38 PM (14 years ago)
Author:
bird
Message:

0.6: Backporting r3674 - part 2. Fixes #233.

Location:
branches/libc-0.6/src/emx/src/libsocket
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • branches/libc-0.6/src/emx/src/libsocket/accept.c

    r1454 r3676  
    4747    if (pFHSocket)
    4848    {
    49         s = __libsocket_accept(pFHSocket->iSocket, addr, addrlen);
    50         if (s >= 0)
     49        __LIBSOCKET_SAFEADDR SafeAddr;
     50        if (__libsocket_safe_addr_pre(addr, addrlen, &SafeAddr) == 0)
    5151        {
    52             int             fh;
    53             PLIBCSOCKETFH   pFH = TCPNAMEG(AllocFH)(s, &fh);
    54             if (pFH)
    55                 LIBCLOG_RETURN_INT(fh);
     52            s = __libsocket_accept(pFHSocket->iSocket, SafeAddr.pAddr, SafeAddr.pcbAddr);
     53            if (s >= 0)
     54            {
     55                if (__libsocket_safe_addr_post(addr, addrlen, &SafeAddr, 1) == 0)
     56                {
     57                    int             fh;
     58                    PLIBCSOCKETFH   pFH = TCPNAMEG(AllocFH)(s, &fh);
     59                    if (pFH)
     60                        LIBCLOG_RETURN_INT(fh);
     61                   
     62                    __libsocket_soclose(s);
     63                    __libc_TcpipSetSocketErrno();
     64                }       
     65                else
     66                    __libsocket_soclose(s);
     67            }
    5668            else
    57                 __libsocket_soclose(s);
    58             __libc_TcpipSetSocketErrno();
     69            {
     70                __libc_TcpipUpdateErrno();
     71                __libsocket_safe_addr_post(addr, addrlen, &SafeAddr, 0);
     72            }
    5973        }
    60         else
    61             __libc_TcpipUpdateErrno();
    6274    }
    63 
    6475    LIBCLOG_RETURN_INT(-1);
    6576}
  • branches/libc-0.6/src/emx/src/libsocket/bind.c

    r1454 r3676  
    4040{
    4141    LIBCLOG_ENTER("socket=%d addr=%p addrlen=%d\n", socket, addr, addrlen);
     42    int             rc = -1;
    4243    PLIBCSOCKETFH   pFHSocket = __libc_TcpipFH(socket);
    4344    if (pFHSocket)
    4445    {
    45         int rc;
    46         rc = __libsocket_bind(pFHSocket->iSocket, addr, addrlen);
    47         if (rc >= 0)
    48             LIBCLOG_RETURN_INT(rc);
    49         __libc_TcpipUpdateErrno();
     46        __LIBSOCKET_SAFEADDR SafeAddr;
     47        if (__libsocket_safe_addr_pre(addr, &addrlen, &SafeAddr) == 0)
     48        {
     49            rc = __libsocket_bind(pFHSocket->iSocket, SafeAddr.pAddr, addrlen);
     50            if (rc < 0)
     51                __libc_TcpipUpdateErrno();
     52            __libsocket_safe_addr_free(&SafeAddr);
     53        }
    5054    }
    51 
    52     LIBCLOG_RETURN_INT(-1);
     55    LIBCLOG_RETURN_INT(rc);
    5356}
    5457
  • branches/libc-0.6/src/emx/src/libsocket/connect.c

    r1454 r3676  
    4444    {
    4545        int rc;
    46         rc = __libsocket_connect(pFHSocket->iSocket, addr, addrlen);
    47         if (rc >= 0)
    48             LIBCLOG_RETURN_INT(rc);
    49         __libc_TcpipUpdateErrno();
     46        __LIBSOCKET_SAFEADDR SafeAddr;
     47        if (__libsocket_safe_addr_pre(addr, &addrlen, &SafeAddr) == 0)
     48        {
     49            rc = __libsocket_connect(pFHSocket->iSocket, SafeAddr.pAddr, addrlen);
     50            __libsocket_safe_addr_free(&SafeAddr);
     51            if (rc >= 0)
     52                LIBCLOG_RETURN_INT(rc);
     53            __libc_TcpipUpdateErrno();
     54        }
    5055    }
    5156
  • branches/libc-0.6/src/emx/src/libsocket/getpeername.c

    r1517 r3676  
    4040{
    4141    LIBCLOG_ENTER("socket=%d addr=%p addrlen=%p\n", socket, (void *)addr, (void *)addrlen);
     42    int             rc        = -1;
    4243    PLIBCSOCKETFH   pFHSocket = __libc_TcpipFH(socket);
    4344    if (pFHSocket)
    4445    {
    45         int rc;
    46         rc = __libsocket_getpeername(pFHSocket->iSocket, addr, addrlen);
    47         if (rc >= 0)
    48             LIBCLOG_RETURN_INT(rc);
    49         __libc_TcpipUpdateErrno();
     46        __LIBSOCKET_SAFEADDR SafeAddr;
     47        if (__libsocket_safe_addr_pre(addr, addrlen, &SafeAddr) == 0)
     48        {
     49            rc = __libsocket_getpeername(pFHSocket->iSocket, SafeAddr.pAddr, SafeAddr.pcbAddr);
     50            if (rc < 0)
     51                __libc_TcpipUpdateErrno();
     52            if (__libsocket_safe_addr_post(addr, addrlen, &SafeAddr, rc >= 0) != 0)
     53                rc = -1;
     54        }
    5055    }
    51 
    5256    LIBCLOG_RETURN_INT(-1);
    5357}
  • branches/libc-0.6/src/emx/src/libsocket/getsockname.c

    r1517 r3676  
    3636#include <InnoTekLIBC/logstrict.h>
    3737#include "socket.h"
     38   
    3839
    3940int getsockname(int socket, struct sockaddr *addr, int *addrlen)
    4041{
    4142    LIBCLOG_ENTER("socket=%d addr=%p addrlen=%p\n", socket, (void *)addr, (void *)addrlen);
     43    int             rc        = -1;
    4244    PLIBCSOCKETFH   pFHSocket = __libc_TcpipFH(socket);
    4345    if (pFHSocket)
    4446    {
    45         int rc;
    46         rc = __libsocket_getsockname(pFHSocket->iSocket, addr, addrlen);
    47         if (rc >= 0)
    48             LIBCLOG_RETURN_INT(rc);
    49         __libc_TcpipUpdateErrno();
     47        __LIBSOCKET_SAFEADDR SafeAddr;
     48        if (__libsocket_safe_addr_pre(addr, addrlen, &SafeAddr) == 0)
     49        {
     50            rc = __libsocket_getsockname(pFHSocket->iSocket, SafeAddr.pAddr, SafeAddr.pcbAddr);
     51            if (rc < 0)
     52                __libc_TcpipUpdateErrno();
     53            if (__libsocket_safe_addr_post(addr, addrlen, &SafeAddr, rc >= 0) != 0)
     54                rc = -1;
     55        }
    5056    }
    5157
    52     LIBCLOG_RETURN_INT(-1);
     58    LIBCLOG_RETURN_INT(rc);
    5359}
    5460
    55 
  • branches/libc-0.6/src/emx/src/libsocket/socket.h

    r1454 r3676  
    3434#endif
    3535
     36struct sockaddr;
     37                                                                     
     38/**
     39 * Safe socket address state info.
     40 */
     41typedef struct __LIBSOCKET_SAFEADDR
     42{
     43    /** What to feed the API. */
     44    struct sockaddr    *pAddr;
     45    /** What to feed the API. */
     46    int                *pcbAddr;
     47
     48    /** Bounce buffer storage of the address length. */
     49    int                 cbAddr;
     50    /** The input address length value */
     51    int                 cbAlloc;
     52    /** The address structure if bouncing was needed, NULL if none of the two
     53     * parameters was in high memory. */
     54    void               *pvFree;
     55} __LIBSOCKET_SAFEADDR;         
     56
     57
     58int __libsocket_safe_copy(void *pvDst, void const *pvSrc, size_t cbCopy);
     59int __libsocket_safe_addr_pre(const struct sockaddr *pAddr, const int *pcbAddr, __LIBSOCKET_SAFEADDR *pSafeAddr);
     60int __libsocket_safe_addr_post(struct sockaddr *pAddr, int *pcbAddr, __LIBSOCKET_SAFEADDR *pSafeAddr, int fSuccess);
     61void __libsocket_safe_addr_free(__LIBSOCKET_SAFEADDR *pSafeAddr);
     62
    3663#endif
Note: See TracChangeset for help on using the changeset viewer.