--- embedaddon/lighttpd/src/mod_rewrite.c 2014/06/15 20:20:06 1.1.1.2 +++ embedaddon/lighttpd/src/mod_rewrite.c 2016/11/02 10:35:00 1.1.1.3 @@ -1,3 +1,5 @@ +#include "first.h" + #include "base.h" #include "log.h" #include "buffer.h" @@ -101,7 +103,7 @@ static int rewrite_rule_buffer_append(rewrite_rule_buf } kvb->ptr[kvb->used]->value = buffer_init(); - buffer_copy_string_buffer(kvb->ptr[kvb->used]->value, value); + buffer_copy_buffer(kvb->ptr[kvb->used]->value, value); kvb->ptr[kvb->used]->once = once; kvb->used++; @@ -146,6 +148,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); @@ -191,6 +196,7 @@ static int parse_config_entry(server *srv, array *ca, once)) { log_error_write(srv, __FILE__, __LINE__, "sb", "pcre-compile failed for", da->value->data[j]->key); + return HANDLER_ERROR; } } } @@ -248,7 +254,7 @@ SETDEFAULTS_FUNC(mod_rewrite_set_defaults) { #endif for (i = 0; i < srv->config_context->used; i++) { - array *ca; + data_config const* config = (data_config const*)srv->config_context->data[i]; #ifdef HAVE_PCRE_H plugin_config *s; @@ -258,21 +264,19 @@ SETDEFAULTS_FUNC(mod_rewrite_set_defaults) { p->config_storage[i] = s; #endif - ca = ((data_config *)srv->config_context->data[i])->value; - - if (0 != config_insert_values_global(srv, ca, cv)) { + if (0 != config_insert_values_global(srv, config->value, cv, i == 0 ? T_CONFIG_SCOPE_SERVER : T_CONFIG_SCOPE_CONNECTION)) { return HANDLER_ERROR; } #ifndef HAVE_PCRE_H # define parse_config_entry(srv, ca, x, option, y) parse_config_entry(srv, ca, option) #endif - parse_config_entry(srv, ca, s->rewrite, "url.rewrite-once", 1); - parse_config_entry(srv, ca, s->rewrite, "url.rewrite-final", 1); - parse_config_entry(srv, ca, s->rewrite_NF, "url.rewrite-if-not-file", 1); - parse_config_entry(srv, ca, s->rewrite_NF, "url.rewrite-repeat-if-not-file", 0); - parse_config_entry(srv, ca, s->rewrite, "url.rewrite", 1); - parse_config_entry(srv, ca, s->rewrite, "url.rewrite-repeat", 0); + parse_config_entry(srv, config->value, s->rewrite, "url.rewrite-once", 1); + parse_config_entry(srv, config->value, s->rewrite, "url.rewrite-final", 1); + parse_config_entry(srv, config->value, s->rewrite_NF, "url.rewrite-if-not-file", 1); + parse_config_entry(srv, config->value, s->rewrite_NF, "url.rewrite-repeat-if-not-file", 0); + parse_config_entry(srv, config->value, s->rewrite, "url.rewrite", 1); + parse_config_entry(srv, config->value, s->rewrite, "url.rewrite-repeat", 0); } return HANDLER_GO_ON; @@ -341,7 +345,7 @@ URIHANDLER_FUNC(mod_rewrite_con_reset) { return HANDLER_GO_ON; } -static int process_rewrite_rules(server *srv, connection *con, plugin_data *p, rewrite_rule_buffer *kvb) { +static handler_t process_rewrite_rules(server *srv, connection *con, plugin_data *p, rewrite_rule_buffer *kvb) { size_t i; handler_ctx *hctx; @@ -358,7 +362,7 @@ static int process_rewrite_rules(server *srv, connecti if (hctx->state == REWRITE_STATE_FINISHED) return HANDLER_GO_ON; } - buffer_copy_string_buffer(p->match_buf, con->request.uri); + buffer_copy_buffer(p->match_buf, con->request.uri); for (i = 0; i < kvb->used; i++) { pcre *match; @@ -371,14 +375,18 @@ static int process_rewrite_rules(server *srv, connecti match = rule->key; pattern = rule->value->ptr; - pattern_len = rule->value->used - 1; + pattern_len = buffer_string_length(rule->value); - if ((n = pcre_exec(match, NULL, p->match_buf->ptr, p->match_buf->used - 1, 0, 0, ovec, 3 * N)) < 0) { + if ((n = pcre_exec(match, NULL, CONST_BUF_LEN(p->match_buf), 0, 0, ovec, 3 * N)) < 0) { if (n != PCRE_ERROR_NOMATCH) { log_error_write(srv, __FILE__, __LINE__, "sd", "execution error while matching: ", n); return HANDLER_ERROR; } + } else if (0 == pattern_len) { + /* short-circuit if blank replacement pattern + * (do not attempt to match against remaining rewrite rules) */ + return HANDLER_GO_ON; } else { const char **list; size_t start; @@ -480,8 +488,6 @@ URIHANDLER_FUNC(mod_rewrite_uri_handler) { if (!p->conf.rewrite) return HANDLER_GO_ON; return process_rewrite_rules(srv, con, p, p->conf.rewrite); - - return HANDLER_GO_ON; } #endif