X-Git-Url: https://git.rohieb.name/openwrt.git/blobdiff_plain/6e21adc1e02f89e8b7fd58dd25fed12c35f31caf..502d6255c81bbbfa76c6fc153d2c57351ee85d32:/package/uhttpd/src/uhttpd.c diff --git a/package/uhttpd/src/uhttpd.c b/package/uhttpd/src/uhttpd.c index 1fd21344f..3563d91d1 100644 --- a/package/uhttpd/src/uhttpd.c +++ b/package/uhttpd/src/uhttpd.c @@ -512,7 +512,22 @@ static void uh_mainloop(struct config *conf, fd_set serv_fds, int max_fd) #ifdef HAVE_TLS /* setup client tls context */ if( conf->tls ) - conf->tls_accept(cl); + { + if( conf->tls_accept(cl) < 1 ) + { + fprintf(stderr, + "tls_accept failed, " + "connection dropped\n"); + + /* close client socket */ + close(new_fd); + + /* remove from global client list */ + uh_client_remove(new_fd); + + continue; + } + } #endif /* add client socket to global fdset */ @@ -620,6 +635,56 @@ static void uh_mainloop(struct config *conf, fd_set serv_fds, int max_fd) #endif } +#ifdef HAVE_TLS +static inline int uh_inittls(struct config *conf) +{ + /* library handle */ + void *lib; + + /* already loaded */ + if( conf->tls != NULL ) + return 0; + + /* load TLS plugin */ + if( ! (lib = dlopen("uhttpd_tls.so", RTLD_LAZY | RTLD_GLOBAL)) ) + { + fprintf(stderr, + "Notice: Unable to load TLS plugin - disabling SSL support! " + "(Reason: %s)\n", dlerror() + ); + + return 1; + } + else + { + /* resolve functions */ + if( !(conf->tls_init = dlsym(lib, "uh_tls_ctx_init")) || + !(conf->tls_cert = dlsym(lib, "uh_tls_ctx_cert")) || + !(conf->tls_key = dlsym(lib, "uh_tls_ctx_key")) || + !(conf->tls_free = dlsym(lib, "uh_tls_ctx_free")) || + !(conf->tls_accept = dlsym(lib, "uh_tls_client_accept")) || + !(conf->tls_close = dlsym(lib, "uh_tls_client_close")) || + !(conf->tls_recv = dlsym(lib, "uh_tls_client_recv")) || + !(conf->tls_send = dlsym(lib, "uh_tls_client_send")) + ) { + fprintf(stderr, + "Error: Failed to lookup required symbols " + "in TLS plugin: %s\n", dlerror() + ); + exit(1); + } + + /* init SSL context */ + if( ! (conf->tls = conf->tls_init()) ) + { + fprintf(stderr, "Error: Failed to initalize SSL context\n"); + exit(1); + } + } + + return 0; +} +#endif int main (int argc, char **argv) { @@ -650,7 +715,7 @@ int main (int argc, char **argv) char bind[128]; char *port = NULL; -#if defined(HAVE_TLS) || defined(HAVE_LUA) +#ifdef HAVE_LUA /* library handle */ void *lib; #endif @@ -686,42 +751,6 @@ int main (int argc, char **argv) memset(&conf, 0, sizeof(conf)); memset(bind, 0, sizeof(bind)); -#ifdef HAVE_TLS - /* load TLS plugin */ - if( ! (lib = dlopen("uhttpd_tls.so", RTLD_LAZY | RTLD_GLOBAL)) ) - { - fprintf(stderr, - "Notice: Unable to load TLS plugin - disabling SSL support! " - "(Reason: %s)\n", dlerror() - ); - } - else - { - /* resolve functions */ - if( !(conf.tls_init = dlsym(lib, "uh_tls_ctx_init")) || - !(conf.tls_cert = dlsym(lib, "uh_tls_ctx_cert")) || - !(conf.tls_key = dlsym(lib, "uh_tls_ctx_key")) || - !(conf.tls_free = dlsym(lib, "uh_tls_ctx_free")) || - !(conf.tls_accept = dlsym(lib, "uh_tls_client_accept")) || - !(conf.tls_close = dlsym(lib, "uh_tls_client_close")) || - !(conf.tls_recv = dlsym(lib, "uh_tls_client_recv")) || - !(conf.tls_send = dlsym(lib, "uh_tls_client_send")) - ) { - fprintf(stderr, - "Error: Failed to lookup required symbols " - "in TLS plugin: %s\n", dlerror() - ); - exit(1); - } - - /* init SSL context */ - if( ! (conf.tls = conf.tls_init()) ) - { - fprintf(stderr, "Error: Failed to initalize SSL context\n"); - exit(1); - } - } -#endif while( (opt = getopt(argc, argv, "fSDRC:K:E:I:p:s:h:c:l:L:d:r:m:x:i:t:T:A:")) > 0 @@ -750,7 +779,7 @@ int main (int argc, char **argv) #ifdef HAVE_TLS if( opt == 's' ) { - if( !conf.tls ) + if( uh_inittls(&conf) ) { fprintf(stderr, "Notice: TLS support is disabled, " @@ -775,7 +804,7 @@ int main (int argc, char **argv) #ifdef HAVE_TLS /* certificate */ case 'C': - if( conf.tls ) + if( !uh_inittls(&conf) ) { if( conf.tls_cert(conf.tls, optarg) < 1 ) { @@ -791,7 +820,7 @@ int main (int argc, char **argv) /* key */ case 'K': - if( conf.tls ) + if( !uh_inittls(&conf) ) { if( conf.tls_key(conf.tls, optarg) < 1 ) { @@ -912,8 +941,14 @@ int main (int argc, char **argv) case 'd': if( (port = malloc(strlen(optarg)+1)) != NULL ) { + /* "decode" plus to space to retain compat */ + for (opt = 0; optarg[opt]; opt++) + if (optarg[opt] == '+') + optarg[opt] = ' '; + memset(port, 0, strlen(optarg)+1); uh_urldecode(port, strlen(optarg), optarg, strlen(optarg)); + printf("%s", port); free(port); exit(0);