new version 2.4.63
Resolves: RHEL-76358 - httpd rebase to 2.4.63 Resolves: RHEL-73414 - RewriteRule proxying to UDS (unix domain socket) configured in .htaccess doesn't work on httpd-2.4.62-1 Resolves: RHEL-66489 - Apache HTTPD no longer parse PHP files with unicode characters in the name
This commit is contained in:
parent
0a0943f905
commit
897a585da6
1
.gitignore
vendored
1
.gitignore
vendored
@ -52,3 +52,4 @@ x86_64
|
||||
/httpd-2.4.59.tar.bz2.asc
|
||||
/httpd-2.4.61.tar.bz2.asc
|
||||
/httpd-2.4.62.tar.bz2.asc
|
||||
/httpd-2.4.63.tar.bz2.asc
|
||||
|
@ -1,383 +0,0 @@
|
||||
# ./pullrev.sh 1912477 1912571 1912718 1913654 1914438
|
||||
http://svn.apache.org/viewvc?view=revision&revision=1912477
|
||||
http://svn.apache.org/viewvc?view=revision&revision=1912571
|
||||
http://svn.apache.org/viewvc?view=revision&revision=1912718
|
||||
http://svn.apache.org/viewvc?view=revision&revision=1913654
|
||||
http://svn.apache.org/viewvc?view=revision&revision=1914438
|
||||
|
||||
Upstream-Status: in trunk, not proposed for 2.4.x
|
||||
|
||||
--- httpd-2.4.58/modules/dav/fs/config6.m4.r1912477+
|
||||
+++ httpd-2.4.58/modules/dav/fs/config6.m4
|
||||
@@ -20,4 +20,10 @@
|
||||
|
||||
APACHE_MODULE(dav_fs, DAV provider for the filesystem. --enable-dav also enables mod_dav_fs., $dav_fs_objects, , $dav_fs_enable,,dav)
|
||||
|
||||
+if test "x$enable_dav_fs" = "xshared"; then
|
||||
+ # The only symbol which needs to be exported is the module
|
||||
+ # structure, so ask libtool to hide everything else:
|
||||
+ APR_ADDTO(MOD_DAV_FS_LDADD, [-export-symbols-regex dav_fs_module])
|
||||
+fi
|
||||
+
|
||||
APACHE_MODPATH_FINISH
|
||||
--- httpd-2.4.58/modules/dav/fs/dbm.c.r1912477+
|
||||
+++ httpd-2.4.58/modules/dav/fs/dbm.c
|
||||
@@ -47,6 +47,10 @@
|
||||
#include "http_log.h"
|
||||
#include "http_main.h" /* for ap_server_conf */
|
||||
|
||||
+#ifndef DEFAULT_PROPDB_DBM_TYPE
|
||||
+#define DEFAULT_PROPDB_DBM_TYPE "default"
|
||||
+#endif
|
||||
+
|
||||
APLOG_USE_MODULE(dav_fs);
|
||||
|
||||
struct dav_db {
|
||||
@@ -100,7 +104,7 @@
|
||||
/* There might not be a <db> if we had problems creating it. */
|
||||
if (db == NULL) {
|
||||
errcode = 1;
|
||||
- errstr = "Could not open property database.";
|
||||
+ errstr = "Could not open database.";
|
||||
if (APR_STATUS_IS_EDSOOPEN(status))
|
||||
ap_log_error(APLOG_MARK, APLOG_CRIT, status, ap_server_conf, APLOGNO(00576)
|
||||
"The DBM driver could not be loaded");
|
||||
@@ -129,10 +133,10 @@
|
||||
/* dav_dbm_open_direct: Opens a *dbm database specified by path.
|
||||
* ro = boolean read-only flag.
|
||||
*/
|
||||
-dav_error * dav_dbm_open_direct(apr_pool_t *p, const char *pathname, int ro,
|
||||
- dav_db **pdb)
|
||||
+dav_error * dav_dbm_open_direct(apr_pool_t *p, const char *pathname,
|
||||
+ const char *dbmtype, int ro, dav_db **pdb)
|
||||
{
|
||||
-#if APU_MAJOR_VERSION > 1 || (APU_MAJOR_VERSION == 1 && APU_MINOR_VERSION >= 7)
|
||||
+#if APR_MAJOR_VERSION > 1 || (APU_MAJOR_VERSION == 1 && APU_MINOR_VERSION >= 7)
|
||||
const apr_dbm_driver_t *driver;
|
||||
const apu_err_t *err;
|
||||
#endif
|
||||
@@ -141,13 +145,13 @@
|
||||
|
||||
*pdb = NULL;
|
||||
|
||||
-#if APU_MAJOR_VERSION > 1 || (APU_MAJOR_VERSION == 1 && APU_MINOR_VERSION >= 7)
|
||||
- if ((status = apr_dbm_get_driver(&driver, NULL, &err, p)) != APR_SUCCESS) {
|
||||
+#if APR_MAJOR_VERSION > 1 || (APU_MAJOR_VERSION == 1 && APU_MINOR_VERSION >= 7)
|
||||
+ if ((status = apr_dbm_get_driver(&driver, dbmtype, &err, p)) != APR_SUCCESS) {
|
||||
ap_log_error(APLOG_MARK, APLOG_ERR, status, ap_server_conf, APLOGNO(10289)
|
||||
- "mod_dav_fs: The DBM library '%s' could not be loaded: %s",
|
||||
- err->reason, err->msg);
|
||||
+ "mod_dav_fs: The DBM library '%s' for '%s' could not be loaded: %s",
|
||||
+ err->reason, dbmtype, err->msg);
|
||||
return dav_new_error(p, HTTP_INTERNAL_SERVER_ERROR, 1, status,
|
||||
- "Could not load library for property database.");
|
||||
+ "Could not load library for database.");
|
||||
}
|
||||
if ((status = apr_dbm_open2(&file, driver, pathname,
|
||||
ro ? APR_DBM_READONLY : APR_DBM_RWCREATE,
|
||||
@@ -156,7 +160,7 @@
|
||||
return dav_fs_dbm_error(NULL, p, status);
|
||||
}
|
||||
#else
|
||||
- if ((status = apr_dbm_open(&file, pathname,
|
||||
+ if ((status = apr_dbm_open_ex(&file, dbmtype, pathname,
|
||||
ro ? APR_DBM_READONLY : APR_DBM_RWCREATE,
|
||||
APR_OS_DEFAULT, p))
|
||||
!= APR_SUCCESS
|
||||
@@ -206,7 +210,7 @@
|
||||
|
||||
/* ### do we need to deal with the umask? */
|
||||
|
||||
- return dav_dbm_open_direct(p, pathname, ro, pdb);
|
||||
+ return dav_dbm_open_direct(p, pathname, DEFAULT_PROPDB_DBM_TYPE, ro, pdb);
|
||||
}
|
||||
|
||||
void dav_dbm_close(dav_db *db)
|
||||
--- httpd-2.4.58/modules/dav/fs/lock.c.r1912477+
|
||||
+++ httpd-2.4.58/modules/dav/fs/lock.c
|
||||
@@ -181,8 +181,7 @@
|
||||
{
|
||||
request_rec *r; /* for accessing the uuid state */
|
||||
apr_pool_t *pool; /* a pool to use */
|
||||
- const char *lockdb_path; /* where is the lock database? */
|
||||
-
|
||||
+ const dav_fs_server_conf *conf; /* lock database config & metadata */
|
||||
int opened; /* we opened the database */
|
||||
dav_db *db; /* if non-NULL, the lock database */
|
||||
};
|
||||
@@ -292,6 +291,19 @@
|
||||
return dav_compare_locktoken(lt1, lt2);
|
||||
}
|
||||
|
||||
+static apr_status_t dav_fs_lockdb_cleanup(void *data)
|
||||
+{
|
||||
+ dav_lockdb *lockdb = data;
|
||||
+
|
||||
+ apr_global_mutex_unlock(lockdb->info->conf->lockdb_mutex);
|
||||
+
|
||||
+ if (lockdb->info->db) {
|
||||
+ dav_dbm_close(lockdb->info->db);
|
||||
+ }
|
||||
+
|
||||
+ return APR_SUCCESS;
|
||||
+}
|
||||
+
|
||||
/*
|
||||
** dav_fs_really_open_lockdb:
|
||||
**
|
||||
@@ -300,15 +312,27 @@
|
||||
static dav_error * dav_fs_really_open_lockdb(dav_lockdb *lockdb)
|
||||
{
|
||||
dav_error *err;
|
||||
+ apr_status_t rv;
|
||||
|
||||
if (lockdb->info->opened)
|
||||
return NULL;
|
||||
|
||||
+ rv = apr_global_mutex_lock(lockdb->info->conf->lockdb_mutex);
|
||||
+ if (rv) {
|
||||
+ return dav_new_error(lockdb->info->pool,
|
||||
+ HTTP_INTERNAL_SERVER_ERROR,
|
||||
+ DAV_ERR_LOCK_OPENDB, rv,
|
||||
+ "Could not lock mutex for lock database.");
|
||||
+ }
|
||||
+
|
||||
err = dav_dbm_open_direct(lockdb->info->pool,
|
||||
- lockdb->info->lockdb_path,
|
||||
+ lockdb->info->conf->lockdb_path,
|
||||
+ lockdb->info->conf->lockdb_type,
|
||||
lockdb->ro,
|
||||
&lockdb->info->db);
|
||||
if (err != NULL) {
|
||||
+ apr_global_mutex_unlock(lockdb->info->conf->lockdb_mutex);
|
||||
+
|
||||
return dav_push_error(lockdb->info->pool,
|
||||
HTTP_INTERNAL_SERVER_ERROR,
|
||||
DAV_ERR_LOCK_OPENDB,
|
||||
@@ -316,6 +340,10 @@
|
||||
err);
|
||||
}
|
||||
|
||||
+ apr_pool_cleanup_register(lockdb->info->pool, lockdb,
|
||||
+ dav_fs_lockdb_cleanup,
|
||||
+ dav_fs_lockdb_cleanup);
|
||||
+
|
||||
/* all right. it is opened now. */
|
||||
lockdb->info->opened = 1;
|
||||
|
||||
@@ -341,9 +369,9 @@
|
||||
comb->pub.info = &comb->priv;
|
||||
comb->priv.r = r;
|
||||
comb->priv.pool = r->pool;
|
||||
-
|
||||
- comb->priv.lockdb_path = dav_get_lockdb_path(r);
|
||||
- if (comb->priv.lockdb_path == NULL) {
|
||||
+ comb->priv.conf = dav_fs_get_server_conf(r);
|
||||
+
|
||||
+ if (comb->priv.conf == NULL || comb->priv.conf->lockdb_path == NULL) {
|
||||
return dav_new_error(r->pool, HTTP_INTERNAL_SERVER_ERROR,
|
||||
DAV_ERR_LOCK_NO_DB, 0,
|
||||
"A lock database was not specified with the "
|
||||
@@ -369,8 +397,8 @@
|
||||
*/
|
||||
static void dav_fs_close_lockdb(dav_lockdb *lockdb)
|
||||
{
|
||||
- if (lockdb->info->db != NULL)
|
||||
- dav_dbm_close(lockdb->info->db);
|
||||
+ apr_pool_cleanup_run(lockdb->info->pool, lockdb,
|
||||
+ dav_fs_lockdb_cleanup);
|
||||
}
|
||||
|
||||
/*
|
||||
--- httpd-2.4.58/modules/dav/fs/mod_dav_fs.c.r1912477+
|
||||
+++ httpd-2.4.58/modules/dav/fs/mod_dav_fs.c
|
||||
@@ -14,31 +14,35 @@
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
+#if !defined(_MSC_VER) && !defined(NETWARE)
|
||||
+#include "ap_config_auto.h"
|
||||
+#endif
|
||||
+
|
||||
#include "httpd.h"
|
||||
#include "http_config.h"
|
||||
+#include "http_core.h"
|
||||
+#include "http_log.h"
|
||||
#include "apr_strings.h"
|
||||
|
||||
#include "mod_dav.h"
|
||||
#include "repos.h"
|
||||
|
||||
-/* per-server configuration */
|
||||
-typedef struct {
|
||||
- const char *lockdb_path;
|
||||
-
|
||||
-} dav_fs_server_conf;
|
||||
-
|
||||
extern module AP_MODULE_DECLARE_DATA dav_fs_module;
|
||||
|
||||
#ifndef DEFAULT_DAV_LOCKDB
|
||||
#define DEFAULT_DAV_LOCKDB "davlockdb"
|
||||
#endif
|
||||
+#ifndef DEFAULT_DAV_LOCKDB_TYPE
|
||||
+#define DEFAULT_DAV_LOCKDB_TYPE "default"
|
||||
+#endif
|
||||
|
||||
-const char *dav_get_lockdb_path(const request_rec *r)
|
||||
-{
|
||||
- dav_fs_server_conf *conf;
|
||||
+static const char dav_fs_mutexid[] = "dav_fs-lockdb";
|
||||
|
||||
- conf = ap_get_module_config(r->server->module_config, &dav_fs_module);
|
||||
- return conf->lockdb_path;
|
||||
+static apr_global_mutex_t *dav_fs_lockdb_mutex;
|
||||
+
|
||||
+const dav_fs_server_conf *dav_fs_get_server_conf(const request_rec *r)
|
||||
+{
|
||||
+ return ap_get_module_config(r->server->module_config, &dav_fs_module);
|
||||
}
|
||||
|
||||
static void *dav_fs_create_server_config(apr_pool_t *p, server_rec *s)
|
||||
@@ -57,15 +61,50 @@
|
||||
|
||||
newconf->lockdb_path =
|
||||
child->lockdb_path ? child->lockdb_path : parent->lockdb_path;
|
||||
+ newconf->lockdb_type =
|
||||
+ child->lockdb_type ? child->lockdb_type : parent->lockdb_type;
|
||||
|
||||
return newconf;
|
||||
}
|
||||
|
||||
+static int dav_fs_pre_config(apr_pool_t *pconf, apr_pool_t *plog, apr_pool_t *ptemp)
|
||||
+{
|
||||
+ if (ap_mutex_register(pconf, dav_fs_mutexid, NULL, APR_LOCK_DEFAULT, 0))
|
||||
+ return !OK;
|
||||
+ return OK;
|
||||
+}
|
||||
+
|
||||
+static void dav_fs_child_init(apr_pool_t *p, server_rec *s)
|
||||
+{
|
||||
+ apr_status_t rv;
|
||||
+
|
||||
+ rv = apr_global_mutex_child_init(&dav_fs_lockdb_mutex,
|
||||
+ apr_global_mutex_lockfile(dav_fs_lockdb_mutex),
|
||||
+ p);
|
||||
+ if (rv) {
|
||||
+ ap_log_error(APLOG_MARK, APLOG_ERR, rv, s,
|
||||
+ APLOGNO(10488) "child init failed for mutex");
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
static apr_status_t dav_fs_post_config(apr_pool_t *p, apr_pool_t *plog,
|
||||
apr_pool_t *ptemp, server_rec *base_server)
|
||||
{
|
||||
server_rec *s;
|
||||
+ apr_status_t rv;
|
||||
|
||||
+ /* Ignore first pass through the config. */
|
||||
+ if (ap_state_query(AP_SQ_MAIN_STATE) == AP_SQ_MS_CREATE_PRE_CONFIG)
|
||||
+ return OK;
|
||||
+
|
||||
+ rv = ap_global_mutex_create(&dav_fs_lockdb_mutex, NULL, dav_fs_mutexid, NULL,
|
||||
+ base_server, p, 0);
|
||||
+ if (rv) {
|
||||
+ ap_log_error(APLOG_MARK, APLOG_ERR, rv, base_server,
|
||||
+ APLOGNO(10489) "could not create lock mutex");
|
||||
+ return !OK;
|
||||
+ }
|
||||
+
|
||||
for (s = base_server; s; s = s->next) {
|
||||
dav_fs_server_conf *conf;
|
||||
|
||||
@@ -74,6 +113,13 @@
|
||||
if (!conf->lockdb_path) {
|
||||
conf->lockdb_path = ap_state_dir_relative(p, DEFAULT_DAV_LOCKDB);
|
||||
}
|
||||
+ if (!conf->lockdb_type) {
|
||||
+ conf->lockdb_type = DEFAULT_DAV_LOCKDB_TYPE;
|
||||
+ }
|
||||
+
|
||||
+ /* Mutex is common across all vhosts, but could have one per
|
||||
+ * vhost if required. */
|
||||
+ conf->lockdb_mutex = dav_fs_lockdb_mutex;
|
||||
}
|
||||
|
||||
return OK;
|
||||
@@ -98,19 +144,36 @@
|
||||
return NULL;
|
||||
}
|
||||
|
||||
+/*
|
||||
+ * Command handler for the DAVLockDBType directive, which is TAKE1
|
||||
+ */
|
||||
+static const char *dav_fs_cmd_davlockdbtype(cmd_parms *cmd, void *config,
|
||||
+ const char *arg1)
|
||||
+{
|
||||
+ dav_fs_server_conf *conf = ap_get_module_config(cmd->server->module_config,
|
||||
+ &dav_fs_module);
|
||||
+ conf->lockdb_type = arg1;
|
||||
+
|
||||
+ return NULL;
|
||||
+}
|
||||
+
|
||||
static const command_rec dav_fs_cmds[] =
|
||||
{
|
||||
/* per server */
|
||||
AP_INIT_TAKE1("DAVLockDB", dav_fs_cmd_davlockdb, NULL, RSRC_CONF,
|
||||
"specify a lock database"),
|
||||
+ AP_INIT_TAKE1("DAVLockDBType", dav_fs_cmd_davlockdbtype, NULL, RSRC_CONF,
|
||||
+ "specify a lock database DBM type"),
|
||||
|
||||
{ NULL }
|
||||
};
|
||||
|
||||
static void register_hooks(apr_pool_t *p)
|
||||
{
|
||||
+ ap_hook_pre_config(dav_fs_pre_config, NULL, NULL, APR_HOOK_MIDDLE);
|
||||
ap_hook_post_config(dav_fs_post_config, NULL, NULL, APR_HOOK_MIDDLE);
|
||||
-
|
||||
+ ap_hook_child_init(dav_fs_child_init, NULL, NULL, APR_HOOK_MIDDLE);
|
||||
+
|
||||
dav_hook_gather_propsets(dav_fs_gather_propsets, NULL, NULL,
|
||||
APR_HOOK_MIDDLE);
|
||||
dav_hook_find_liveprop(dav_fs_find_liveprop, NULL, NULL, APR_HOOK_MIDDLE);
|
||||
--- httpd-2.4.58/modules/dav/fs/repos.h.r1912477+
|
||||
+++ httpd-2.4.58/modules/dav/fs/repos.h
|
||||
@@ -25,6 +25,8 @@
|
||||
#ifndef _DAV_FS_REPOS_H_
|
||||
#define _DAV_FS_REPOS_H_
|
||||
|
||||
+#include "util_mutex.h"
|
||||
+
|
||||
/* the subdirectory to hold all DAV-related information for a directory */
|
||||
#define DAV_FS_STATE_DIR ".DAV"
|
||||
#define DAV_FS_STATE_FILE_FOR_DIR ".state_for_dir"
|
||||
@@ -53,8 +55,8 @@
|
||||
/* DBM functions used by the repository and locking providers */
|
||||
extern const dav_hooks_db dav_hooks_db_dbm;
|
||||
|
||||
-dav_error * dav_dbm_open_direct(apr_pool_t *p, const char *pathname, int ro,
|
||||
- dav_db **pdb);
|
||||
+dav_error * dav_dbm_open_direct(apr_pool_t *p, const char *pathname,
|
||||
+ const char *dbmtype, int ro, dav_db **pdb);
|
||||
void dav_dbm_get_statefiles(apr_pool_t *p, const char *fname,
|
||||
const char **state1, const char **state2);
|
||||
dav_error * dav_dbm_delete(dav_db *db, apr_datum_t key);
|
||||
@@ -64,8 +66,15 @@
|
||||
int dav_dbm_exists(dav_db *db, apr_datum_t key);
|
||||
void dav_dbm_close(dav_db *db);
|
||||
|
||||
-/* where is the lock database located? */
|
||||
-const char *dav_get_lockdb_path(const request_rec *r);
|
||||
+/* Per-server configuration. */
|
||||
+typedef struct {
|
||||
+ const char *lockdb_path;
|
||||
+ const char *lockdb_type;
|
||||
+ apr_global_mutex_t *lockdb_mutex;
|
||||
+} dav_fs_server_conf;
|
||||
+
|
||||
+/* Returns server configuration for the request. */
|
||||
+const dav_fs_server_conf *dav_fs_get_server_conf(const request_rec *r);
|
||||
|
||||
const dav_hooks_locks *dav_fs_get_lock_hooks(request_rec *r);
|
||||
const dav_hooks_propdb *dav_fs_get_propdb_hooks(request_rec *r);
|
@ -1,242 +0,0 @@
|
||||
From a0a68b99d131741c1867cff321424892838fc4b3 Mon Sep 17 00:00:00 2001
|
||||
From: Yann Ylavic <ylavic@apache.org>
|
||||
Date: Sat, 27 Jul 2024 13:35:53 +0000
|
||||
Subject: [PATCH] mod_rewrite: Better question mark tracking to avoid
|
||||
UnsafeAllow3F. PR 69197.
|
||||
|
||||
Track in do_expand() whether a '?' in the uri-path comes from a literal in
|
||||
the substitution string or from an expansion (variable, lookup, ...).
|
||||
In the former case it's safe to assume that it's the query-string separator
|
||||
but for the other case it's not (could be a decoded %3f from r->uri).
|
||||
|
||||
This allows to avoid [UnsafeAllow3F] for most cases.
|
||||
|
||||
|
||||
Merges r1919325 from trunk
|
||||
Reviewed by: ylavic, covener, jorton
|
||||
Github: closes #462
|
||||
|
||||
|
||||
git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/branches/2.4.x@1919545 13f79535-47bb-0310-9956-ffa450edef68
|
||||
---
|
||||
modules/mappers/mod_rewrite.c | 107 ++++++++++++++++++++++++++++------
|
||||
1 file changed, 89 insertions(+), 18 deletions(-)
|
||||
|
||||
diff --git a/modules/mappers/mod_rewrite.c b/modules/mappers/mod_rewrite.c
|
||||
index f1c22e3235b..53fb1e91ffb 100644
|
||||
--- a/modules/mappers/mod_rewrite.c
|
||||
+++ b/modules/mappers/mod_rewrite.c
|
||||
@@ -2376,9 +2376,16 @@ static APR_INLINE char *find_char_in_curlies(char *s, int c)
|
||||
* of an earlier expansion to include expansion specifiers that
|
||||
* are interpreted by a later expansion, producing results that
|
||||
* were not intended by the administrator.
|
||||
+ *
|
||||
+ * unsafe_qmark if not NULL will be set to 1 or 0 if a question mark
|
||||
+ * is found respectively in a literal or in a lookup/expansion (whether
|
||||
+ * it's the first or last qmark depends on [QSL]). Should be initialized
|
||||
+ * to -1 and remains so if no qmark is found.
|
||||
*/
|
||||
-static char *do_expand(char *input, rewrite_ctx *ctx, rewriterule_entry *entry)
|
||||
+static char *do_expand(char *input, rewrite_ctx *ctx, rewriterule_entry *entry,
|
||||
+ int *unsafe_qmark)
|
||||
{
|
||||
+#define EXPAND_SPECIALS "\\$%"
|
||||
result_list *result, *current;
|
||||
result_list sresult[SMALL_EXPANSION];
|
||||
unsigned spc = 0;
|
||||
@@ -2386,8 +2393,29 @@ static char *do_expand(char *input, rewrite_ctx *ctx, rewriterule_entry *entry)
|
||||
char *p, *c;
|
||||
apr_pool_t *pool = ctx->r->pool;
|
||||
|
||||
- span = strcspn(input, "\\$%");
|
||||
inputlen = strlen(input);
|
||||
+ if (!unsafe_qmark) {
|
||||
+ span = strcspn(input, EXPAND_SPECIALS);
|
||||
+ }
|
||||
+ else {
|
||||
+ span = strcspn(input, EXPAND_SPECIALS "?");
|
||||
+ if (input[span] == '?') {
|
||||
+ /* this qmark is not from an expansion thus safe */
|
||||
+ *unsafe_qmark = 0;
|
||||
+
|
||||
+ /* keep tracking only if interested in the last qmark */
|
||||
+ if (entry && (entry->flags & RULEFLAG_QSLAST)) {
|
||||
+ do {
|
||||
+ span++;
|
||||
+ span += strcspn(input + span, EXPAND_SPECIALS "?");
|
||||
+ } while (input[span] == '?');
|
||||
+ }
|
||||
+ else {
|
||||
+ unsafe_qmark = NULL;
|
||||
+ span += strcspn(input + span, EXPAND_SPECIALS);
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
|
||||
/* fast exit */
|
||||
if (inputlen == span) {
|
||||
@@ -2405,6 +2433,8 @@ static char *do_expand(char *input, rewrite_ctx *ctx, rewriterule_entry *entry)
|
||||
|
||||
/* loop for specials */
|
||||
do {
|
||||
+ int expanded = 0;
|
||||
+
|
||||
/* prepare next entry */
|
||||
if (current->len) {
|
||||
current->next = (spc < SMALL_EXPANSION)
|
||||
@@ -2450,6 +2480,8 @@ static char *do_expand(char *input, rewrite_ctx *ctx, rewriterule_entry *entry)
|
||||
current->len = span;
|
||||
current->string = p;
|
||||
outlen += span;
|
||||
+
|
||||
+ expanded = 1;
|
||||
p = endp + 1;
|
||||
}
|
||||
|
||||
@@ -2489,19 +2521,18 @@ static char *do_expand(char *input, rewrite_ctx *ctx, rewriterule_entry *entry)
|
||||
}
|
||||
|
||||
/* reuse of key variable as result */
|
||||
- key = lookup_map(ctx->r, map, do_expand(key, ctx, entry));
|
||||
-
|
||||
+ key = lookup_map(ctx->r, map, do_expand(key, ctx, entry, NULL));
|
||||
if (!key && dflt && *dflt) {
|
||||
- key = do_expand(dflt, ctx, entry);
|
||||
+ key = do_expand(dflt, ctx, entry, NULL);
|
||||
}
|
||||
-
|
||||
- if (key) {
|
||||
+ if (key && *key) {
|
||||
span = strlen(key);
|
||||
current->len = span;
|
||||
current->string = key;
|
||||
outlen += span;
|
||||
}
|
||||
|
||||
+ expanded = 1;
|
||||
p = endp + 1;
|
||||
}
|
||||
}
|
||||
@@ -2531,8 +2562,9 @@ static char *do_expand(char *input, rewrite_ctx *ctx, rewriterule_entry *entry)
|
||||
current->len = span;
|
||||
current->string = bri->source + bri->regmatch[n].rm_so;
|
||||
}
|
||||
-
|
||||
outlen += span;
|
||||
+
|
||||
+ expanded = 1;
|
||||
}
|
||||
|
||||
p += 2;
|
||||
@@ -2545,8 +2577,41 @@ static char *do_expand(char *input, rewrite_ctx *ctx, rewriterule_entry *entry)
|
||||
++outlen;
|
||||
}
|
||||
|
||||
+ if (unsafe_qmark && expanded && current->len
|
||||
+ && memchr(current->string, '?', current->len)) {
|
||||
+ /* this qmark is from an expansion thus unsafe */
|
||||
+ *unsafe_qmark = 1;
|
||||
+
|
||||
+ /* keep tracking only if interested in the last qmark */
|
||||
+ if (!entry || !(entry->flags & RULEFLAG_QSLAST)) {
|
||||
+ unsafe_qmark = NULL;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
/* check the remainder */
|
||||
- if (*p && (span = strcspn(p, "\\$%")) > 0) {
|
||||
+ if (!unsafe_qmark) {
|
||||
+ span = strcspn(p, EXPAND_SPECIALS);
|
||||
+ }
|
||||
+ else {
|
||||
+ span = strcspn(p, EXPAND_SPECIALS "?");
|
||||
+ if (p[span] == '?') {
|
||||
+ /* this qmark is not from an expansion thus safe */
|
||||
+ *unsafe_qmark = 0;
|
||||
+
|
||||
+ /* keep tracking only if interested in the last qmark */
|
||||
+ if (entry && (entry->flags & RULEFLAG_QSLAST)) {
|
||||
+ do {
|
||||
+ span++;
|
||||
+ span += strcspn(p + span, EXPAND_SPECIALS "?");
|
||||
+ } while (p[span] == '?');
|
||||
+ }
|
||||
+ else {
|
||||
+ unsafe_qmark = NULL;
|
||||
+ span += strcspn(p + span, EXPAND_SPECIALS);
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+ if (span > 0) {
|
||||
if (current->len) {
|
||||
current->next = (spc < SMALL_EXPANSION)
|
||||
? &(sresult[spc++])
|
||||
@@ -2591,7 +2656,7 @@ static void do_expand_env(data_item *env, rewrite_ctx *ctx)
|
||||
char *name, *val;
|
||||
|
||||
while (env) {
|
||||
- name = do_expand(env->data, ctx, NULL);
|
||||
+ name = do_expand(env->data, ctx, NULL, NULL);
|
||||
if (*name == '!') {
|
||||
name++;
|
||||
apr_table_unset(ctx->r->subprocess_env, name);
|
||||
@@ -2725,7 +2790,7 @@ static void add_cookie(request_rec *r, char *s)
|
||||
static void do_expand_cookie(data_item *cookie, rewrite_ctx *ctx)
|
||||
{
|
||||
while (cookie) {
|
||||
- add_cookie(ctx->r, do_expand(cookie->data, ctx, NULL));
|
||||
+ add_cookie(ctx->r, do_expand(cookie->data, ctx, NULL, NULL));
|
||||
cookie = cookie->next;
|
||||
}
|
||||
|
||||
@@ -4014,7 +4079,7 @@ static int apply_rewrite_cond(rewritecond_entry *p, rewrite_ctx *ctx)
|
||||
int basis;
|
||||
|
||||
if (p->ptype != CONDPAT_AP_EXPR)
|
||||
- input = do_expand(p->input, ctx, NULL);
|
||||
+ input = do_expand(p->input, ctx, NULL, NULL);
|
||||
|
||||
switch (p->ptype) {
|
||||
case CONDPAT_FILE_EXISTS:
|
||||
@@ -4178,7 +4243,7 @@ static APR_INLINE void force_type_handler(rewriterule_entry *p,
|
||||
char *expanded;
|
||||
|
||||
if (p->forced_mimetype) {
|
||||
- expanded = do_expand(p->forced_mimetype, ctx, p);
|
||||
+ expanded = do_expand(p->forced_mimetype, ctx, p, NULL);
|
||||
|
||||
if (*expanded) {
|
||||
ap_str_tolower(expanded);
|
||||
@@ -4192,7 +4257,7 @@ static APR_INLINE void force_type_handler(rewriterule_entry *p,
|
||||
}
|
||||
|
||||
if (p->forced_handler) {
|
||||
- expanded = do_expand(p->forced_handler, ctx, p);
|
||||
+ expanded = do_expand(p->forced_handler, ctx, p, NULL);
|
||||
|
||||
if (*expanded) {
|
||||
ap_str_tolower(expanded);
|
||||
@@ -4329,12 +4394,18 @@ static rule_return_type apply_rewrite_rule(rewriterule_entry *p,
|
||||
|
||||
/* expand the result */
|
||||
if (!(p->flags & RULEFLAG_NOSUB)) {
|
||||
- newuri = do_expand(p->output, ctx, p);
|
||||
+ int unsafe_qmark = -1;
|
||||
+
|
||||
+ if (p->flags & RULEFLAG_UNSAFE_ALLOW3F) {
|
||||
+ newuri = do_expand(p->output, ctx, p, NULL);
|
||||
+ }
|
||||
+ else {
|
||||
+ newuri = do_expand(p->output, ctx, p, &unsafe_qmark);
|
||||
+ }
|
||||
rewritelog((r, 2, ctx->perdir, "rewrite '%s' -> '%s'", ctx->uri,
|
||||
newuri));
|
||||
- if (!(p->flags & RULEFLAG_UNSAFE_ALLOW3F) &&
|
||||
- ap_strcasestr(r->unparsed_uri, "%3f") &&
|
||||
- ap_strchr_c(newuri, '?')) {
|
||||
+
|
||||
+ if (unsafe_qmark > 0) {
|
||||
ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, APLOGNO(10508)
|
||||
"Unsafe URL with %%3f URL rewritten without "
|
||||
"UnsafeAllow3F");
|
||||
|
21
httpd.spec
21
httpd.spec
@ -24,8 +24,8 @@
|
||||
|
||||
Summary: Apache HTTP Server
|
||||
Name: httpd
|
||||
Version: 2.4.62
|
||||
Release: 5%{?dist}
|
||||
Version: 2.4.63
|
||||
Release: 1%{?dist}
|
||||
URL: https://httpd.apache.org/
|
||||
Source0: https://www.apache.org/dist/httpd/httpd-%{version}.tar.bz2
|
||||
Source1: https://www.apache.org/dist/httpd/httpd-%{version}.tar.bz2.asc
|
||||
@ -94,19 +94,16 @@ Patch27: httpd-2.4.43-sslciphdefault.patch
|
||||
Patch29: httpd-2.4.43-sslprotdefault.patch
|
||||
Patch30: httpd-2.4.43-logjournal.patch
|
||||
Patch31: httpd-2.4.53-separate-systemd-fns.patch
|
||||
Patch32: httpd-2.4.58-r1912477+.patch
|
||||
Patch33: httpd-2.4.54-selinux.patch
|
||||
Patch32: httpd-2.4.54-selinux.patch
|
||||
# https://bugzilla.redhat.com/show_bug.cgi?id=1949606
|
||||
Patch34: httpd-2.4.62-freebind.patch
|
||||
Patch33: httpd-2.4.62-freebind.patch
|
||||
# https://bugzilla.redhat.com/show_bug.cgi?id=1947496
|
||||
Patch35: httpd-2.4.62-proxy-ws-idle-timeout.patch
|
||||
Patch34: httpd-2.4.62-proxy-ws-idle-timeout.patch
|
||||
|
||||
# Bug fixes
|
||||
# https://bugzilla.redhat.com/show_bug.cgi?id=1397243
|
||||
Patch60: httpd-2.4.43-enable-sslv3.patch
|
||||
Patch61: httpd-2.4.59-no-engine.patch
|
||||
# https://bz.apache.org/bugzilla/show_bug.cgi?id=69197
|
||||
Patch62: httpd-2.4.62-r1919325.patch
|
||||
|
||||
# Security fixes
|
||||
# Patch200: ...
|
||||
@ -831,6 +828,14 @@ exit $rv
|
||||
%{_rpmconfigdir}/macros.d/macros.httpd
|
||||
|
||||
%changelog
|
||||
* Mon Jan 27 2025 Luboš Uhliarik <luhliari@redhat.com> - 2.4.63-1
|
||||
- new version 2.4.63
|
||||
- Resolves: RHEL-76358 - httpd rebase to 2.4.63
|
||||
- Resolves: RHEL-73414 - RewriteRule proxying to UDS (unix domain socket)
|
||||
configured in .htaccess doesn't work on httpd-2.4.62-1
|
||||
- Resolves: RHEL-66489 - Apache HTTPD no longer parse PHP files with unicode
|
||||
characters in the name
|
||||
|
||||
* Tue Oct 29 2024 Troy Dawson <tdawson@redhat.com> - 2.4.62-5
|
||||
- Bump release for October 2024 mass rebuild:
|
||||
Resolves: RHEL-64018
|
||||
|
4
sources
4
sources
@ -1,3 +1,3 @@
|
||||
SHA512 (httpd-2.4.62.tar.bz2) = 7db1876805d5c0f60f49bcb51f75cdf567120f2ff6349e68f084e9a86ae38265d9f1c67e7fca0082c9db136f3c408a88501ee11f26b1b68724ba240867171d77
|
||||
SHA512 (httpd-2.4.62.tar.bz2.asc) = ed4d59fca7e134aa378dddfd0d62973da99fe77a82a48e268e11262af8aca4a4e90133cc979fb39a4f9cb33abbebb10b1345cb52cfad6eb58fc84d3308bc5a39
|
||||
SHA512 (httpd-2.4.63.tar.bz2) = a804ca564dfee5907fe4ce4f36884815bace0621bc7b8c9aa7c99472a954aa19cb13733f90678ff3d58ab3c76cc0e33a27e1035dc1d8cb597a9622154c59ef48
|
||||
SHA512 (httpd-2.4.63.tar.bz2.asc) = 3496290be3ff202c820636f6c1548dda363eb6a5c6c1ae88e7154eb839a71c32b6531a33a5a62159601d4a079ed6d7bbbfcf9cbe143d0941b3ffcbed783db9bf
|
||||
SHA512 (KEYS) = 88c848b7ab9e4915d6625dcad3e8328673b0448f2ce76f2c44eecc612cf6afbce3287a4ee7219a44c6fcc61d5ecb2a1a8545456a4a16b90400263d7249cbf192
|
||||
|
Loading…
Reference in New Issue
Block a user