From 33cebeb0f778d437e1a6070504f588b2531fa291 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20B=C3=BChler?= Date: Thu, 14 May 2015 09:38:33 +0000 Subject: [PATCH] fix segfaults in many plugins if they failed configuration MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit From: Stefan Bühler git-svn-id: svn://svn.lighttpd.net/lighttpd/branches/lighttpd-1.4.x@2988 152afb58-edef-0310-8abb-c4023f1b3aa9 --- NEWS | 1 + src/mod_access.c | 2 ++ src/mod_accesslog.c | 2 +- src/mod_alias.c | 2 +- src/mod_auth.c | 2 +- src/mod_cgi.c | 2 ++ src/mod_cml.c | 2 ++ src/mod_compress.c | 2 +- src/mod_evasive.c | 2 ++ src/mod_evhost.c | 2 +- src/mod_expire.c | 3 ++- src/mod_extforward.c | 2 +- src/mod_fastcgi.c | 2 +- src/mod_flv_streaming.c | 2 +- src/mod_indexfile.c | 2 +- src/mod_magnet.c | 2 +- src/mod_proxy.c | 7 +++---- src/mod_redirect.c | 2 ++ src/mod_rewrite.c | 3 +++ src/mod_rrdtool.c | 2 ++ src/mod_scgi.c | 2 +- src/mod_secure_download.c | 2 ++ src/mod_setenv.c | 2 ++ src/mod_skeleton.c | 2 +- src/mod_ssi.c | 2 ++ src/mod_staticfile.c | 2 ++ src/mod_trigger_b4_dl.c | 2 +- src/mod_uploadprogress.c | 2 ++ src/mod_userdir.c | 2 ++ src/mod_usertrack.c | 2 ++ src/mod_webdav.c | 2 +- 31 files changed, 49 insertions(+), 19 deletions(-) diff --git a/NEWS b/NEWS index 4d191447..dd2d1b8e 100644 --- a/NEWS +++ b/NEWS @@ -18,6 +18,7 @@ NEWS * major refactoring of internal buffer/chunk handling * [mod_auth] use crypt_r instead of crypt if available * fix error message for T_CONFIG_ARRAY config values if an entry value is not a string + * fix segfaults in many plugins if they failed configuration - 1.4.35 - 2014-03-12 * [network/ssl] fix build error if TLSEXT is disabled diff --git a/src/mod_access.c b/src/mod_access.c index a6c25a47..e6a9a14f 100644 --- a/src/mod_access.c +++ b/src/mod_access.c @@ -40,6 +40,8 @@ FREE_FUNC(mod_access_free) { for (i = 0; i < srv->config_context->used; i++) { plugin_config *s = p->config_storage[i]; + if (NULL == s) continue; + array_free(s->access_deny); free(s); diff --git a/src/mod_accesslog.c b/src/mod_accesslog.c index 9bb3fe27..f5be7d2f 100644 --- a/src/mod_accesslog.c +++ b/src/mod_accesslog.c @@ -414,7 +414,7 @@ FREE_FUNC(mod_accesslog_free) { for (i = 0; i < srv->config_context->used; i++) { plugin_config *s = p->config_storage[i]; - if (!s) continue; + if (NULL == s) continue; if (!buffer_string_is_empty(s->access_logbuffer)) { if (s->log_access_fd != -1) { diff --git a/src/mod_alias.c b/src/mod_alias.c index 4625973d..f9d7b513 100644 --- a/src/mod_alias.c +++ b/src/mod_alias.c @@ -45,7 +45,7 @@ FREE_FUNC(mod_alias_free) { for (i = 0; i < srv->config_context->used; i++) { plugin_config *s = p->config_storage[i]; - if(!s) continue; + if (NULL == s) continue; array_free(s->alias); diff --git a/src/mod_auth.c b/src/mod_auth.c index 18708936..edddaa80 100644 --- a/src/mod_auth.c +++ b/src/mod_auth.c @@ -60,7 +60,7 @@ FREE_FUNC(mod_auth_free) { for (i = 0; i < srv->config_context->used; i++) { mod_auth_plugin_config *s = p->config_storage[i]; - if (!s) continue; + if (NULL == s) continue; array_free(s->auth_require); buffer_free(s->auth_plain_groupfile); diff --git a/src/mod_cgi.c b/src/mod_cgi.c index 8a7cc2b2..01b1877a 100644 --- a/src/mod_cgi.c +++ b/src/mod_cgi.c @@ -127,6 +127,8 @@ FREE_FUNC(mod_cgi_free) { for (i = 0; i < srv->config_context->used; i++) { plugin_config *s = p->config_storage[i]; + if (NULL == s) continue; + array_free(s->cgi); free(s); diff --git a/src/mod_cml.c b/src/mod_cml.c index baa23b3b..98f8d77e 100644 --- a/src/mod_cml.c +++ b/src/mod_cml.c @@ -43,6 +43,8 @@ FREE_FUNC(mod_cml_free) { for (i = 0; i < srv->config_context->used; i++) { plugin_config *s = p->config_storage[i]; + if (NULL == s) continue; + buffer_free(s->ext); buffer_free(s->mc_namespace); diff --git a/src/mod_compress.c b/src/mod_compress.c index f0ffa1ce..29d5ab53 100644 --- a/src/mod_compress.c +++ b/src/mod_compress.c @@ -90,7 +90,7 @@ FREE_FUNC(mod_compress_free) { for (i = 0; i < srv->config_context->used; i++) { plugin_config *s = p->config_storage[i]; - if (!s) continue; + if (NULL == s) continue; array_free(s->compress); buffer_free(s->compress_cache_dir); diff --git a/src/mod_evasive.c b/src/mod_evasive.c index d9b87329..da45c9a7 100644 --- a/src/mod_evasive.c +++ b/src/mod_evasive.c @@ -58,6 +58,8 @@ FREE_FUNC(mod_evasive_free) { for (i = 0; i < srv->config_context->used; i++) { plugin_config *s = p->config_storage[i]; + if (NULL == s) continue; + free(s); } free(p->config_storage); diff --git a/src/mod_evhost.c b/src/mod_evhost.c index e728551a..3c49adfa 100644 --- a/src/mod_evhost.c +++ b/src/mod_evhost.c @@ -46,7 +46,7 @@ FREE_FUNC(mod_evhost_free) { for (i = 0; i < srv->config_context->used; i++) { plugin_config *s = p->config_storage[i]; - if (!s) continue; + if (NULL == s) continue; if(s->path_pieces) { size_t j; diff --git a/src/mod_expire.c b/src/mod_expire.c index e26c3c63..0794c157 100644 --- a/src/mod_expire.c +++ b/src/mod_expire.c @@ -62,7 +62,8 @@ FREE_FUNC(mod_expire_free) { size_t i; for (i = 0; i < srv->config_context->used; i++) { plugin_config *s = p->config_storage[i]; - if (!s) continue; + + if (NULL == s) continue; array_free(s->expire_url); free(s); diff --git a/src/mod_extforward.c b/src/mod_extforward.c index 7f779822..557c5051 100644 --- a/src/mod_extforward.c +++ b/src/mod_extforward.c @@ -135,7 +135,7 @@ FREE_FUNC(mod_extforward_free) { for (i = 0; i < srv->config_context->used; i++) { plugin_config *s = p->config_storage[i]; - if (!s) continue; + if (NULL == s) continue; array_free(s->forwarder); array_free(s->headers); diff --git a/src/mod_fastcgi.c b/src/mod_fastcgi.c index d16306c8..5be73dfe 100644 --- a/src/mod_fastcgi.c +++ b/src/mod_fastcgi.c @@ -693,7 +693,7 @@ FREE_FUNC(mod_fastcgi_free) { plugin_config *s = p->config_storage[i]; fcgi_exts *exts; - if (!s) continue; + if (NULL == s) continue; exts = s->exts; diff --git a/src/mod_flv_streaming.c b/src/mod_flv_streaming.c index db041e27..6e92c742 100644 --- a/src/mod_flv_streaming.c +++ b/src/mod_flv_streaming.c @@ -54,7 +54,7 @@ FREE_FUNC(mod_flv_streaming_free) { for (i = 0; i < srv->config_context->used; i++) { plugin_config *s = p->config_storage[i]; - if (!s) continue; + if (NULL == s) continue; array_free(s->extensions); diff --git a/src/mod_indexfile.c b/src/mod_indexfile.c index 13d18e25..3c57256a 100644 --- a/src/mod_indexfile.c +++ b/src/mod_indexfile.c @@ -51,7 +51,7 @@ FREE_FUNC(mod_indexfile_free) { for (i = 0; i < srv->config_context->used; i++) { plugin_config *s = p->config_storage[i]; - if (!s) continue; + if (NULL == s) continue; array_free(s->indexfiles); diff --git a/src/mod_magnet.c b/src/mod_magnet.c index 8f89d4e7..0d99fdf9 100644 --- a/src/mod_magnet.c +++ b/src/mod_magnet.c @@ -71,7 +71,7 @@ FREE_FUNC(mod_magnet_free) { for (i = 0; i < srv->config_context->used; i++) { plugin_config *s = p->config_storage[i]; - if (!s) continue; + if (NULL == s) continue; array_free(s->url_raw); array_free(s->physical_path); diff --git a/src/mod_proxy.c b/src/mod_proxy.c index dfdc6361..78210727 100644 --- a/src/mod_proxy.c +++ b/src/mod_proxy.c @@ -167,12 +167,11 @@ FREE_FUNC(mod_proxy_free) { for (i = 0; i < srv->config_context->used; i++) { plugin_config *s = p->config_storage[i]; - if (s) { + if (NULL == s) continue; - array_free(s->extensions); + array_free(s->extensions); - free(s); - } + free(s); } free(p->config_storage); } diff --git a/src/mod_redirect.c b/src/mod_redirect.c index 615c7db0..769c8c8e 100644 --- a/src/mod_redirect.c +++ b/src/mod_redirect.c @@ -47,6 +47,8 @@ FREE_FUNC(mod_redirect_free) { for (i = 0; i < srv->config_context->used; i++) { plugin_config *s = p->config_storage[i]; + if (NULL == s) continue; + pcre_keyvalue_buffer_free(s->redirect); free(s); diff --git a/src/mod_rewrite.c b/src/mod_rewrite.c index 5191a648..113cc549 100644 --- a/src/mod_rewrite.c +++ b/src/mod_rewrite.c @@ -146,6 +146,9 @@ FREE_FUNC(mod_rewrite_free) { size_t i; for (i = 0; i < srv->config_context->used; i++) { plugin_config *s = p->config_storage[i]; + + if (NULL == s) continue; + rewrite_rule_buffer_free(s->rewrite); rewrite_rule_buffer_free(s->rewrite_NF); diff --git a/src/mod_rrdtool.c b/src/mod_rrdtool.c index 0532e4d6..6b8cdaee 100644 --- a/src/mod_rrdtool.c +++ b/src/mod_rrdtool.c @@ -65,6 +65,8 @@ FREE_FUNC(mod_rrd_free) { for (i = 0; i < srv->config_context->used; i++) { plugin_config *s = p->config_storage[i]; + if (NULL == s) continue; + buffer_free(s->path_rrdtool_bin); buffer_free(s->path_rrd); diff --git a/src/mod_scgi.c b/src/mod_scgi.c index 9e88de33..733b51ce 100644 --- a/src/mod_scgi.c +++ b/src/mod_scgi.c @@ -554,7 +554,7 @@ FREE_FUNC(mod_scgi_free) { plugin_config *s = p->config_storage[i]; scgi_exts *exts; - if (!s) continue; + if (NULL == s) continue; exts = s->exts; diff --git a/src/mod_secure_download.c b/src/mod_secure_download.c index da98b61c..d85872d4 100644 --- a/src/mod_secure_download.c +++ b/src/mod_secure_download.c @@ -65,6 +65,8 @@ FREE_FUNC(mod_secdownload_free) { for (i = 0; i < srv->config_context->used; i++) { plugin_config *s = p->config_storage[i]; + if (NULL == s) continue; + buffer_free(s->secret); buffer_free(s->doc_root); buffer_free(s->uri_prefix); diff --git a/src/mod_setenv.c b/src/mod_setenv.c index 60e9b555..34075c13 100644 --- a/src/mod_setenv.c +++ b/src/mod_setenv.c @@ -67,6 +67,8 @@ FREE_FUNC(mod_setenv_free) { for (i = 0; i < srv->config_context->used; i++) { plugin_config *s = p->config_storage[i]; + if (NULL == s) continue; + array_free(s->request_header); array_free(s->response_header); array_free(s->environment); diff --git a/src/mod_skeleton.c b/src/mod_skeleton.c index 68d272d3..8461279d 100644 --- a/src/mod_skeleton.c +++ b/src/mod_skeleton.c @@ -79,7 +79,7 @@ FREE_FUNC(mod_skeleton_free) { for (i = 0; i < srv->config_context->used; i++) { plugin_config *s = p->config_storage[i]; - if (!s) continue; + if (NULL == s) continue; array_free(s->match); diff --git a/src/mod_ssi.c b/src/mod_ssi.c index ed3b75cd..07b695d7 100644 --- a/src/mod_ssi.c +++ b/src/mod_ssi.c @@ -69,6 +69,8 @@ FREE_FUNC(mod_ssi_free) { for (i = 0; i < srv->config_context->used; i++) { plugin_config *s = p->config_storage[i]; + if (NULL == s) continue; + array_free(s->ssi_extension); buffer_free(s->content_type); diff --git a/src/mod_staticfile.c b/src/mod_staticfile.c index d40aa31b..22929bb1 100644 --- a/src/mod_staticfile.c +++ b/src/mod_staticfile.c @@ -63,6 +63,8 @@ FREE_FUNC(mod_staticfile_free) { for (i = 0; i < srv->config_context->used; i++) { plugin_config *s = p->config_storage[i]; + if (NULL == s) continue; + array_free(s->exclude_ext); free(s); diff --git a/src/mod_trigger_b4_dl.c b/src/mod_trigger_b4_dl.c index e1fa9934..4a3eac24 100644 --- a/src/mod_trigger_b4_dl.c +++ b/src/mod_trigger_b4_dl.c @@ -89,7 +89,7 @@ FREE_FUNC(mod_trigger_b4_dl_free) { for (i = 0; i < srv->config_context->used; i++) { plugin_config *s = p->config_storage[i]; - if (!s) continue; + if (NULL == s) continue; buffer_free(s->db_filename); buffer_free(s->download_url); diff --git a/src/mod_uploadprogress.c b/src/mod_uploadprogress.c index 25d08c2c..ce7cc69c 100644 --- a/src/mod_uploadprogress.c +++ b/src/mod_uploadprogress.c @@ -174,6 +174,8 @@ FREE_FUNC(mod_uploadprogress_free) { for (i = 0; i < srv->config_context->used; i++) { plugin_config *s = p->config_storage[i]; + if (NULL == s) continue; + buffer_free(s->progress_url); free(s); diff --git a/src/mod_userdir.c b/src/mod_userdir.c index 682f9500..f6f1d8ac 100644 --- a/src/mod_userdir.c +++ b/src/mod_userdir.c @@ -60,6 +60,8 @@ FREE_FUNC(mod_userdir_free) { for (i = 0; i < srv->config_context->used; i++) { plugin_config *s = p->config_storage[i]; + if (NULL == s) continue; + array_free(s->include_user); array_free(s->exclude_user); buffer_free(s->path); diff --git a/src/mod_usertrack.c b/src/mod_usertrack.c index 11aad95c..3adedcfd 100644 --- a/src/mod_usertrack.c +++ b/src/mod_usertrack.c @@ -48,6 +48,8 @@ FREE_FUNC(mod_usertrack_free) { for (i = 0; i < srv->config_context->used; i++) { plugin_config *s = p->config_storage[i]; + if (NULL == s) continue; + buffer_free(s->cookie_name); buffer_free(s->cookie_domain); diff --git a/src/mod_webdav.c b/src/mod_webdav.c index 654108a1..2fff8c33 100644 --- a/src/mod_webdav.c +++ b/src/mod_webdav.c @@ -120,7 +120,7 @@ FREE_FUNC(mod_webdav_free) { for (i = 0; i < srv->config_context->used; i++) { plugin_config *s = p->config_storage[i]; - if (!s) continue; + if (NULL == s) continue; buffer_free(s->sqlite_db_name); #ifdef USE_PROPPATCH