Changeset 24952


Ignore:
Timestamp:
2011-01-10T00:35:45+01:00 (7 years ago)
Author:
jow
Message:

[package] uhttpd: protect tcp receive operations with select, make tcp keep-alive optional (#8272)

Location:
trunk/package/uhttpd
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/package/uhttpd/Makefile

    r24823 r24952  
    99 
    1010PKG_NAME:=uhttpd 
    11 PKG_RELEASE:=20 
     11PKG_RELEASE:=21 
    1212 
    1313PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME) 
  • trunk/package/uhttpd/files/uhttpd.config

    r22630 r24952  
    5252        option network_timeout  30 
    5353 
     54        # TCP Keep-Alive, send periodic keep-alive probes 
     55        # over established connections to detect dead peers. 
     56        # The value is given in seconds to specify the 
     57        # interval between subsequent probes. 
     58        # Setting this to 0 will disable TCP keep-alive. 
     59        option tcp_keepalive    1 
     60 
    5461        # Basic auth realm, defaults to local hostname 
    5562#       option realm    OpenWrt 
  • trunk/package/uhttpd/files/uhttpd.init

    r22630 r24952  
    6767        append_arg "$cfg" script_timeout "-t" 
    6868        append_arg "$cfg" network_timeout "-T" 
     69        append_arg "$cfg" tcp_keepalive "-A" 
    6970        append_arg "$cfg" error_page "-E" 
    7071        append_arg "$cfg" index_page "-I" 
  • trunk/package/uhttpd/src/uhttpd-utils.c

    r23952 r24952  
    168168        int rsz = 0; 
    169169 
     170        fd_set reader; 
     171        struct timeval timeout; 
     172 
    170173        /* first serve data from peek buffer */ 
    171174        if( cl->peeklen > 0 ) 
     
    181184        if( len > 0 ) 
    182185        { 
     186                FD_ZERO(&reader); 
     187                FD_SET(cl->socket, &reader); 
     188 
     189                timeout.tv_sec  = cl->server->conf->network_timeout; 
     190                timeout.tv_usec = 0; 
     191 
     192                if( select(cl->socket + 1, &reader, NULL, NULL, &timeout) > 0 ) 
     193                { 
    183194#ifdef HAVE_TLS 
    184                 if( cl->tls ) 
    185                         rsz = cl->server->conf->tls_recv(cl, (void *)&buf[sz], len); 
    186                 else 
     195                        if( cl->tls ) 
     196                                rsz = cl->server->conf->tls_recv(cl, (void *)&buf[sz], len); 
     197                        else 
    187198#endif 
    188                         rsz = recv(cl->socket, (void *)&buf[sz], len, 0); 
    189  
    190                 if( (sz == 0) || (rsz > 0) ) 
    191                         sz += rsz; 
     199                                rsz = recv(cl->socket, (void *)&buf[sz], len, 0); 
     200 
     201                        if( (sz == 0) || (rsz > 0) ) 
     202                                sz += rsz; 
     203                } 
     204                else if( sz == 0 ) 
     205                { 
     206                        sz = -1; 
     207                } 
    192208        } 
    193209 
     
    234250        if( len > 0 ) 
    235251        { 
    236                 clen = snprintf(chunk, sizeof(chunk), "%X\r\n", len); 
     252                clen = snprintf(chunk, sizeof(chunk), "%X\r\n", len); 
    237253                ensure_ret(uh_tcp_send(cl, chunk, clen)); 
    238254                ensure_ret(uh_tcp_send(cl, data, len)); 
  • trunk/package/uhttpd/src/uhttpd.c

    r24823 r24952  
    128128        int bound = 0; 
    129129 
    130         int tcp_ka_idl = 1; 
    131         int tcp_ka_int = 1; 
    132         int tcp_ka_cnt = 3; 
     130        int tcp_ka_idl, tcp_ka_int, tcp_ka_cnt; 
    133131 
    134132        struct listener *l = NULL; 
     
    158156 
    159157                /* TCP keep-alive */ 
    160                 if( setsockopt(sock, SOL_SOCKET, SO_KEEPALIVE, &yes, sizeof(yes)) || 
    161                     setsockopt(sock, SOL_TCP, TCP_KEEPIDLE,  &tcp_ka_idl, sizeof(tcp_ka_idl)) || 
    162                     setsockopt(sock, SOL_TCP, TCP_KEEPINTVL, &tcp_ka_int, sizeof(tcp_ka_int)) || 
    163                     setsockopt(sock, SOL_TCP, TCP_KEEPCNT,   &tcp_ka_cnt, sizeof(tcp_ka_cnt)) ) 
    164                 { 
    165                     fprintf(stderr, "Notice: Unable to enable TCP keep-alive: %s\n", 
    166                         strerror(errno)); 
     158                if( conf->tcp_keepalive > 0 ) 
     159                { 
     160                        tcp_ka_idl = 1; 
     161                        tcp_ka_cnt = 3; 
     162                        tcp_ka_int = conf->tcp_keepalive; 
     163 
     164                        if( setsockopt(sock, SOL_SOCKET, SO_KEEPALIVE, &yes, sizeof(yes)) || 
     165                            setsockopt(sock, SOL_TCP, TCP_KEEPIDLE,  &tcp_ka_idl, sizeof(tcp_ka_idl)) || 
     166                            setsockopt(sock, SOL_TCP, TCP_KEEPINTVL, &tcp_ka_int, sizeof(tcp_ka_int)) || 
     167                            setsockopt(sock, SOL_TCP, TCP_KEEPCNT,   &tcp_ka_cnt, sizeof(tcp_ka_cnt)) ) 
     168                        { 
     169                            fprintf(stderr, "Notice: Unable to enable TCP keep-alive: %s\n", 
     170                                strerror(errno)); 
     171                        } 
    167172                } 
    168173 
     
    620625{ 
    621626        /* master file descriptor list */ 
    622         fd_set used_fds, serv_fds, read_fds; 
     627        fd_set serv_fds; 
    623628 
    624629        /* working structs */ 
     
    651656#endif 
    652657 
    653         /* clear the master and temp sets */ 
    654         FD_ZERO(&used_fds); 
    655658        FD_ZERO(&serv_fds); 
    656         FD_ZERO(&read_fds); 
    657659 
    658660        /* handle SIGPIPE, SIGINT, SIGTERM, SIGCHLD */ 
     
    723725 
    724726        while( (opt = getopt(argc, argv, 
    725                 "fSDRC:K:E:I:p:s:h:c:l:L:d:r:m:x:i:t:T:")) > 0 
     727                "fSDRC:K:E:I:p:s:h:c:l:L:d:r:m:x:i:t:T:A:")) > 0 
    726728        ) { 
    727729                switch(opt) 
     
    895897                        case 'T': 
    896898                                conf.network_timeout = atoi(optarg); 
     899                                break; 
     900 
     901                        /* tcp keep-alive */ 
     902                        case 'A': 
     903                                conf.tcp_keepalive = atoi(optarg); 
    897904                                break; 
    898905 
  • trunk/package/uhttpd/src/uhttpd.h

    r22692 r24952  
    7676        int network_timeout; 
    7777        int rfc1918_filter; 
     78        int tcp_keepalive; 
    7879#ifdef HAVE_CGI 
    7980        char *cgi_prefix; 
Note: See TracChangeset for help on using the changeset viewer.