Commit d48281da authored by Christophe Jaillet's avatar Christophe Jaillet
Browse files

If several directories are given in a UserDir directive, only files in the...

If several directories are given in a UserDir directive, only files in the first existing one are checked. If the file is not found there, the other possible directories are not checked. The doc clearly states that they will be checked one by one, until a match is found or an external redirect is performed.

 PR 59636.

While at it, add some debug messages to better understand what is performed.

git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1832306 13f79535-47bb-0310-9956-ffa450edef68
parent 7f91a991
Loading
Loading
Loading
Loading
+7 −0
Changes for CHANGES: 7 added lines, 0 removed lines.
Original line number Diff line number Diff line
                                                         -*- coding: utf-8 -*-
Changes with Apache 2.5.1

  *) mod_userdir: If several directories are given in a UserDir directive, only files
     in the first existing one are checked. If the file is not found there, the
     other possible directories are not checked. The doc clearly states that they
     will be checked one by one, until a match is found or an external redirect is
     performed.  PR 59636.
     [Christophe Jaillet]

  *) mod_proxy: Fix a corner case where the ProxyPassReverseCookieDomain or
     ProxyPassReverseCookiePath directive could fail to update correctly 
     'domain=' or 'path=' in the 'Set-Cookie' header.  PR 61560.
+1 −1
Changes for docs/log-message-tags/next-number: 1 added line, 1 removed line.
Original line number Diff line number Diff line
10138
10142
+12 −1
Changes for modules/mappers/mod_userdir.c: 12 added lines, 1 removed line.
Original line number Diff line number Diff line
@@ -63,6 +63,7 @@
#include "httpd.h"
#include "http_config.h"
#include "http_request.h"
#include "http_log.h"

#if !defined(WIN32) && !defined(OS2) && !defined(NETWARE)
#define HAVE_UNIX_SUEXEC
@@ -265,6 +266,9 @@ static int translate_userdir(request_rec *r)
        apr_status_t rv;
        int is_absolute = ap_os_is_path_absolute(r->pool, userdir);

        ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, APLOGNO(10138)
                      "checking for UserDir '%s'", userdir);

        if (ap_strchr_c(userdir, '*'))
            prefix = ap_getword(r->pool, &userdir, '*');

@@ -318,11 +322,16 @@ static int translate_userdir(request_rec *r)
         * anyway, in the hope that some handler might handle it. This can be
         * used, for example, to run a CGI script for the user.
         */
        filename = apr_pstrcat(r->pool, filename, dname, NULL);
        ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, APLOGNO(10139)
                      "checking for filename '%s'", filename);
        if (filename && (!*userdirs
                      || ((rv = apr_stat(&statbuf, filename, APR_FINFO_MIN,
                                         r->pool)) == APR_SUCCESS
                                             || rv == APR_INCOMPLETE))) {
            r->filename = apr_pstrcat(r->pool, filename, dname, NULL);
            ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, APLOGNO(10140)
                          "'%s' found", filename);
            r->filename = filename;
            ap_set_context_info(r, apr_pstrmemdup(r->pool, r->uri,
                                                  dname - r->uri),
                                filename);
@@ -338,6 +347,8 @@ static int translate_userdir(request_rec *r)

            return OK;
        }
        ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, APLOGNO(10141)
                      "'%s' NOT found. Trying next UserDir directory (if any)", filename);
    }

    return DECLINED;