&& (r->server->path[r->server->pathlen - 1] == '/'
|| r->uri[r->server->pathlen] == '/'
|| r->uri[r->server->pathlen] == '\0')) {
- r->filename = apr_pstrcat(r->pool, conf->ap_document_root,
- (r->uri + r->server->pathlen), NULL);
+ if (apr_filepath_merge(r->filename, conf->ap_document_root,
+ r->uri + r->server->pathlen,
+ APR_FILEPATH_TRUENAME
+ | APR_SECUREROOT_TEST, r->pool)
+ != APR_SUCCESS) {
+ return HTTP_FORBIDDEN;
+ }
+ r->canonical_filename == r->filename;
}
else {
/*
* /'s in a row. This happens under windows when the document
* root ends with a /
*/
- if ((conf->ap_document_root[strlen(conf->ap_document_root)-1] == '/')
- && (*(r->uri) == '/')) {
- r->filename = apr_pstrcat(r->pool, conf->ap_document_root, r->uri+1,
- NULL);
- }
- else {
- r->filename = apr_pstrcat(r->pool, conf->ap_document_root, r->uri,
- NULL);
- }
+ if (apr_filepath_merge(r->filename, conf->ap_document_root,
+ r->uri + (*(r->uri) == '/') ? 1 : 0,
+ APR_FILEPATH_TRUENAME
+ | APR_SECUREROOT_TEST, r->pool)
+ != APR_SUCCESS) {
+ return HTTP_FORBIDDEN;
+ }
+ r->canonical_filename == r->filename;
}
return OK;