Changeset 1863 for zzuf/trunk/src


Ignore:
Timestamp:
Nov 3, 2007, 12:34:22 AM (13 years ago)
Author:
Sam Hocevar
Message:
  • Merged the bind() and connect() diversions using macros. They were almost identical.
  • Check the addrlen value to avoid crashing with weird protocols.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • zzuf/trunk/src/lib-fd.c

    r1862 r1863  
    194194#endif
    195195
     196#if defined AF_INET6
     197#   define case_AF_INET6 case AF_INET6:
     198#else
     199#   define case_AF_INET6
     200#endif
     201
     202#define CONNECTION(fn, addr) \
     203    do \
     204    { \
     205        LOADSYM(fn); \
     206        ret = ORIG(fn)(sockfd, addr, addrlen); \
     207        if(!_zz_ready || _zz_islocked(-1) || !_zz_network) \
     208            return ret; \
     209        if(ret >= 0) \
     210        { \
     211            const struct sockaddr_in* in = (const struct sockaddr_in *)addr; \
     212            long int port; \
     213            switch(addr->sa_family) \
     214            { \
     215            case AF_UNSPEC: \
     216                if(addrlen < sizeof(struct sockaddr_in)) \
     217                    break; \
     218                /* Fall through */ \
     219            case AF_INET: \
     220            case_AF_INET6 \
     221                port = ntohs(in->sin_port); \
     222                if(!_zz_portwatched(port)) \
     223                { \
     224                    _zz_unregister(sockfd); \
     225                    return ret; \
     226                } \
     227                break; \
     228            default: \
     229                break; \
     230            } \
     231            debug("%s(%i, %p, %i) = %i", __func__, \
     232                  sockfd, addr, (int)addrlen, ret); \
     233        } \
     234    } while(0);
     235
    196236#if defined HAVE_BIND
    197237int NEW(bind)(int sockfd, const struct sockaddr *my_addr, SOCKLEN_T addrlen)
    198238{
    199     int ret;
    200 
    201     LOADSYM(bind);
    202     ret = ORIG(bind)(sockfd, my_addr, addrlen);
    203     if(!_zz_ready || _zz_islocked(-1) || !_zz_network)
    204         return ret;
    205 
    206     if(ret >= 0)
    207     {
    208         const struct sockaddr_in* in = (const struct sockaddr_in *)my_addr;
    209         long int port;
    210 
    211         switch(my_addr->sa_family)
    212         {
    213         case AF_INET:
    214 #if defined AF_INET6
    215         case AF_INET6:
    216 #endif
    217         case AF_UNSPEC:
    218             port = ntohs(in->sin_port);
    219             if(!_zz_portwatched(port))
    220             {
    221                 _zz_unregister(sockfd);
    222                 return ret;
    223             }
    224             break;
    225         default:
    226             break;
    227         }
    228 
    229         debug("%s(%i, %p, %i) = %i", __func__,
    230               sockfd, my_addr, (int)addrlen, ret);
    231     }
    232 
    233     return ret;
     239    int ret; CONNECTION(bind, my_addr); return ret;
    234240}
    235241#endif
     
    239245                 SOCKLEN_T addrlen)
    240246{
    241     int ret;
    242 
    243     LOADSYM(connect);
    244     ret = ORIG(connect)(sockfd, serv_addr, addrlen);
    245     if(!_zz_ready || _zz_islocked(-1) || !_zz_network)
    246         return ret;
    247 
    248     if(ret >= 0)
    249     {
    250         const struct sockaddr_in* in = (const struct sockaddr_in *)serv_addr;
    251         long int port;
    252 
    253         switch(serv_addr->sa_family)
    254         {
    255         case AF_INET:
    256 #if defined AF_INET6
    257         case AF_INET6:
    258 #endif
    259         case AF_UNSPEC:
    260             port = ntohs(in->sin_port);
    261             if(!_zz_portwatched(port))
    262             {
    263                 _zz_unregister(sockfd);
    264                 return ret;
    265             }
    266             break;
    267         default:
    268             break;
    269         }
    270 
    271         debug("%s(%i, %p, %i) = %i", __func__,
    272               sockfd, serv_addr, (int)addrlen, ret);
    273     }
    274 
    275     return ret;
     247    int ret; CONNECTION(connect, serv_addr); return ret;
    276248}
    277249#endif
Note: See TracChangeset for help on using the changeset viewer.