diff options
author | Glenn Strauss <gstrauss@gluelogic.com> | 2018-09-16 17:27:54 -0400 |
---|---|---|
committer | Glenn Strauss <gstrauss@gluelogic.com> | 2018-09-23 18:01:58 -0400 |
commit | d61f33817cc79e00e7b0fedbd8f2692160fe24e5 (patch) | |
tree | 7fcef28a5f2884329e416903b419148a6be4108c /src/mod_alias.c | |
parent | 863dff6191139a24b1bfaedf4904bf81a7ca7c0b (diff) | |
download | lighttpd-git-d61f33817cc79e00e7b0fedbd8f2692160fe24e5.tar.gz |
[multiple] code reuse: employ array_match_*()
Diffstat (limited to 'src/mod_alias.c')
-rw-r--r-- | src/mod_alias.c | 30 |
1 files changed, 11 insertions, 19 deletions
diff --git a/src/mod_alias.c b/src/mod_alias.c index eec14f24..cd9414ff 100644 --- a/src/mod_alias.c +++ b/src/mod_alias.c @@ -155,34 +155,31 @@ static int mod_alias_patch_connection(server *srv, connection *con, plugin_data PHYSICALPATH_FUNC(mod_alias_physical_handler) { plugin_data *p = p_d; - int uri_len, basedir_len; char *uri_ptr; - size_t k; + size_t uri_len = buffer_string_length(con->physical.path); + size_t basedir_len, alias_len; + data_string *ds; - if (buffer_is_empty(con->physical.path)) return HANDLER_GO_ON; + if (0 == uri_len) return HANDLER_GO_ON; mod_alias_patch_connection(srv, con, p); - /* not to include the tailing slash */ + /* do not include trailing slash on basedir */ basedir_len = buffer_string_length(con->physical.basedir); if ('/' == con->physical.basedir->ptr[basedir_len-1]) --basedir_len; - uri_len = buffer_string_length(con->physical.path) - basedir_len; + uri_len -= basedir_len; uri_ptr = con->physical.path->ptr + basedir_len; - for (k = 0; k < p->conf.alias->used; k++) { - data_string *ds = (data_string *)p->conf.alias->data[k]; - int alias_len = buffer_string_length(ds->key); + ds = (!con->conf.force_lowercase_filenames) + ? (data_string *)array_match_key_prefix_klen(p->conf.alias, uri_ptr, uri_len) + : (data_string *)array_match_key_prefix_nc_klen(p->conf.alias, uri_ptr, uri_len); + if (NULL == ds) { return HANDLER_GO_ON; } - if (alias_len > uri_len) continue; - if (buffer_is_empty(ds->key)) continue; - - if (0 == (con->conf.force_lowercase_filenames ? - strncasecmp(uri_ptr, ds->key->ptr, alias_len) : - strncmp(uri_ptr, ds->key->ptr, alias_len))) { /* matched */ /* check for path traversal in url-path following alias if key * does not end in slash, but replacement value ends in slash */ + alias_len = buffer_string_length(ds->key); if (uri_ptr[alias_len] == '.') { char *s = uri_ptr + alias_len + 1; if (*s == '.') ++s; @@ -202,11 +199,6 @@ PHYSICALPATH_FUNC(mod_alias_physical_handler) { buffer_copy_buffer(con->physical.path, srv->tmp_buf); return HANDLER_GO_ON; - } - } - - /* not found */ - return HANDLER_GO_ON; } /* this function is called at dlopen() time and inits the callbacks */ |