summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGlenn Strauss <gstrauss@gluelogic.com>2016-10-28 15:10:45 -0400
committerGlenn Strauss <gstrauss@gluelogic.com>2016-10-29 09:14:07 -0400
commitb29e69e5b746d1ee1d371893170b6ce31bbdb20e (patch)
tree1a78905bbfb1fece996c585dcce3ace122ba874c
parent204df0681400da072116633b1d4368e6aa900d13 (diff)
downloadlighttpd-git-b29e69e5b746d1ee1d371893170b6ce31bbdb20e.tar.gz
[mod_scgi] fix prefix matching to always match url
Fix mod_scgi prefix matching: match the prefix always against url, not the absolute filepath (regardless of check-local) (apply fix similar to commit:fe8b7e57 applied to mod_fastcgi in 2008)
-rw-r--r--src/mod_scgi.c15
1 files changed, 8 insertions, 7 deletions
diff --git a/src/mod_scgi.c b/src/mod_scgi.c
index db7e7d36..cb093fbb 100644
--- a/src/mod_scgi.c
+++ b/src/mod_scgi.c
@@ -2669,7 +2669,7 @@ static int scgi_patch_connection(server *srv, connection *con, plugin_data *p) {
static handler_t scgi_check_extension(server *srv, connection *con, void *p_d, int uri_path_handler) {
plugin_data *p = p_d;
- size_t s_len;
+ size_t s_len, uri_path_len;
size_t k;
buffer *fn;
scgi_extension *extension = NULL;
@@ -2685,6 +2685,7 @@ static handler_t scgi_check_extension(server *srv, connection *con, void *p_d, i
if (buffer_string_is_empty(fn)) return HANDLER_GO_ON;
s_len = buffer_string_length(fn);
+ uri_path_len = buffer_string_length(con->uri.path);
scgi_patch_connection(srv, con, p);
@@ -2697,15 +2698,15 @@ static handler_t scgi_check_extension(server *srv, connection *con, void *p_d, i
ct_len = buffer_string_length(ext->key);
- if (s_len < ct_len) continue;
-
- /* check extension in the form "/scgi_pattern" */
- if (*(ext->key->ptr) == '/') {
- if (strncmp(fn->ptr, ext->key->ptr, ct_len) == 0) {
+ /* check _url_ in the form "/scgi_pattern" */
+ if (extension->key->ptr[0] == '/') {
+ if (ct_len <= uri_path_len
+ && 0 == strncmp(con->uri.path->ptr, ext->key->ptr, ct_len)) {
extension = ext;
break;
}
- } else if (0 == strncmp(fn->ptr + s_len - ct_len, ext->key->ptr, ct_len)) {
+ } else if (ct_len <= s_len
+ && 0 == strncmp(fn->ptr + s_len - ct_len, ext->key->ptr, ct_len)) {
/* check extension in the form ".fcg" */
extension = ext;
break;