summaryrefslogtreecommitdiff
path: root/src/mod_alias.c
diff options
context:
space:
mode:
authorGlenn Strauss <gstrauss@gluelogic.com>2018-09-16 17:27:54 -0400
committerGlenn Strauss <gstrauss@gluelogic.com>2018-09-23 18:01:58 -0400
commitd61f33817cc79e00e7b0fedbd8f2692160fe24e5 (patch)
tree7fcef28a5f2884329e416903b419148a6be4108c /src/mod_alias.c
parent863dff6191139a24b1bfaedf4904bf81a7ca7c0b (diff)
downloadlighttpd-git-d61f33817cc79e00e7b0fedbd8f2692160fe24e5.tar.gz
[multiple] code reuse: employ array_match_*()
Diffstat (limited to 'src/mod_alias.c')
-rw-r--r--src/mod_alias.c30
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 */