Changeset 1863


Ignore:
Timestamp:
11/03/07 00:34:22 (6 years ago)
Author:
sam
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.