From 17e874e2781c1bbbeb2213bd580d371a1091085b Mon Sep 17 00:00:00 2001
From: Eric Covener
Date: Sun, 26 Apr 2026 15:47:51 +0000
Subject: [PATCH 01/18] fix length checks in AJP msg_get functions
git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1933340 13f79535-47bb-0310-9956-ffa450edef68
---
modules/proxy/ajp_msg.c | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/modules/proxy/ajp_msg.c b/modules/proxy/ajp_msg.c
index b5b3f2c07bf..0be63218951 100644
--- a/modules/proxy/ajp_msg.c
+++ b/modules/proxy/ajp_msg.c
@@ -395,7 +395,7 @@ apr_status_t ajp_msg_get_uint32(ajp_msg_t *msg, apr_uint32_t *rvalue)
{
apr_uint32_t value;
- if ((msg->pos + 3) > msg->len) {
+ if ((msg->pos + 3) >= msg->len) {
return ajp_log_overflow(msg, "ajp_msg_get_uint32");
}
@@ -420,7 +420,7 @@ apr_status_t ajp_msg_get_uint16(ajp_msg_t *msg, apr_uint16_t *rvalue)
{
apr_uint16_t value;
- if ((msg->pos + 1) > msg->len) {
+ if ((msg->pos + 1) >= msg->len) {
return ajp_log_overflow(msg, "ajp_msg_get_uint16");
}
@@ -443,7 +443,7 @@ apr_status_t ajp_msg_peek_uint16(ajp_msg_t *msg, apr_uint16_t *rvalue)
{
apr_uint16_t value;
- if ((msg->pos + 1) > msg->len) {
+ if ((msg->pos + 1) >= msg->len) {
return ajp_log_overflow(msg, "ajp_msg_peek_uint16");
}
@@ -464,7 +464,7 @@ apr_status_t ajp_msg_peek_uint16(ajp_msg_t *msg, apr_uint16_t *rvalue)
*/
apr_status_t ajp_msg_peek_uint8(ajp_msg_t *msg, apr_byte_t *rvalue)
{
- if (msg->pos > msg->len) {
+ if (msg->pos >= msg->len) {
return ajp_log_overflow(msg, "ajp_msg_peek_uint8");
}
@@ -482,7 +482,7 @@ apr_status_t ajp_msg_peek_uint8(ajp_msg_t *msg, apr_byte_t *rvalue)
apr_status_t ajp_msg_get_uint8(ajp_msg_t *msg, apr_byte_t *rvalue)
{
- if (msg->pos > msg->len) {
+ if (msg->pos >= msg->len) {
return ajp_log_overflow(msg, "ajp_msg_get_uint8");
}
From 250fa4a42f43a6ddf99861dfa910971eff69eced Mon Sep 17 00:00:00 2001
From: Eric Covener
Date: Sun, 26 Apr 2026 15:50:18 +0000
Subject: [PATCH 02/18] fix ajp_msg_get_string buffer checks
git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1933342 13f79535-47bb-0310-9956-ffa450edef68
---
modules/proxy/ajp_msg.c | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/modules/proxy/ajp_msg.c b/modules/proxy/ajp_msg.c
index 0be63218951..e10db7a0a53 100644
--- a/modules/proxy/ajp_msg.c
+++ b/modules/proxy/ajp_msg.c
@@ -507,7 +507,12 @@ apr_status_t ajp_msg_get_string(ajp_msg_t *msg, const char **rvalue)
status = ajp_msg_get_uint16(msg, &size);
start = msg->pos;
- if ((status != APR_SUCCESS) || (size + start > msg->max_size)) {
+ if ((status != APR_SUCCESS) || (size + start >= msg->len)) {
+ return ajp_log_overflow(msg, "ajp_msg_get_string");
+ }
+
+ /* Verify that the expected null terminator is actually present */
+ if (msg->buf[start + size] != '\0') {
return ajp_log_overflow(msg, "ajp_msg_get_string");
}
From 91d14cb926b1be8a53ebc334d6274027be99ac12 Mon Sep 17 00:00:00 2001
From: Eric Covener
Date: Sun, 26 Apr 2026 15:53:19 +0000
Subject: [PATCH 03/18] fix ajp_parse_data message len check
git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1933344 13f79535-47bb-0310-9956-ffa450edef68
---
modules/proxy/ajp_header.c | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/modules/proxy/ajp_header.c b/modules/proxy/ajp_header.c
index 00db324e426..358ee084ec2 100644
--- a/modules/proxy/ajp_header.c
+++ b/modules/proxy/ajp_header.c
@@ -835,6 +835,11 @@ apr_status_t ajp_parse_data(request_rec *r, ajp_msg_t *msg,
* 1 : The last byte of this message always seems to be
* 0x00 and is not part of the chunk.
*/
+ if (msg->len < AJP_HEADER_LEN + AJP_HEADER_SZ_LEN + 1 + 1) {
+ ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, APLOGNO()
+ "ajp_parse_data: Message too small");
+ return AJP_EBAD_HEADER;
+ }
expected_len = msg->len - (AJP_HEADER_LEN + AJP_HEADER_SZ_LEN + 1 + 1);
if (*len != expected_len) {
ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, APLOGNO(00998)
From 4de144d2c7df628b27bb17b67bef65d9f8838390 Mon Sep 17 00:00:00 2001
From: Eric Covener
Date: Sun, 26 Apr 2026 15:54:12 +0000
Subject: [PATCH 04/18] lognos for r1933344
git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1933345 13f79535-47bb-0310-9956-ffa450edef68
---
docs/log-message-tags/next-number | 2 +-
modules/proxy/ajp_header.c | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/docs/log-message-tags/next-number b/docs/log-message-tags/next-number
index e5de12ffb20..37eec710963 100644
--- a/docs/log-message-tags/next-number
+++ b/docs/log-message-tags/next-number
@@ -1 +1 @@
-10546
+10547
diff --git a/modules/proxy/ajp_header.c b/modules/proxy/ajp_header.c
index 358ee084ec2..334d0aebb12 100644
--- a/modules/proxy/ajp_header.c
+++ b/modules/proxy/ajp_header.c
@@ -836,7 +836,7 @@ apr_status_t ajp_parse_data(request_rec *r, ajp_msg_t *msg,
* 0x00 and is not part of the chunk.
*/
if (msg->len < AJP_HEADER_LEN + AJP_HEADER_SZ_LEN + 1 + 1) {
- ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, APLOGNO()
+ ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, APLOGNO(10546)
"ajp_parse_data: Message too small");
return AJP_EBAD_HEADER;
}
From 76dac5d445a36751f4b9f8c3abd8f10b07904528 Mon Sep 17 00:00:00 2001
From: Eric Covener
Date: Sun, 26 Apr 2026 15:57:15 +0000
Subject: [PATCH 05/18] fix ajp_msg_check_header check
git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1933347 13f79535-47bb-0310-9956-ffa450edef68
---
modules/proxy/ajp_msg.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/modules/proxy/ajp_msg.c b/modules/proxy/ajp_msg.c
index e10db7a0a53..349b5d7e08c 100644
--- a/modules/proxy/ajp_msg.c
+++ b/modules/proxy/ajp_msg.c
@@ -166,11 +166,11 @@ apr_status_t ajp_msg_check_header(ajp_msg_t *msg, apr_size_t *len)
msglen = ((head[2] & 0xff) << 8);
msglen += (head[3] & 0xFF);
- if (msglen > msg->max_size) {
+ if (msglen > (msg->max_size - AJP_HEADER_LEN)) {
ap_log_error(APLOG_MARK, APLOG_ERR, 0, NULL, APLOGNO(01081)
"ajp_msg_check_header() incoming message is "
"too big %" APR_SIZE_T_FMT ", max is %" APR_SIZE_T_FMT,
- msglen, msg->max_size);
+ msglen, msg->max_size - AJP_HEADER_LEN);
return AJP_ETOBIG;
}
From cfb8882f04b1c986656f6b19c487ab27810071b9 Mon Sep 17 00:00:00 2001
From: Eric Covener
Date: Sun, 26 Apr 2026 15:59:34 +0000
Subject: [PATCH 06/18] use AP_EXPR_FLAG_RESTRICTED in htaccess
git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1933349 13f79535-47bb-0310-9956-ffa450edef68
---
modules/mappers/mod_rewrite.c | 7 ++++++-
modules/metadata/mod_setenvif.c | 8 +++++++-
modules/proxy/mod_proxy_fcgi.c | 11 +++++++++--
3 files changed, 22 insertions(+), 4 deletions(-)
diff --git a/modules/mappers/mod_rewrite.c b/modules/mappers/mod_rewrite.c
index 638682a375c..75b41110b31 100644
--- a/modules/mappers/mod_rewrite.c
+++ b/modules/mappers/mod_rewrite.c
@@ -3686,12 +3686,17 @@ static const char *cmd_rewritecond(cmd_parms *cmd, void *in_dconf,
newcond->regexp = regexp;
}
else if (newcond->ptype == CONDPAT_AP_EXPR) {
+ int in_htaccess = cmd->pool == cmd->temp_pool;
unsigned int flags = newcond->flags & CONDFLAG_NOVARY ?
AP_EXPR_FLAG_DONT_VARY : 0;
+ /* Use restricted ap_expr() parser in htaccess context. */
+ if (in_htaccess) flags |= AP_EXPR_FLAG_RESTRICTED;
newcond->expr = ap_expr_parse_cmd(cmd, a2, flags, &err, NULL);
if (err)
return apr_psprintf(cmd->pool, "RewriteCond: cannot compile "
- "expression \"%s\": %s", a2, err);
+ "expression%s \"%s\" %s",
+ in_htaccess ? " in htaccess context" : "",
+ a2, err);
}
return NULL;
diff --git a/modules/metadata/mod_setenvif.c b/modules/metadata/mod_setenvif.c
index 97e6106d966..89dd394e74d 100644
--- a/modules/metadata/mod_setenvif.c
+++ b/modules/metadata/mod_setenvif.c
@@ -435,6 +435,12 @@ static const char *add_setenvifexpr(cmd_parms *cmd, void *mconfig,
sei_cfg_rec *sconf;
sei_entry *new;
const char *err;
+ unsigned int flags = 0;
+
+ /* Use restricted ap_expr() parser in htaccess context. */
+ if (cmd->pool == cmd->temp_pool) {
+ flags |= AP_EXPR_FLAG_RESTRICTED;
+ }
/*
* Determine from our context into which record to put the entry.
@@ -458,7 +464,7 @@ static const char *add_setenvifexpr(cmd_parms *cmd, void *mconfig,
new->regex = NULL;
new->pattern = NULL;
new->preg = NULL;
- new->expr = ap_expr_parse_cmd(cmd, expr, 0, &err, NULL);
+ new->expr = ap_expr_parse_cmd(cmd, expr, flags, &err, NULL);
if (err)
return apr_psprintf(cmd->pool, "Could not parse expression \"%s\": %s",
expr, err);
diff --git a/modules/proxy/mod_proxy_fcgi.c b/modules/proxy/mod_proxy_fcgi.c
index d5a52596969..af3fb896bc0 100644
--- a/modules/proxy/mod_proxy_fcgi.c
+++ b/modules/proxy/mod_proxy_fcgi.c
@@ -1342,9 +1342,15 @@ static const char *cmd_setenv(cmd_parms *cmd, void *in_dconf,
const char *err;
sei_entry *new;
const char *envvar = arg2;
+ unsigned int flags = 0;
+
+ /* Use restricted ap_expr() parser in htaccess context. */
+ if (cmd->pool == cmd->temp_pool) {
+ flags |= AP_EXPR_FLAG_RESTRICTED;
+ }
new = apr_array_push(dconf->env_fixups);
- new->cond = ap_expr_parse_cmd(cmd, arg1, 0, &err, NULL);
+ new->cond = ap_expr_parse_cmd(cmd, arg1, flags, &err, NULL);
if (err) {
return apr_psprintf(cmd->pool, "Could not parse expression \"%s\": %s",
arg1, err);
@@ -1371,7 +1377,8 @@ static const char *cmd_setenv(cmd_parms *cmd, void *in_dconf,
arg3 = "";
}
- new->subst = ap_expr_parse_cmd(cmd, arg3, AP_EXPR_FLAG_STRING_RESULT, &err, NULL);
+ flags |= AP_EXPR_FLAG_STRING_RESULT;
+ new->subst = ap_expr_parse_cmd(cmd, arg3, flags, &err, NULL);
if (err) {
return apr_psprintf(cmd->pool, "Could not parse expression \"%s\": %s",
arg3, err);
From 08b7b9765602093f05de7c91260076ab73099fc4 Mon Sep 17 00:00:00 2001
From: Eric Covener
Date: Sun, 26 Apr 2026 16:01:59 +0000
Subject: [PATCH 07/18] ocsp limits
git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1933351 13f79535-47bb-0310-9956-ffa450edef68
---
modules/md/md_ocsp.c | 22 +++++++++++++++++++++-
1 file changed, 21 insertions(+), 1 deletion(-)
diff --git a/modules/md/md_ocsp.c b/modules/md/md_ocsp.c
index 74dd49058a8..aee799a7b39 100644
--- a/modules/md/md_ocsp.c
+++ b/modules/md/md_ocsp.c
@@ -46,7 +46,21 @@
#include "md_ocsp.h"
#define MD_OCSP_ID_LENGTH SHA_DIGEST_LENGTH
-
+
+/* Max acceptable OCSP response size (DER-encoded responses are typically <2 KiB) */
+#define MD_OCSP_MAX_RESPONSE_LEN (64 * 1024)
+/* Timeout for OCSP responses */
+#define MD_OCSP_DEFAULT_TIMEOUT apr_time_from_sec(60)
+/* Timeout for connecting to OCSP servers */
+#define MD_OCSP_CONNECT_TIMEOUT apr_time_from_sec(30)
+/*
+ * Below this throughput in bytes per second an OCSP response is regarded as
+ * stalled.
+ */
+#define MD_OCSP_STALLING_BYTES 10
+/* Maximum duration for a stalled period during an OCSP response */
+#define MD_OCSP_STALLING_TIME apr_time_from_sec(30)
+
struct md_ocsp_reg_t {
apr_pool_t *p;
md_store_t *store;
@@ -901,6 +915,12 @@ void md_ocsp_renew(md_ocsp_reg_t *reg, apr_pool_t *p, apr_pool_t *ptemp, apr_tim
rv = md_http_create(&http, ptemp, reg->user_agent, reg->proxy_url);
if (APR_SUCCESS != rv) goto cleanup;
+
+ md_http_set_response_limit(http, MD_OCSP_MAX_RESPONSE_LEN);
+ md_http_set_timeout_default(http, MD_OCSP_DEFAULT_TIMEOUT);
+ md_http_set_connect_timeout_default(http, MD_OCSP_CONNECT_TIMEOUT);
+ md_http_set_stalling_default(http, MD_OCSP_STALLING_BYTES,
+ MD_OCSP_STALLING_TIME);
rv = md_http_multi_perform(http, next_todo, &ctx);
From 73e7baaccf8ddf62d2b20e74b99b4c3fdd246f87 Mon Sep 17 00:00:00 2001
From: Eric Covener
Date: Sun, 26 Apr 2026 16:04:17 +0000
Subject: [PATCH 08/18] mod_dav_lock: use the right dav_lock_discovery
git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1933353 13f79535-47bb-0310-9956-ffa450edef68
---
modules/dav/lock/locks.c | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)
diff --git a/modules/dav/lock/locks.c b/modules/dav/lock/locks.c
index e85e288b326..b36f846d796 100644
--- a/modules/dav/lock/locks.c
+++ b/modules/dav/lock/locks.c
@@ -1190,13 +1190,13 @@ static dav_error * dav_generic_refresh_locks(dav_lockdb *lockdb,
}
if (dav_generic_do_refresh(dp_scan, ltl, new_time)) {
/* the lock was refreshed. return the lock. */
- newlock = dav_generic_alloc_lock(lockdb, ip->key, dp->locktoken);
+ newlock = dav_generic_alloc_lock(lockdb, ip->key, dp_scan->locktoken);
newlock->is_locknull = !resource->exists;
- newlock->scope = dp->f.scope;
- newlock->type = dp->f.type;
- newlock->depth = dp->f.depth;
- newlock->timeout = dp->f.timeout;
- newlock->owner = dp->owner;
+ newlock->scope = dp_scan->f.scope;
+ newlock->type = dp_scan->f.type;
+ newlock->depth = dp_scan->f.depth;
+ newlock->timeout = dp_scan->f.timeout;
+ newlock->owner = dp_scan->owner;
newlock->auth_user = dp_scan->auth_user;
newlock->next = *locks;
From cd414337011b47f43ede96ce1dd2bd9c869e031f Mon Sep 17 00:00:00 2001
From: Eric Covener
Date: Sun, 26 Apr 2026 16:25:43 +0000
Subject: [PATCH 09/18] mod_auth_digest: use apr_crypto_equals
git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1933355 13f79535-47bb-0310-9956-ffa450edef68
---
configure.in | 4 ++--
modules/aaa/mod_auth_digest.c | 45 ++++++++++++++---------------------
2 files changed, 20 insertions(+), 29 deletions(-)
diff --git a/configure.in b/configure.in
index 57f20ea824b..2ba4c6f7100 100644
--- a/configure.in
+++ b/configure.in
@@ -444,10 +444,10 @@ if test "${apu_found}" = "yes"; then
# we need to add the APR includes to CPPFLAGS
apu_ckver_CPPFLAGS="$CPPFLAGS"
CPPFLAGS="$CPPFLAGS `$apr_config --includes`"
- APACHE_CHECK_APxVER([apu], 1, 3)
+ APACHE_CHECK_APxVER([apu], 1, 6)
CPPFLAGS="$apu_ckver_CPPFLAGS"
else
- APACHE_CHECK_APxVER([apu], 1, 3)
+ APACHE_CHECK_APxVER([apu], 1, 6)
fi
fi
diff --git a/modules/aaa/mod_auth_digest.c b/modules/aaa/mod_auth_digest.c
index c15514b9eac..ac02e6b9673 100644
--- a/modules/aaa/mod_auth_digest.c
+++ b/modules/aaa/mod_auth_digest.c
@@ -73,6 +73,7 @@
#include "apr_shm.h"
#include "apr_rmm.h"
#include "ap_provider.h"
+#include "apr_crypto.h" /* for apr_crypto_equals */
#include "mod_auth.h"
@@ -99,10 +100,17 @@ typedef struct digest_config_struct {
#define DFLT_NONCE_LIFE apr_time_from_sec(300)
#define NEXTNONCE_DELTA apr_time_from_sec(30)
-
+/* The server nonce has fixed length and is the concatenation of:
+ * base64(apr_time_t timestamp) + hex(SHA1(realm+time[+opaque])) */
#define NONCE_TIME_LEN (((sizeof(apr_time_t)+2)/3)*4)
#define NONCE_HASH_LEN (2*APR_SHA1_DIGESTSIZE)
#define NONCE_LEN (int )(NONCE_TIME_LEN + NONCE_HASH_LEN)
+/* Evaluates to true if nonce string is valid. Since the time part of
+ * the nonce is a base64 encoding of an apr_time_t (8 bytes), it
+ * must end with a '='. */
+#define VALID_NONCE(n_) ((n_) && strlen((n_)) == NONCE_LEN && (n_)[NONCE_TIME_LEN - 1] == '=')
+
+#define MD5_DIGEST_LEN (2*APR_MD5_DIGESTSIZE) /* ignoring trailing \0 */
#define SECRET_LEN 20
#define RETAINED_DATA_ID "mod_auth_digest"
@@ -1013,8 +1021,9 @@ static int get_digest_rec(request_rec *r, digest_header_rec *resp)
resp->nonce_count = apr_pstrdup(r->pool, value);
}
- if (!resp->username || !resp->realm || !resp->nonce || !resp->uri
- || !resp->digest
+ if (!resp->username || !resp->realm || !resp->uri
+ || !VALID_NONCE(resp->nonce)
+ || !resp->digest || strlen(resp->digest) != MD5_DIGEST_LEN
|| (resp->message_qop && (!resp->cnonce || !resp->nonce_count))) {
resp->auth_hdr_sts = INVALID;
return !OK;
@@ -1066,14 +1075,9 @@ static int parse_hdr_and_update_nc(request_rec *r)
}
-/*
- * Nonce generation code
- */
-
-/* The hash part of the nonce is a SHA-1 hash of the time, realm, server host
- * and port, opaque, and our secret.
- */
-static void gen_nonce_hash(char *hash, const char *timestr, const char *opaque,
+/* Writes the hash part of the server nonce to hash, which must be of
+ * minimum size (NONCE_HASH_LEN+1). */
+static void gen_nonce_hash(char hash[NONCE_HASH_LEN+1], const char *timestr, const char *opaque,
const server_rec *server,
const digest_config_rec *conf,
const char *realm)
@@ -1427,19 +1431,6 @@ static int check_nonce(request_rec *r, digest_header_rec *resp,
time_rec nonce_time;
char tmp, hash[NONCE_HASH_LEN+1];
- /* Since the time part of the nonce is a base64 encoding of an
- * apr_time_t (8 bytes), it should end with a '=', fail early otherwise.
- */
- if (strlen(resp->nonce) != NONCE_LEN
- || resp->nonce[NONCE_TIME_LEN - 1] != '=') {
- ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, APLOGNO(01775)
- "invalid nonce '%s' received - length is not %d "
- "or time encoding is incorrect",
- resp->nonce, NONCE_LEN);
- note_digest_auth_failure(r, conf, resp, 1);
- return HTTP_UNAUTHORIZED;
- }
-
tmp = resp->nonce[NONCE_TIME_LEN];
resp->nonce[NONCE_TIME_LEN] = '\0';
apr_base64_decode_binary(nonce_time.arr, resp->nonce);
@@ -1447,7 +1438,7 @@ static int check_nonce(request_rec *r, digest_header_rec *resp,
resp->nonce[NONCE_TIME_LEN] = tmp;
resp->nonce_time = nonce_time.time;
- if (strcmp(hash, resp->nonce+NONCE_TIME_LEN)) {
+ if (!apr_crypto_equals(hash, resp->nonce+NONCE_TIME_LEN, NONCE_HASH_LEN)) {
ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, APLOGNO(01776)
"invalid nonce %s received - hash is not %s",
resp->nonce, hash);
@@ -1778,7 +1769,7 @@ static int authenticate_digest_user(request_rec *r)
if (resp->message_qop == NULL) {
/* old (rfc-2069) style digest */
- if (strcmp(resp->digest, old_digest(r, resp))) {
+ if (!apr_crypto_equals(resp->digest, old_digest(r, resp), MD5_DIGEST_LEN)) {
ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, APLOGNO(01792)
"user %s: password mismatch: %s", r->user,
r->uri);
@@ -1813,7 +1804,7 @@ static int authenticate_digest_user(request_rec *r)
/* we failed to allocate a client struct */
return HTTP_INTERNAL_SERVER_ERROR;
}
- if (strcmp(resp->digest, exp_digest)) {
+ if (!apr_crypto_equals(resp->digest, exp_digest, MD5_DIGEST_LEN)) {
ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, APLOGNO(01794)
"user %s: password mismatch: %s", r->user,
r->uri);
From eecbbca65f3fd09cf0c1aee763bc26b46a46380e Mon Sep 17 00:00:00 2001
From: Eric Covener
Date: Sun, 26 Apr 2026 16:28:47 +0000
Subject: [PATCH 10/18] mod_authn_socache: validate URL earlier
git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1933357 13f79535-47bb-0310-9956-ffa450edef68
---
modules/aaa/mod_authn_socache.c | 5 ++---
1 file changed, 2 insertions(+), 3 deletions(-)
diff --git a/modules/aaa/mod_authn_socache.c b/modules/aaa/mod_authn_socache.c
index 92202b16b20..c5461d8f624 100644
--- a/modules/aaa/mod_authn_socache.c
+++ b/modules/aaa/mod_authn_socache.c
@@ -265,11 +265,10 @@ static const command_rec authn_cache_cmds[] =
static const char *construct_key(request_rec *r, const char *context,
const char *user, const char *realm)
{
+ const char *slash = ap_strrchr_c(r->uri, '/');
/* handle "special" context values */
- if (!strcmp(context, directory)) {
- /* FIXME: are we at risk of this blowing up? */
+ if (!strcmp(context, directory) && slash) {
char *new_context;
- char *slash = strrchr(r->uri, '/');
new_context = apr_palloc(r->pool, slash - r->uri +
strlen(r->server->server_hostname) + 1);
strcpy(new_context, r->server->server_hostname);
From 38809faac18bfc8e610b4196c6dad6f481aa1376 Mon Sep 17 00:00:00 2001
From: Eric Covener
Date: Sun, 26 Apr 2026 16:30:43 +0000
Subject: [PATCH 11/18] scan outgoing status line for newlines and controls
git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1933359 13f79535-47bb-0310-9956-ffa450edef68
---
modules/http/http_filters.c | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/modules/http/http_filters.c b/modules/http/http_filters.c
index 004c3c2a6bf..8e5f76102ea 100644
--- a/modules/http/http_filters.c
+++ b/modules/http/http_filters.c
@@ -990,6 +990,11 @@ static apr_status_t validate_status_line(request_rec *r)
r->status_line = apr_pstrcat(r->pool, r->status_line, " ", NULL);
return APR_EGENERAL;
}
+ /* Check for newlines and control characters */
+ if (len > 4 && *ap_scan_http_field_content(r->status_line + 4)) {
+ r->status_line = NULL;
+ return APR_EGENERAL;
+ }
return APR_SUCCESS;
}
return APR_EGENERAL;
From cfc11fcca357c1c1c0a92c2e0b2cb3f252e01038 Mon Sep 17 00:00:00 2001
From: Lucien Gentis
Date: Mon, 27 Apr 2026 12:30:57 +0000
Subject: [PATCH 12/18] fr doc XML files updates.
git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1933384 13f79535-47bb-0310-9956-ffa450edef68
---
docs/manual/glossary.xml.fr | 52 +++----
docs/manual/platform/windows.xml.fr | 182 ++++++++++++-------------
docs/manual/programs/apxs.xml.fr | 132 ++++++++++--------
docs/manual/programs/configure.xml.fr | 33 ++---
docs/manual/programs/htdigest.xml.fr | 6 +-
docs/manual/programs/logresolve.xml.fr | 8 +-
docs/manual/rewrite/vhosts.xml.fr | 20 +--
7 files changed, 226 insertions(+), 207 deletions(-)
diff --git a/docs/manual/glossary.xml.fr b/docs/manual/glossary.xml.fr
index abbd1457895..49f80c4996f 100644
--- a/docs/manual/glossary.xml.fr
+++ b/docs/manual/glossary.xml.fr
@@ -3,7 +3,7 @@
-
+
+
@@ -31,17 +31,17 @@
Ce document décrit l'installation, la configuration et
- l'exécution d'Apache 2.&httpd.minor; sous Microsoft Windows. Si vous avez des
+ l'exécution du serveur HTTP Apache 2.&httpd.minor; sous Microsoft Windows. Si vous avez des
questions après avoir lu la documentation, ou si vous avez rencontré
des évènements particuliers ou des rapports d'erreur, vous pouvez
consultez la liste
de diffusion de la communauté des utilisateurs.
Dans ce document, nous supposons que vous installez une
- distribution binaire d'Apache. Si vous voulez compiler Apache
+ distribution binaire d'httpd. Si vous voulez compiler httpd
vous-même (par exemple pour aider au développement ou pour
rechercher des bogues), référez-vous au document Compilation d'Apache pour Microsoft
+ href="win_compiling.html">Compilation de httpd pour Microsoft
Windows.
@@ -49,7 +49,7 @@
Prérequis du système d'exploitation
- La plate-forme Windows de base pour l'exécution d'Apache 2.&httpd.minor; est
+
La plate-forme Windows de base pour l'exécution de httpd 2.&httpd.minor; est
Windows 2000 ou supérieur. Veillez à toujours vous procurer et installer le
dernier service pack afin d'éviter les bogues du système
d'exploitation.
@@ -61,7 +61,7 @@
- Téléchargement d'Apache pour Windows
+ Téléchargement de httpd pour Windows
Le projet du serveur HTTP Apache proprement dit ne fournit pas de
distribution binaire mais seulement le code source. Certains membres
@@ -83,12 +83,12 @@
- Personnaliser Apache pour Windows
+ Personnaliser httpd pour Windows
- La configuration d'Apache est enregistrée dans les fichiers du
+
La configuration de httpd est enregistrée dans les fichiers du
sous-répertoire conf. Ce sont les même fichiers que
ceux utilisés pour configurer la version Unix, mais il y a quelques
- directives spécifiques à Apache pour Windows. Voir l'index des directives pour la liste
des directives disponibles.
@@ -100,12 +100,12 @@
modifier la racine de l'installation par défaut, ou même la structure
complète de la configuration initiale.
- Les principales spécificités d'Apache pour Windows sont :
+ Les principales spécificités de httpd pour Windows sont :
- Comme Apache pour Windows est un programme multithread, il
- ne lance pas de processus séparé pour chaque requête, comme Apache
+
Comme httpd pour Windows est un programme multithread, il
+ ne lance pas de processus séparé pour chaque requête, comme httpd
peut le faire sous Unix. En fait, il n'y a en général que deux
- processus Apache en exécution : un processus parent, et un
+ processus httpd en exécution : un processus parent, et un
processus enfant qui traite les requêtes. Chaque requête est
traitée par un thread séparé au sein du processus enfant.
@@ -139,7 +139,7 @@
Les directives qui acceptent des noms de fichiers comme
arguments doivent utiliser des noms de fichiers Windows et non
- Unix. Cependant, comme Apache peut interpréter les anti-slashes
+ Unix. Cependant, comme httpd peut interpréter les anti-slashes
comme des séquences d'échappement de caractères, vous devez
absolument utiliser des slashes dans les noms de chemins à la
place des anti-slashes.
@@ -167,19 +167,19 @@ RewriteCond "%{REQUEST_URI}" "[A-Z]"
RewriteRule "(.*)" "${lowercase:$1}" [R,L]
- Lors de son exécution, Apache n'a besoin d'un accès en
+
Lors de son exécution, httpd n'a besoin d'un accès en
écriture qu'au répertoire des journaux et à toute arborescence de
répertoires de cache configurée. Suite au problème d'insensibilité
- à la casse et au format de noms courts 8.3, Apache doit valider
+ à la casse et au format de noms courts 8.3, httpd doit valider
tous les noms de chemins fournis. Cela signifie que chaque
- répertoire qu'Apache évalue doit avoir les droits en lecture,
+ répertoire que httpd évalue doit avoir les droits en lecture,
listage et parcours, et ceci depuis la racine jusqu'aux feuilles.
Si Apache2.&httpd.minor; est installé dans C:\Program Files, le répertoire
racine, Program Files et Apache2.&httpd.minor; doivent tous être visibles pour
- Apache
+ httpd
- Apache peut charger divers modules sans qu'il soit nécessaire
- de recompiler le serveur. Si Apache est compilé
+
httpd peut charger divers modules sans qu'il soit nécessaire
+ de recompiler le serveur. Si httpd est compilé
normalement, il va installer de nombreux modules optionnels dans
le répertoire \Apache2.&httpd.minor;\modules. Pour activer ces
modules ou d'autres modules, on doit utiliser la
@@ -196,16 +196,16 @@ RewriteRule "(.*)" "${lowercase:$1}" [R,L]
href="../mod/mod_so.html#creating">créer des modules
chargeables
- Apache peut aussi charger des extensions ISAPI (Internet
+
httpd peut aussi charger des extensions ISAPI (Internet
Server Application Programming Interface), comme celles qu'utilise
Microsoft IIS et d'autres serveurs Windows. Voir ici pour plus
- d'informations. Notez qu'Apache ne peut pas
+ d'informations. Notez que httpd ne peut pas
charger de filtres ISAPI, et que les gestionnaires ISAPI contenant
des extensions de fonctionnalités Microsoft ne fonctionneront
pas.
- Pour les scripts CGI, la méthode qu'utilise Apache pour
+
Pour les scripts CGI, la méthode qu'utilise httpd pour
déterminer l'interpréteur du script est configurable grâce à la
directive ScriptInterpreterSource
@@ -217,9 +217,9 @@ RewriteRule "(.*)" "${lowercase:$1}" [R,L]
module="core">AccessFilename.
Toute erreur survenant au cours du processus de démarrage
- d'Apache est enregistrée dans le journal des évènements de
+ de httpd est enregistrée dans le journal des évènements de
Windows si l'on est sous Windows NT. Ce mécanisme fonctionne comme
- une sauvegarde pour les situations où Apache n'est pas encore prêt
+ une sauvegarde pour les situations où httpd n'est pas encore prêt
à utiliser le fichier error.log. Vous pouvez
consulter le journal des évènements applicatifs Windows en
utilisant l'observateur d'évènements : Démarrage - Paramètres -
@@ -230,24 +230,24 @@ RewriteRule "(.*)" "${lowercase:$1}" [R,L]
- Exécuter Apache en tant que service
+ Exécuter httpd en tant que service
- Apache fournit un utilitaire nommé Apache Service Monitor
- (Moniteur du service Apache). Grâce à lui, vous pouvez voir et gérer
- l'état de tous les services Apache installés sur toutes les machines
- du réseau. Pour pouvoir gérer un service Apache avec le moniteur,
+
httpd fournit un utilitaire nommé Apache Service Monitor
+ (Moniteur du service httpd). Grâce à lui, vous pouvez voir et gérer
+ l'état de tous les services httpd installés sur toutes les machines
+ du réseau. Pour pouvoir gérer un service httpd avec le moniteur,
vous devez d'abord installer le service (soit automatiquement au
cours de l'installation, soit manuellement).
- Vous pouvez installer Apache en tant que service Windows NT à
- partir de la ligne de commandes et depuis le sous-répertoire Apache
+
Vous pouvez installer httpd en tant que service Windows NT à
+ partir de la ligne de commandes et depuis le sous-répertoire httpd
bin comme suit :
httpd.exe -k install
- Si vous avez installé plusieurs services Apache sur votre
+
Si vous avez installé plusieurs services httpd sur votre
ordinateur, vous devrez spécifier le nom du service que vous voulez
installer en utilisant la commande suivante (notez que si vous
spécifiez un nom durant l'installation, vous devrez aussi le
@@ -269,14 +269,14 @@ RewriteRule "(.*)" "${lowercase:$1}" [R,L]
Apache2.&httpd.minor; et le fichier de configuration sera censé
être conf\httpd.conf.
- Supprimer un service Apache est très simple. Utilisez
+
Supprimer un service httpd est très simple. Utilisez
simplement :
httpd.exe -k uninstall
- On peut spécifier un service Apache particulier en utilisant
+
On peut spécifier un service httpd particulier en utilisant
:
@@ -284,10 +284,10 @@ RewriteRule "(.*)" "${lowercase:$1}" [R,L]
Normalement, le démarrage, le redémarrage et l'arrêt d'un
- service Apache s'effectuent via le Moniteur de Service Apache, ou en
+ service httpd s'effectuent via le Moniteur de Service httpd, ou en
utilisant des commandes telles que NET START Apache2.&httpd.minor; et
NET STOP Apache2.&httpd.minor;, ou encore via le gestionnaire de
- services standard de Windows. Avant de démarrer Apache en tant que
+ services standard de Windows. Avant de démarrer httpd en tant que
service dans quelque but que ce soit, vous devez tester le fichier
de configuration du service en utilisant :
@@ -295,15 +295,15 @@ RewriteRule "(.*)" "${lowercase:$1}" [R,L]
httpd.exe -n "Nom-service" -t
- Vous pouvez aussi contrôler un service Apache à l'aide de ses
+
Vous pouvez aussi contrôler un service httpd à l'aide de ses
options de ligne de commande. Avec cette méthode, pour démarrer un
- service Apache installé, vous utiliserez :
+ service httpd installé, vous utiliserez :
httpd.exe -k start -n "Nom-Service"
- Pour arrêter un service Apache via les options de lignes de
+
Pour arrêter un service httpd via les options de lignes de
commande, utilisez ceci :
@@ -323,7 +323,7 @@ RewriteRule "(.*)" "${lowercase:$1}" [R,L]
httpd.exe -k restart -n "Nom-Service"
- Par défaut, tous les services Apache sont configurés pour
+
Par défaut, tous les services httpd sont configurés pour
s'exécuter sous l'utilisateur system (le compte
LocalSystem). Le compte LocalSystem n'a
pas de privilèges sur votre réseau, que ce soit via un mécanisme
@@ -332,14 +332,14 @@ RewriteRule "(.*)" "${lowercase:$1}" [R,L]
élevés en local.
N'accordez jamais de privilèges réseau
- au compte LocalSystem ! Si Apache doit pouvoir accéder
- à des ressources réseau, créez un compte séparé pour Apache comme
+ au compte LocalSystem ! Si httpd doit pouvoir accéder
+ à des ressources réseau, créez un compte séparé pour httpd comme
indiqué ci-dessous.
Il est fortement fortement conseillé aux utilisateurs de créer un
- compte séparé pour exécuter le(s) service(s) Apache, et même
+ compte séparé pour exécuter le(s) service(s) httpd, et même
obligatoire si vous devez accéder à des ressources réseau via
- Apache.
+ httpd.
- Créez un compte d'utilisateur du domaine normal, et
@@ -368,7 +368,7 @@ RewriteRule "(.*)" "${lowercase:$1}" [R,L]
Il est en général de bonne pratique d'accorder à l'utilisateur
- sous lequel le service Apache s'exécute les droits en lecture et
+ sous lequel le service httpd s'exécute les droits en lecture et
exécution (RX) sur l'ensemble du répertoire Apache2.&httpd.minor;, sauf pour le
sous-répertoire logs, sur lequel l'utilisateur doit
avoir au moins les droits de modification (RWXD).
@@ -376,19 +376,19 @@ RewriteRule "(.*)" "${lowercase:$1}" [R,L]
Si vous permettez à ce compte de se connecter en tant
qu'utilisateur et service, vous pouvez ouvrir une session sous ce
compte et vérifier s'il a bien le droit d'exécuter les scripts, de
- lire les pages web, et si vous pouvez démarrer Apache à partir d'une
+ lire les pages web, et si vous pouvez démarrer httpd à partir d'une
console Windows. Si tout fonctionne, et si vous avez suivi les
- étapes ci-dessus, Apache devrait s'exécuter en tant que service sans
+ étapes ci-dessus, httpd devrait s'exécuter en tant que service sans
problème.
Le code d'erreur 2186 indique probablement
- qu'Apache ne peut pas accéder à une ressource réseau nécessaire, et
+ que httpd ne peut pas accéder à une ressource réseau nécessaire, et
que vous devez revoir la configuration "Log On As" (Se connecter en
tant que ...) du service.
- Lorsqu'Apache démarre en tant que service, il se peut que vous
+
Lorsqu'httpd démarre en tant que service, il se peut que vous
obteniez un message d'erreur du Gestionnaire de Services Windows.
- Par exemple, si vous essayez de démarrer Apache en utilisant
+ Par exemple, si vous essayez de démarrer httpd en utilisant
l'applet Services du Panneau de configuration de Windows, vous
pouvez obtenir le message suivant :
@@ -398,9 +398,9 @@ RewriteRule "(.*)" "${lowercase:$1}" [R,L]
Vous obtiendrez cette erreur à caractère général pour tout
- problème survenant au cours du démarrage du service Apache. Afin de
+ problème survenant au cours du démarrage du service httpd. Afin de
déterminer exactement la cause du problème, vous devez suivre les
- instructions permettant d'exécuter Apache pour Windows depuis la
+ instructions permettant d'exécuter httpd pour Windows depuis la
ligne de commande.
Si vous rencontrez des problèmes avec le service, il est
@@ -411,44 +411,44 @@ RewriteRule "(.*)" "${lowercase:$1}" [R,L]
- Exécuter Apache depuis la console
+ Exécuter httpd depuis la console
- Il est en général recommandé d'exécuter Apache en tant que
+
Il est en général recommandé d'exécuter httpd en tant que
service, mais il est parfois plus simple d'utiliser la ligne de
commande, en particulier au cours de la configuration initiale et
les tests.
- Pour exécuter Apache depuis la ligne de commande et en tant
+
Pour exécuter httpd depuis la ligne de commande et en tant
qu'application de console, utilisez la commande suivante :
httpd.exe
- Apache va démarrer, et continuera son exécution jusqu'à ce qu'on
+
httpd va démarrer, et continuera son exécution jusqu'à ce qu'on
l'arrête en tapant Ctrl-C.
- Vous pouvez également démarrer Apache via le raccourci "Démarrer
- Apache dans une console" placé dans Démarrer -->
+ Vous pouvez également démarrer httpd via le raccourci "Démarrer
+ httpd dans une console" placé dans Démarrer -->
Programmes --> Apache HTTP Server 2.&httpd.minor;.xx --> Control Apache
Server au cours de l'installation. Ceci va
- ouvrir une console Windows, et y démarrer Apache.
- Si vous n'avez pas installé Apache en tant que service, la
- fenêtre Windows restera ouverte jusqu'à ce que vous arrêtiez Apache
+ ouvrir une console Windows, et y démarrer httpd.
+ Si vous n'avez pas installé httpd en tant que service, la
+ fenêtre Windows restera ouverte jusqu'à ce que vous arrêtiez httpd
en tapant Ctrl-C dans cette fenêtre. Le serveur va alors s'arrêter
au bout de quelques secondes. Cependant, si vous avez installé
- Apache en tant que service, c'est ce dernier que le raccourci
- ci-dessus va lancer. Si le service Apache est déjà en cours
+ httpd en tant que service, c'est ce dernier que le raccourci
+ ci-dessus va lancer. Si le service httpd est déjà en cours
d'exécution, le raccourci va rester sans effet.
- Si Apache s'exécute en tant que service, vous pouvez l'arrêter en
+
Si httpd s'exécute en tant que service, vous pouvez l'arrêter en
ouvrant une autre console et en entrant :
httpd.exe -k shutdown
- Plutôt que de lancer Apache à partir d'une console, il est
+
Plutôt que de lancer httpd à partir d'une console, il est
préférable de l'exécuter en tant que service car dans ce cas, il
termine proprement les opérations en cours avant de s'éteindre.
@@ -456,9 +456,9 @@ RewriteRule "(.*)" "${lowercase:$1}" [R,L]
l'arrêter qu'en pressant la combinaison de touches Ctrl-C dans la
même fenêtre.
- Vous pouvez aussi redémarrer Apache. Ceci le force à recharger
+
Vous pouvez aussi redémarrer httpd. Ceci le force à recharger
son fichier de configuration. Toute opération en cours peut être
- achevée sans interruption. Pour redémarrer Apache, vous pouvez soit
+ achevée sans interruption. Pour redémarrer httpd, vous pouvez soit
taper Control-Break dans la fenêtre de console que vous avez
utilisée pour le démarrer, soit entrer :
@@ -469,20 +469,20 @@ RewriteRule "(.*)" "${lowercase:$1}" [R,L]
si le serveur s'exécute en tant que service.
Note pour les utilisateurs familiers de la version Unix
- d'Apache : les commandes ci-dessus représentent pour Windows
+ de httpd : les commandes ci-dessus représentent pour Windows
l'équivalent des commandes kill -TERM pid et
kill -USR1 pid. L'option de ligne de commande
-k a été choisie à titre de rapprochement avec la
commande kill utilisée sous Unix.
- Si la fenêtre de la console Apache se ferme immédiatement ou
- inopinément après le démarrage d'Apache, ouvrez une console Windows
+
Si la fenêtre de la console httpd se ferme immédiatement ou
+ inopinément après le démarrage de httpd, ouvrez une console Windows
depuis le menu Démarrer --> Programmes. Placez-vous dans le
- répertoire d'installation d'Apache, tapez la commande
+ répertoire d'installation de httpd, tapez la commande
httpd.exe, et observez le message d'erreur. Allez
ensuite dans le répertoire des journaux, et visualisez le fichier
error.log pour détecter d'éventuelles erreurs de
- configuration. Si Apache a été installé dans C:\Program
+ configuration. Si httpd a été installé dans C:\Program
Files\Apache Software Foundation\Apache2.&httpd.minor;\, vous
pouvez entrer ce qui suit :
@@ -492,7 +492,7 @@ RewriteRule "(.*)" "${lowercase:$1}" [R,L]
httpd.exe
- Attendez ensuite qu'Apache s'arrête ou tapez Ctrl-C. Entrez alors
+
Attendez ensuite que httpd s'arrête ou tapez Ctrl-C. Entrez alors
la commande suivante :
@@ -500,7 +500,7 @@ RewriteRule "(.*)" "${lowercase:$1}" [R,L]
more < error.log
- Lorsqu'on travaille avec Apache, il est important de comprendre
+
Lorsqu'on travaille avec httpd, il est important de comprendre
comment ce dernier trouve son fichier de configuration. Vous pouvez
spécifier un fichier de configuration à partir de la ligne de
commande de deux façons :
@@ -523,7 +523,7 @@ RewriteRule "(.*)" "${lowercase:$1}" [R,L]
L'option -n permet de spécifier le service
- Apache installé dont le fichier de configuration doit être utilisé
+ httpd installé dont le fichier de configuration doit être utilisé
:
@@ -537,18 +537,18 @@ RewriteRule "(.*)" "${lowercase:$1}" [R,L]
dans le fichier de configuration.
Si vous ne spécifiez aucun fichier de configuration à l'aide des
- options -f ou -n, Apache utilisera le nom
+ options -f ou -n, httpd utilisera le nom
du fichier de configuration compilé dans le serveur, en général
conf\httpd.conf. Ce chemin codé en dur est relatif au
répertoire d'installation. Vous pouvez vérifier ce chemin à partir
de la valeur de l'étiquette SERVER_CONFIG_FILE en
- invoquant Apache avec l'option -V, comme ceci :
+ invoquant httpd avec l'option -V, comme ceci :
httpd.exe -V
- Apache va ensuite essayer de déterminer la valeur de son
+
httpd va ensuite essayer de déterminer la valeur de son
ServerRoot en effectuant les
recherches suivantes, dans cet ordre :
@@ -571,19 +571,19 @@ RewriteRule "(.*)" "${lowercase:$1}" [R,L]
Si vous n'avez pas effectué d'installation binaire, dans certains
- scénarios, Apache va signaler l'absence de cette clé de registre.
+ scénarios, httpd va signaler l'absence de cette clé de registre.
On peut passer outre cet avertissement si le serveur a été en mesure
de trouver son fichier de configuration d'une autre manière.
La valeur de cette clé correspond au répertoire ServerRoot qui contient lui-même le
- sous-répertoire conf. Lors de son démarrage, Apache lit
+ sous-répertoire conf. Lors de son démarrage, httpd lit
le fichier httpd.conf à partir de ce répertoire. Si ce
fichier contient une directive ServerRoot qui spécifie un répertoire
- différent de celui que contient la clé de registre ci-dessus, Apache
+ différent de celui que contient la clé de registre ci-dessus, httpd
oubliera la clé de registre, et utilisera le répertoire spécifié par
- le fichier de configuration. Si vous déplacez le répertoire Apache
+ le fichier de configuration. Si vous déplacez le répertoire httpd
ou ses fichiers de configuration, il est vital de mettre à jour la
directive ServerRoot dans
httpd.conf afin de refléter la nouvelle
@@ -594,11 +594,11 @@ RewriteRule "(.*)" "${lowercase:$1}" [R,L]
Vérification de l'installation
- Une fois Apache démarré (soit à partir d'une console Windows,
+
Une fois httpd démarré (soit à partir d'une console Windows,
soit en tant que service), ce dernier va se mettre à l'écoute sur
le port 80 (à moins que vous ayiez modifié la directive Listen dans les fichiers de
- configuration ou que vous ayiez installé Apache pour l'utilisateur
+ configuration ou que vous ayiez installé httpd pour l'utilisateur
courant seulement). Pour vous connecter au serveur et accéder à la
page par défaut, lancez un navigateur et entrez cette URL :
@@ -606,7 +606,7 @@ RewriteRule "(.*)" "${lowercase:$1}" [R,L]
http://localhost/
- Apache devrait renvoyer une page de bienvenue et vous devriez
+
httpd devrait renvoyer une page de bienvenue et vous devriez
voir s'afficher "It Works!". Si rien ne se passe ou si vous obtenez
une erreur, consultez le fichier error.log dans le
sous-répertoire logs. Si votre serveur n'est pas
@@ -618,7 +618,7 @@ RewriteRule "(.*)" "${lowercase:$1}" [R,L]
http://127.0.0.1/
-
Si Apache écoute un port non standard, vous devez le préciser
+
Si httpd écoute un port non standard, vous devez le préciser
explicitement dans l'URL :
@@ -628,14 +628,14 @@ RewriteRule "(.*)" "${lowercase:$1}" [R,L]
Après que votre installation de base fonctionne, vous devez la
configurer correctement en éditant les fichiers du sous-répertoire
conf. Encore une fois, si vous modifiez la
- configuration du service Apache sous Windows NT, essayez d'abord de
+ configuration du service httpd sous Windows NT, essayez d'abord de
redémarrer le service depuis la ligne de commande afin de vous
assurer de l'absence d'erreur.
- Comme Apache ne peut pas partager le même port
+
Comme httpd ne peut pas partager le même port
avec d'autres applications TCP/IP, il se peut que vous soyez amené à
arrêter, désinstaller ou reconfigurer certains services avant de
- démarrer Apache. Ces services entrant en conflit avec Apache
+ démarrer httpd. Ces services entrant en conflit avec httpd
comprennent les autres serveurs WWW, certaines implémentations de
pare-feu, et même certaines applications client (comme Skype) qui
utilisent le port 80 afin de contourner les pare-feu.
@@ -701,7 +701,7 @@ Alias "/images2/" "//imagehost2/www/images/"
- Lorsqu'Apache s'exécute en tant que service, vous devez créer un
+
Lorsque Apache s'exécute en tant que service, vous devez créer un
compte spécifique afin de pouvoir accéder aux ressources réseau, comme
décrit ci-dessus.
diff --git a/docs/manual/programs/apxs.xml.fr b/docs/manual/programs/apxs.xml.fr
index 007bca61b69..2aea4024d7d 100644
--- a/docs/manual/programs/apxs.xml.fr
+++ b/docs/manual/programs/apxs.xml.fr
@@ -1,7 +1,7 @@
-
+
@@ -28,7 +28,7 @@
apxs - Utilitaire pour les extensions d'Apache
- apxs est un utilitaire permettant de compiler et
+
apxs est un utilitaire permettant de compiler et
d'installer des modules en tant qu'extensions du serveur HTTP
Apache. A cet effet, un objet dynamique partagé (DSO) est compilé à
partir d'un ou plusieurs fichiers sources ou objets et
@@ -40,36 +40,40 @@
plate-forme doit supporter la fonctionnalité DSO, et votre binaire
httpd Apache doit être compilé avec le module
mod_so. Si ce n'est pas le cas, l'utilitaire
- apxs vous le signalera. Vous pouvez aussi vérifier
+ apxs vous le signalera. Vous pouvez aussi vérifier
vous-même ces prérequis en exécutant manuellement la commande :
- $ httpd -l
+
+$ httpd -l
+
Le module mod_so doit faire partie de la liste
des modules affichée. Si ces prérequis sont présents, vous pouvez
facilement étendre les fonctionnalités de votre serveur Apache en
installant vos propres modules à l'aide de l'utilitaire
- apxs, via le mécanisme DSO :
+ apxs, via le mécanisme DSO :
- $ apxs -i -a -c mod_foo.c
- gcc -fpic -DSHARED_MODULE -I/chemin/vers/apache/include -c mod_foo.c
- ld -Bshareable -o mod_foo.so mod_foo.o
- cp mod_foo.so /chemin/vers/apache/modules/mod_foo.so
- chmod 755 /chemin/vers/apache/modules/mod_foo.so
- [activation du module `foo' dans /chemin/vers/apache/etc/httpd.conf]
- $ apachectl restart
- /chemin/vers/apache/sbin/apachectl restart: httpd not running, trying to start
- [Tue Mar 31 11:27:55 1998] [debug] mod_so.c(303): loaded module foo_module
- /chemin/vers/apache/sbin/apachectl restart: httpd started
- $ _
+
+$ apxs -i -a -c mod_foo.c
+gcc -fpic -DSHARED_MODULE -I/path/to/apache/include -c mod_foo.c
+ld -Bshareable -o mod_foo.so mod_foo.o
+cp mod_foo.so /path/to/apache/modules/mod_foo.so
+chmod 755 /path/to/apache/modules/mod_foo.so
+[activating module `foo' in /path/to/apache/etc/httpd.conf]
+$ apachectl restart
+/path/to/apache/sbin/apachectl restart: httpd not running, trying to start
+[Tue Mar 31 11:27:55 1998] [debug] mod_so.c(303): loaded module foo_module
+/path/to/apache/sbin/apachectl restart: httpd started
+$ _
+
Les arguments fichiers peuvent correspondre à un
fichier source C (.c), un fichier objet (.o) ou même une archive de
- bibliothèques (.a). L'utilitaire apxs reconnaît
+ bibliothèques (.a). L'utilitaire apxs reconnaît
automatiquement ces extensions et utilise automatiquement les
fichiers source C pour la compilation, et les fichiers objets et
archives pour l'édition de liens. Cependant, si vous utilisez des
@@ -78,7 +82,7 @@
un objet partagé chargé dynamiquement. Avec GCC, par exemple, il
vous suffit de toujours utiliser l'option de compilation
-fpic. Pour les autres compilateurs C, consultez leur
- page de manuel, ou vérifiez les drapeaux qu'apxs
+ page de manuel, ou vérifiez les drapeaux qu'apxs
utilise pour compiler les fichiers objets.
Pour plus de détails à propos du support DSO dans Apache, lire la
@@ -133,7 +137,7 @@
modèles). Utilisez cette option pour spécifier de manière
explicite le nom du module. Pour l'option -g, cette
option est nécessaire ; pour l'option -i,
- l'utilitaire apxs tente de déterminer le nom du
+ l'utilitaire apxs tente de déterminer le nom du
module à partir des sources, ou (à défaut) en le déduisant du nom
de fichier.
@@ -153,7 +157,9 @@
utilisées pour compiler le binaire httpd qui chargera
votre module. Ajoutez par exemple
- INC=-I`apxs -q INCLUDEDIR`
+
+INC=-I`apxs -q INCLUDEDIR`
+
dans vos propres Makefiles si vous devez accéder manuellement
@@ -284,35 +290,41 @@
Apache à l'exécution, via la commande suivante :
- $ apxs -c mod_foo.c
- /chemin/vers/libtool --mode=compile gcc ... -c mod_foo.c
- /chemin/vers/libtool --mode=link gcc ... -o mod_foo.la mod_foo.slo
- $ _
+
+$ apxs -c mod_foo.c
+/path/to/libtool --mode=compile gcc ... -c mod_foo.c
+/path/to/libtool --mode=link gcc ... -o mod_foo.la mod_foo.slo
+$ _
+
Vous devez ensuite vérifier la configuration d'Apache en vous
assurant qu'une directive LoadModule est bien présente pour
charger cet objet partagé. Pour simplifier cette étape,
- apxs propose une méthode automatique d'installation de
+ apxs propose une méthode automatique d'installation de
l'objet partagé dans son répertoire "modules", et de mise à jour du
fichier httpd.conf en conséquence. Pour bénéficier de
cette automatisation, utilisez la commande suivante :
- $ apxs -i -a mod_foo.la
- /chemin/vers/instdso.sh mod_foo.la /chemin/vers/apache/modules
- /chemin/vers/libtool --mode=install cp mod_foo.la /chemin/vers/apache/modules
- ...
- chmod 755 /chemin/vers/apache/modules/mod_foo.so
- [activation du module `foo' dans /chemin/vers/apache/conf/httpd.conf]
- $ _
+
+$ apxs -i -a mod_foo.la
+/path/to/instdso.sh mod_foo.la /path/to/apache/modules
+/path/to/libtool --mode=install cp mod_foo.la /path/to/apache/modules
+...
+chmod 755 /path/to/apache/modules/mod_foo.so
+[activating module `foo' in /path/to/apache/conf/httpd.conf]
+$ _
+
Une ligne contenant
- LoadModule foo_module modules/mod_foo.so
+
+LoadModule foo_module modules/mod_foo.so
+
est alors ajoutée au fichier de configuration si ce n'est pas
@@ -320,7 +332,9 @@
utilisez l'option -A comme suit :
- $ apxs -i -A mod_foo.c
+
+$ apxs -i -A mod_foo.c
+
Pour un test rapide du mécanisme apxs, vous pouvez créer un
@@ -328,35 +342,39 @@
correspondant via :
- $ apxs -g -n foo
- Creating [DIR] foo
- Creating [FILE] foo/Makefile
- Creating [FILE] foo/modules.mk
- Creating [FILE] foo/mod_foo.c
- Creating [FILE] foo/.deps
- $ _
+
+$ apxs -g -n foo
+Creating [DIR] foo
+Creating [FILE] foo/Makefile
+Creating [FILE] foo/modules.mk
+Creating [FILE] foo/mod_foo.c
+Creating [FILE] foo/.deps
+$ _
+
Vous pouvez ensuite compiler immédiatement ce module exemple en
objet partagé et le charger dans le serveur Apache :
- $ cd foo
- $ make all reload
- apxs -c mod_foo.c
- /chemin/vers/libtool --mode=compile gcc ... -c mod_foo.c
- /chemin/vers/libtool --mode=link gcc ... -o mod_foo.la mod_foo.slo
- apxs -i -a -n "foo" mod_foo.la
- /chemin/vers/instdso.sh mod_foo.la /chemin/vers/apache/modules
- /chemin/vers/libtool --mode=install cp mod_foo.la /chemin/vers/apache/modules
- ...
- chmod 755 /chemin/vers/apache/modules/mod_foo.so
- [activation du module `foo' dans /chemin/vers/apache/conf/httpd.conf]
- apachectl restart
- /chemin/vers/apache/sbin/apachectl restart: httpd not running, trying to start
- [Tue Mar 31 11:27:55 1998] [debug] mod_so.c(303): loaded module foo_module
- /chemin/vers/apache/sbin/apachectl restart: httpd started
- $ _
+
+$ cd foo
+$ make all reload
+apxs -c mod_foo.c
+/path/to/libtool --mode=compile gcc ... -c mod_foo.c
+/path/to/libtool --mode=link gcc ... -o mod_foo.la mod_foo.slo
+apxs -i -a -n "foo" mod_foo.la
+/path/to/instdso.sh mod_foo.la /path/to/apache/modules
+/path/to/libtool --mode=install cp mod_foo.la /path/to/apache/modules
+...
+chmod 755 /path/to/apache/modules/mod_foo.so
+[activating module `foo' in /path/to/apache/conf/httpd.conf]
+apachectl restart
+/path/to/apache/sbin/apachectl restart: httpd not running, trying to start
+[Tue Mar 31 11:27:55 1998] [debug] mod_so.c(303): loaded module foo_module
+/path/to/apache/sbin/apachectl restart: httpd started
+$ _
+
diff --git a/docs/manual/programs/configure.xml.fr b/docs/manual/programs/configure.xml.fr
index a80f655d252..3bfaa35b747 100644
--- a/docs/manual/programs/configure.xml.fr
+++ b/docs/manual/programs/configure.xml.fr
@@ -1,7 +1,7 @@
-
+
@@ -28,7 +28,7 @@
configure - Configure l'arborescence des sources
- Le script configure permet de configurer
+
Le script configure permet de configurer
l'arborescence des sources afin de compiler et installer le serveur
HTTP Apache sur votre plate-forme spécifique. De nombreuses options
vous permettent de compiler un serveur correspondant à vos propres
@@ -44,7 +44,7 @@
Compilation et installation
Résumé
- Vous devez appeler le script configure depuis le
+
Vous devez appeler le script configure depuis le
répertoire racine de la distribution.
./configure [OPTION]...
@@ -69,7 +69,7 @@
Options de Configuration
Les options suivantes affectent le comportement du script
- configure.
+ configure.
-C
@@ -89,7 +89,7 @@
-n
--no-create
- - Le script
configure s'exécute normalement, mais
+ - Le script configure s'exécute normalement, mais
ne crée pas les fichiers résultants. Ceci permet de vérifier les
résultats des tests avant de générer les fichiers makefile pour la
compilation.
@@ -102,7 +102,7 @@
--srcdir=DIR
- Définit le répertoire DIR comme répertoire des
fichiers sources. Par défaut, c'est le répertoire où se situe le
- script
configure, ou le répertoire parent.
+ script configure, ou le répertoire parent.
--silent
- Identique à
--quiet
@@ -311,7 +311,7 @@
Note
Si vous spécifiez --enable-foo, et si
- foo n'existe pas, configure ne le
+ foo n'existe pas, configure ne le
signalera pas ; vous devez donc prendre soin de taper les
options correctement.
@@ -411,7 +411,7 @@
fichier-module sera recherché dans le sous-répertoire
type-module de l'arborescence des sources de votre
serveur HTTP Apache. S'il ne l'y trouve pas,
- configure considèrera fichier-module
+ configure considèrera fichier-module
comme un chemin de fichier absolu et essaiera de copier le
fichier source dans le sous-répertoire type-module.
Si ce sous-répertoire n'existe pas, il sera créé et un fichier
@@ -545,7 +545,7 @@
distribution des sources de httpd et est compilée
automatiquement avec le serveur HTTP. Si vous voulez utiliser
une APR déjà installée à la place, vous devez indiquer à
- configure le chemin du script
+ configure le chemin du script
apr-config. Vous pouvez spécifier le chemin absolu
et le nom ou le répertoire d'installation de l'APR.
apr-config doit se trouver dans ce répertoire ou
@@ -557,7 +557,7 @@
distribution des sources de httpd et sont compilés
automatiquement avec le serveur HTTP. Si vous voulez utiliser
des APU déjà installés à la place, vous devez indiquer à
- configure le chemin du script
+ configure le chemin du script
apu-config. Vous pouvez spécifier le chemin absolu
et le nom ou le répertoire d'installation des APU.
apu-config doit se trouver dans ce répertoire ou
@@ -565,12 +565,12 @@
--with-ssl=REP
- Si mod_ssl a été activé,
-
configure recherche une installation d'OpenSSL.
+ configure recherche une installation d'OpenSSL.
Vous pouvez définir le répertoire de la boîte à outils SSL/TLS à
la place.
--with-z=REP
- configure recherche automatiquement une
+ - configure recherche automatiquement une
bibliothèque
zlib installée si la configuration de
vos sources en nécessite une (par exemple lorsque
mod_deflate est activé). Vous pouvez définir le
@@ -590,10 +590,10 @@
--with-gdbm[=chemin]
- Si aucun chemin n'est spécifié,
-
configure va rechercher les fichiers d'en-têtes et
+ configure va rechercher les fichiers d'en-têtes et
les bibliothèques d'une installation DBM GNU dans les chemins
standards. Avec un chemin explicite,
- configure recherchera les fichiers concernés dans
+ configure recherchera les fichiers concernés dans
chemin/lib et
chemin/include. En fait,
chemin permet de spécifier plusieurs chemins
@@ -677,7 +677,8 @@
- Options de configuration de suexec
+ Options de configuration de suexec
+ suexec
Les options suivantes permettent de définir avec précision le
comportement du programme suexec. Voir Configurer et installer suEXEC
@@ -744,7 +745,7 @@
Variables d'environnement
Certaines variables d'environnement permettent de modifier les
- choix effectués par configure, ou d'aider ce dernier à
+ choix effectués par configure, ou d'aider ce dernier à
trouver les bibliothèques et programmes possédant des noms et chemins
non standards.
diff --git a/docs/manual/programs/htdigest.xml.fr b/docs/manual/programs/htdigest.xml.fr
index c7f734bba6c..964248783e0 100644
--- a/docs/manual/programs/htdigest.xml.fr
+++ b/docs/manual/programs/htdigest.xml.fr
@@ -1,7 +1,7 @@
-
+
@@ -29,13 +29,13 @@
l'authentification à base de condensés
- htdigest permet de créer et maintenir les fichiers
+
htdigest permet de créer et maintenir les fichiers
textes dans lesquels sont stockés des noms d'utilisateurs, des
domaines de protection (realms) et des mots de passe pour
l'authentification à base de condensés des utilisateurs HTTP.
L'accès aux ressources du serveur HTTP Apache peut être limité aux
seuls utilisateurs enregistrés dans les fichiers créés par
- htdigest.
+ htdigest.
Cette page de manuel ne décrit que les arguments de la ligne de
commande. Pour plus de détails à propos des directives nécessaires à
diff --git a/docs/manual/programs/logresolve.xml.fr b/docs/manual/programs/logresolve.xml.fr
index 714b4ca7f63..6fd25f89c41 100644
--- a/docs/manual/programs/logresolve.xml.fr
+++ b/docs/manual/programs/logresolve.xml.fr
@@ -1,7 +1,7 @@
-
+
@@ -30,7 +30,7 @@
fichiers journaux d'Apache
- logresolve est un programme agissant après
+
logresolve est un programme agissant après
traitement pour résoudre les adresses IP dans les journaux d'accès
d'Apache. Pour minimiser la charge de votre serveur de noms,
logresolve possède son propre cache interne sous forme d'une table
@@ -62,9 +62,9 @@ statistiques.
-c
-- Avec cette option,
logresolve effectue certaines
+- Avec cette option, logresolve effectue certaines
vérifications DNS : après avoir trouvé le nom d'hôte correspondant à une
-adresse IP,
logresolve effectue une recherche DNS sur ce
+adresse IP, logresolve effectue une recherche DNS sur ce
nom d'hôte et vérifie si une des adresses IP trouvées correspond à
l'adresse originale.
diff --git a/docs/manual/rewrite/vhosts.xml.fr b/docs/manual/rewrite/vhosts.xml.fr
index 8b630e6ebf3..2e0304620e7 100644
--- a/docs/manual/rewrite/vhosts.xml.fr
+++ b/docs/manual/rewrite/vhosts.xml.fr
@@ -1,7 +1,7 @@
-
+
@@ -25,7 +25,7 @@
Rewrite
-Hébergement virtuel de masse avec mod_rewrite
+Hébergement virtuel de masse avec mod_rewrite
@@ -35,12 +35,12 @@ href="../mod/mod_rewrite.html">documentation de référence du module
virtuels dynamiquement configurés en utilisant
mod_rewrite.
-L'utilisation de mod_rewrite n'est en général pas la
+L'utilisation de mod_rewrite n'est en général pas la
meilleure méthode pour configurer des serveurs virtuels. Vous devez dans un
premier temps tenter de résoudre votre problème via ces d'autres méthodes avant d'avoir recours à
-mod_rewrite. Voir aussi le document Comment éviter
-il'utilisation de mod_rewrite.
+mod_rewrite. Voir aussi le document Comment éviter
+il'utilisation de mod_rewrite.
@@ -114,7 +114,7 @@ commence par www. et si c'est le cas, la réécriture est annulée.
Comme c'est le cas pour de nombreuses techniques discutées dans ce
-document, mod_rewrite n'est vraiment pas la meilleure méthode pour
+document, mod_rewrite n'est vraiment pas la meilleure méthode pour
accomplir cette tâche. Vous devez plutôt vous tourner vers
mod_vhost_alias, car ce dernier sera bien plus à même
de gérer tout ce qui est au delà du domaine des fichiers statiques,
@@ -133,16 +133,16 @@ virtuels via mod_rewrite
La première moitié est très similaire à la partie correspondante
ci-dessus, excepté quelques modifications requises à des fins de
compatibilité ascendante et pour faire en sorte que la partie
- mod_rewrite fonctionne correctement ; la seconde moitié
- configure mod_rewrite pour effectuer le travail
+ mod_rewrite fonctionne correctement ; la seconde moitié
+ configure mod_rewrite pour effectuer le travail
proprement dit.
- Comme mod_rewrite s'exécute avant tout autre module
+
Comme mod_rewrite s'exécute avant tout autre module
de traduction d'URI (comme mod_alias), il faut lui
ordonner explicitement d'ignorer toute URL susceptible d'être
traitée par ces autres modules. Et comme ces règles auraient sinon
court-circuité toute directive ScriptAlias, nous devons
- faire en sorte que mod_rewrite déclare explicitement
+ faire en sorte que mod_rewrite déclare explicitement
ces correspondances.
From 7f5de0aebf5c04796aa9c25153413b09d609763b Mon Sep 17 00:00:00 2001
From: Joe Orton
Date: Mon, 27 Apr 2026 12:54:48 +0000
Subject: [PATCH 13/18] Add ap_*_timingsafe() constant-time comparison
functions:
* include/httpd.h: Declare ap_memeq_timingsafe(),
ap_streq_timingsafe(), ap_strneq_timingsafe().
* server/util.c: Implement, wrapping apr_*_timingsafe() if
APR >= 1.8, with a fallback to copied-in versions.
* modules/aaa/mod_auth_digest.c: Replace apr_crypto_equals()
with ap_memeq_timingsafe(). Remove apr_crypto.h include.
* modules/session/mod_session_crypto.c: Replace local
ap_crypto_equals() with ap_memeq_timingsafe(). Remove
the local implementation and macro alias.
Github: closes #638
git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1933389 13f79535-47bb-0310-9956-ffa450edef68
---
include/ap_mmn.h | 3 +-
include/httpd.h | 48 ++++++++++
modules/aaa/mod_auth_digest.c | 7 +-
modules/session/mod_session_crypto.c | 19 +---
server/util.c | 138 +++++++++++++++++++++++++++
5 files changed, 192 insertions(+), 23 deletions(-)
diff --git a/include/ap_mmn.h b/include/ap_mmn.h
index 09770fa1a57..ccd504d8e82 100644
--- a/include/ap_mmn.h
+++ b/include/ap_mmn.h
@@ -736,6 +736,7 @@
* 20211221.28 (2.5.1-dev) Add dav_get_base_path() to mod_dav
* 20211221.29 (2.5.1-dev) Add ap_set_time_process_request() to scoreboard.h
* 20211221.30 (2.5.1-dev) Add ap_stat_check() to httpd.h
+ * 20211221.31 (2.5.1-dev) Add ap_*_timingsafe() to httpd.h
*/
#define MODULE_MAGIC_COOKIE 0x41503235UL /* "AP25" */
@@ -743,7 +744,7 @@
#ifndef MODULE_MAGIC_NUMBER_MAJOR
#define MODULE_MAGIC_NUMBER_MAJOR 20211221
#endif
-#define MODULE_MAGIC_NUMBER_MINOR 30 /* 0...n */
+#define MODULE_MAGIC_NUMBER_MINOR 31 /* 0...n */
/**
* Determine if the server's current MODULE_MAGIC_NUMBER is at least a
diff --git a/include/httpd.h b/include/httpd.h
index b12b7e4e21b..03376db9958 100644
--- a/include/httpd.h
+++ b/include/httpd.h
@@ -2261,6 +2261,54 @@ AP_DECLARE(int) ap_ind(const char *str, char c); /* Sigh... */
*/
AP_DECLARE(int) ap_rind(const char *str, char c);
+/**
+ * Check whether two buffers of equal size have the same content, using a
+ * constant time algorithm (branch-less with regard to the content of the
+ * buffers and an execution time solely dependent on the number of bytes
+ * compared, not the bytes themselves).
+ *
+ * @param buf1 first buffer to compare
+ * @param buf2 second buffer to compare
+ * @param n number of bytes to compare
+ * @return 1 if equal, 0 otherwise
+ */
+AP_DECLARE(int) ap_memeq_timingsafe(const void *buf1, const void *buf2,
+ apr_size_t n);
+
+/**
+ * Check whether two NUL-terminated strings have the same content, using a
+ * constant time algorithm (branch-less with regard to the content of the
+ * secret string and an execution time solely dependent on the length of
+ * the non-secret string). The secret string of the two should be set in
+ * the first parameter \c sec1 to avoid leaking its length.
+ *
+ * @param sec1 first string to compare (the secret one)
+ * @param str2 second string to compare
+ * @return 1 if equal, 0 otherwise
+ * @remark The function will compare as much characters as there are in
+ * \c str2, so the length of \c str2 might leak through side channel,
+ * while the length of \c sec1 does not.
+ */
+AP_DECLARE(int) ap_streq_timingsafe(const char *sec1, const char *str2);
+
+/**
+ * Check whether two NUL-terminated strings have the same content, up to \c n
+ * characters, using a constant time algorithm (branch-less with regard to the
+ * content of the secret string and an execution time solely dependent on the
+ * length of the non-secret string or \c n). The secret string of the two
+ * should be set in the first parameter \c sec1 to avoid leaking its length.
+ *
+ * @param sec1 secret string to compare
+ * @param str2 string to compare with
+ * @param n max number of characters to compare
+ * @return 1 if equal, 0 otherwise
+ * @remark The function will compare as much characters as there are in
+ * \c str2 if it's less than \c n, so the length of \c str2 might
+ * leak through side channel, while the length of \c sec1 does not.
+ */
+AP_DECLARE(int) ap_strneq_timingsafe(const char *sec1, const char *str2,
+ apr_size_t n);
+
/**
* Given a string, replace any bare " with \\" .
* @param p The pool to allocate memory from
diff --git a/modules/aaa/mod_auth_digest.c b/modules/aaa/mod_auth_digest.c
index ac02e6b9673..fb4d26306be 100644
--- a/modules/aaa/mod_auth_digest.c
+++ b/modules/aaa/mod_auth_digest.c
@@ -73,7 +73,6 @@
#include "apr_shm.h"
#include "apr_rmm.h"
#include "ap_provider.h"
-#include "apr_crypto.h" /* for apr_crypto_equals */
#include "mod_auth.h"
@@ -1438,7 +1437,7 @@ static int check_nonce(request_rec *r, digest_header_rec *resp,
resp->nonce[NONCE_TIME_LEN] = tmp;
resp->nonce_time = nonce_time.time;
- if (!apr_crypto_equals(hash, resp->nonce+NONCE_TIME_LEN, NONCE_HASH_LEN)) {
+ if (!ap_memeq_timingsafe(hash, resp->nonce+NONCE_TIME_LEN, NONCE_HASH_LEN)) {
ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, APLOGNO(01776)
"invalid nonce %s received - hash is not %s",
resp->nonce, hash);
@@ -1769,7 +1768,7 @@ static int authenticate_digest_user(request_rec *r)
if (resp->message_qop == NULL) {
/* old (rfc-2069) style digest */
- if (!apr_crypto_equals(resp->digest, old_digest(r, resp), MD5_DIGEST_LEN)) {
+ if (!ap_memeq_timingsafe(old_digest(r, resp), resp->digest, MD5_DIGEST_LEN)) {
ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, APLOGNO(01792)
"user %s: password mismatch: %s", r->user,
r->uri);
@@ -1804,7 +1803,7 @@ static int authenticate_digest_user(request_rec *r)
/* we failed to allocate a client struct */
return HTTP_INTERNAL_SERVER_ERROR;
}
- if (!apr_crypto_equals(resp->digest, exp_digest, MD5_DIGEST_LEN)) {
+ if (!ap_memeq_timingsafe(exp_digest, resp->digest, MD5_DIGEST_LEN)) {
ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, APLOGNO(01794)
"user %s: password mismatch: %s", r->user,
r->uri);
diff --git a/modules/session/mod_session_crypto.c b/modules/session/mod_session_crypto.c
index f072d4c6fbc..67b9e75464f 100644
--- a/modules/session/mod_session_crypto.c
+++ b/modules/session/mod_session_crypto.c
@@ -69,8 +69,6 @@ typedef struct {
#define AP_SIPHASH_KSIZE APR_SIPHASH_KSIZE
#define ap_siphash24_auth apr_siphash24_auth
-#define ap_crypto_equals apr_crypto_equals
-
#else
#define AP_SIPHASH_DSIZE 8
@@ -165,21 +163,6 @@ static void ap_siphash24_auth(unsigned char out[AP_SIPHASH_DSIZE],
U64TO8_LE(out, h);
}
-static int ap_crypto_equals(const void *buf1, const void *buf2,
- apr_size_t size)
-{
- const unsigned char *p1 = buf1;
- const unsigned char *p2 = buf2;
- unsigned char diff = 0;
- apr_size_t i;
-
- for (i = 0; i < size; ++i) {
- diff |= p1[i] ^ p2[i];
- }
-
- return 1 & ((diff - 1) >> 8);
-}
-
#endif
static void compute_auth(const void *src, apr_size_t len,
@@ -404,7 +387,7 @@ static apr_status_t decrypt_string(request_rec * r, const apr_crypto_t *f,
* the MAC and comparing it (timing safe) with the one in the payload.
*/
compute_auth(slider, len, passphrase, passlen, auth);
- if (!ap_crypto_equals(auth, decoded, AP_SIPHASH_DSIZE)) {
+ if (!ap_memeq_timingsafe(auth, decoded, AP_SIPHASH_DSIZE)) {
ap_log_rerror(APLOG_MARK, APLOG_DEBUG, res, r, APLOGNO(10006)
"auth does not match, skipping");
continue;
diff --git a/server/util.c b/server/util.c
index eda0eceaf9c..d1d06fc15b4 100644
--- a/server/util.c
+++ b/server/util.c
@@ -3934,3 +3934,141 @@ AP_DECLARE(const char *)ap_dir_fnmatch(ap_dir_match_t *w, const char *path,
return NULL;
}
+
+
+#if APR_VERSION_AT_LEAST(1,8,0)
+AP_DECLARE(int) ap_memeq_timingsafe(const void *buf1, const void *buf2,
+ apr_size_t n)
+{
+ return apr_memeq_timingsafe(buf1, buf2, n);
+}
+
+AP_DECLARE(int) ap_streq_timingsafe(const char *sec1, const char *str2)
+{
+ return apr_streq_timingsafe(sec1, str2);
+}
+
+AP_DECLARE(int) ap_strneq_timingsafe(const char *sec1, const char *str2,
+ apr_size_t n)
+{
+ return apr_strneq_timingsafe(sec1, str2, n);
+}
+
+#else /* !APR_VERSION_AT_LEAST(1,8,0) */
+
+/* A volatile variable which is always zero but allows to block the compiler
+ * from optimizing or eliding code using it. Volatile forces the compiler to
+ * emit a memory load for which no value can be assumed, so for instance an
+ * add/sub/xor/or with "optblocker" is a noop that will hide the result to
+ * the optimizer.
+ */
+static volatile const apr_uint32_t optblocker;
+
+/* Return whether x is not zero, with no branching controlled by x.
+ *
+ * Taken from the cryptoint library (public domain) by D. J. Bernstein,
+ * which provides timing attacks safe integer operations/primitives.
+ * Code:
+ * https://lib.mceliece.org/libmceliece-20250507/cryptoint/crypto_uint32.h
+ * Paper:
+ * https://cr.yp.to/papers/cryptoint-20250424.pdf
+ */
+#if __has_attribute(always_inline)
+__attribute__((always_inline))
+#endif
+static APR_INLINE int test_nonzero_timingsafe(apr_uint32_t x)
+{
+ x |= -x; /* sets the most significant bit unless x == 0 */
+
+ /* shift bit 31 (MSB) to bit 0 */
+ x >>= 32-6; /* keep 6 bits */
+ x += optblocker; /* lose the optimizer */
+ x >>= 5; /* keep the (original) MSB only */
+
+ /* x is now 0 or 1 */
+ return x & INT_MAX;
+}
+
+AP_DECLARE(int) ap_memeq_timingsafe(const void *buf1, const void *buf2,
+ apr_size_t n)
+{
+ apr_uint32_t diff = 0;
+ volatile apr_size_t count = n; /* prevent loop unrolling */
+ apr_size_t i = 0;
+
+ for (; i < count; ++i) {
+ const unsigned char c1 = ((volatile const unsigned char *)buf1)[i];
+ const unsigned char c2 = ((volatile const unsigned char *)buf2)[i];
+
+ diff |= c1 ^ c2; /* sets diff to non-zero whenever c1 != c2 */
+ }
+
+ /* (diff == 0) <=> (diff != 0) ^ 1 */
+ return test_nonzero_timingsafe(diff) ^ 1;
+}
+
+AP_DECLARE(int) ap_streq_timingsafe(const char *sec1, const char *str2)
+{
+ apr_uint32_t diff = 0;
+ apr_size_t i1 = 0, i2 = 0;
+
+ for (;; ++i2) {
+ const unsigned char c1 = ((volatile const unsigned char *)sec1)[i1];
+ const unsigned char c2 = ((volatile const unsigned char *)str2)[i2];
+
+ diff |= c1 ^ c2; /* sets diff to non-zero whenever c1 != c2 */
+
+ /* Not a shortest/longest match because an attacker would usually know
+ * one of the strings and could then determine the length of the other.
+ * So assume only sec1 and its length are secret and stop the loop at
+ * the end of str2. If sec1 is shorter than str2 the loop will continue
+ * by comparing the rest of str2 with the trailing NUL byte of sec1.
+ * In any case since the diff above is computed up to and including a
+ * NUL byte, only the same content and length will raise match.
+ */
+ if (!c2) {
+ break;
+ }
+
+ /* Don't go above sec1's NUL byte */
+ i1 += test_nonzero_timingsafe(c1);
+ }
+
+ /* (diff == 0) <=> (diff != 0) ^ 1 */
+ return test_nonzero_timingsafe(diff) ^ 1;
+}
+
+AP_DECLARE(int) ap_strneq_timingsafe(const char *sec1, const char *str2,
+ apr_size_t n)
+{
+ apr_uint32_t diff = 0;
+ volatile apr_size_t count = n; /* prevent loop unrolling */
+ apr_size_t i1 = 0, i2 = 0;
+
+ for (; i2 < count; ++i2) {
+ const unsigned char c1 = ((volatile const unsigned char *)sec1)[i1];
+ const unsigned char c2 = ((volatile const unsigned char *)str2)[i2];
+
+ diff |= c1 ^ c2; /* sets diff to non-zero whenever c1 != c2 */
+
+ /* Not a shortest/longest match because an attacker would usually know
+ * one of the strings and could then determine the length of the other.
+ * So assume only sec1 and its length are secret and stop the loop at
+ * the end of str2. If sec1 is shorter than str2 the loop will continue
+ * by comparing the rest of str2 with the trailing NUL byte of sec1.
+ * In any case since the diff above is computed up to and including a
+ * NUL byte, only the same content and length will raise match.
+ */
+ if (!c2) {
+ break;
+ }
+
+ /* Don't go above sec1's NUL byte */
+ i1 += test_nonzero_timingsafe(c1);
+ }
+
+ /* (diff == 0) <=> (diff != 0) ^ 1 */
+ return test_nonzero_timingsafe(diff) ^ 1;
+}
+
+#endif /* !APR_VERSION_AT_LEAST(1,8,0) */
From 94c50fa1a0489b6fe0e1d00cdbffa8b879f6f08c Mon Sep 17 00:00:00 2001
From: Lucien Gentis
Date: Mon, 27 Apr 2026 15:57:08 +0000
Subject: [PATCH 14/18] fr doc XML files updates.
git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1933392 13f79535-47bb-0310-9956-ffa450edef68
---
docs/manual/rewrite/flags.xml.fr | 35 ++++++++++++++++++++--------
docs/manual/rewrite/htaccess.xml.fr | 6 ++---
docs/manual/rewrite/remapping.xml.fr | 14 +++++------
docs/manual/rewrite/tech.xml.fr | 22 ++++++++---------
4 files changed, 46 insertions(+), 31 deletions(-)
diff --git a/docs/manual/rewrite/flags.xml.fr b/docs/manual/rewrite/flags.xml.fr
index 409a7ac7ce4..8646da2d5b6 100644
--- a/docs/manual/rewrite/flags.xml.fr
+++ b/docs/manual/rewrite/flags.xml.fr
@@ -1,7 +1,7 @@
-
+
@@ -75,7 +75,7 @@ d'utilisation.
module="mod_rewrite">RewriteRule échappe les caractères
non-alphanumériques avant d'appliquer la transformation.
-mod_rewrite doit supprimer les séquences d'échappement
+
mod_rewrite doit supprimer les séquences d'échappement
des URLs avant leur
mise en correspondance avec le système de fichiers ; les séquences
d'échappement sont donc supprimées des références arrières au moment où
@@ -285,7 +285,7 @@ RewriteRule "^/index\.html" "-" [CO=frontdoor:yes:.example.org:1440:/]
Dans l'exemple ci-dessus, la règle ne réécrit
pas la requête. La cible de réécriture "-"
-indique à mod_rewrite de transmettre la requête sans
+indique à mod_rewrite de transmettre la requête sans
modification. Par contre, il
définit un cookie nommé 'frontdoor' avec une valeur 'yes'. Le cookie est
valide pour tout hôte situé dans le domaine .example.org. Sa
@@ -562,10 +562,25 @@ bien que .JPG seront acceptés.
NE|noescape
-Par défaut, les caractères spéciaux, comme & et
-?, sont convertis en leur équivalent hexadécimal pour les règles
-qui génèrent des redirections externes. Le drapeau [NE] permet d'éviter cette
-conversion.
+Par défaut, lorsqu’une directive RewriteRule résulte en une redirection externe,
+tout caractère dans la sortie qui ne fait pas partie de l’ensemble sûr suivant
+est converti en son code hexa (encodage avec caractère pourcentage) :
+
+
+ - Caractères alphanumériques :
A-Z, a-z,
+ 0-9
+ - Caractères spéciaux :
$-_.+!*'(),:;@&=/~
+
+
+Par exemple, # est converti en %23 et
+? en %3F. Le caractère % est aussi
+échappé (vers %25), ce qui signifie que tout caractère codé avec
+pourcentage déjà présent dans la substitution sera doublement encodé.
+
+Utiliser le drapeau [NE] empêche cet échappement, ce qui permet de
+transmettre sans modification vers l’URL de redirection des caractères comme
+# et ?.
RewriteRule "^/anchor/(.+)" "/bigpage.html#$1" [NE,R]
@@ -904,11 +919,11 @@ solution alternative.
Dans un contexte de niveau répertoire, n'utilisez que -
(tiret) comme substitution, dans toute la séquence de réécriture de
-mod_rewrite, sinon le type MIME défini avec ce drapeau
+mod_rewrite, sinon le type MIME défini avec ce drapeau
sera perdu suite à un retraitement interne (y compris les séquences de
-réécriture suivantes de mod_rewrite). Dans ce contexte, vous pouvez
+réécriture suivantes de mod_rewrite). Dans ce contexte, vous pouvez
utiliser le drapeau L pour terminer la séquence
-courante de réécriture de mod_rewrite.
+courante de réécriture de mod_rewrite.
diff --git a/docs/manual/rewrite/htaccess.xml.fr b/docs/manual/rewrite/htaccess.xml.fr
index 678b761529f..1411915f806 100644
--- a/docs/manual/rewrite/htaccess.xml.fr
+++ b/docs/manual/rewrite/htaccess.xml.fr
@@ -1,7 +1,7 @@
-
+
@@ -32,8 +32,8 @@
Ce document est un complément de la documentation de référence du module
mod_rewrite. Il décrit les changements apportés aux règles
-lorsqu'on utilise mod_rewrite dans les fichiers .htaccess, et comment
-travailler avec ces changements.
+lorsqu'on utilise mod_rewrite dans les fichiers .htaccess, et
+comment travailler avec ces changements.
Documentation du module mod_rewrite
diff --git a/docs/manual/rewrite/remapping.xml.fr b/docs/manual/rewrite/remapping.xml.fr
index 8fbe2683684..807c71bc14a 100644
--- a/docs/manual/rewrite/remapping.xml.fr
+++ b/docs/manual/rewrite/remapping.xml.fr
@@ -1,7 +1,7 @@
-
+
@@ -34,7 +34,7 @@ href="../mod/mod_rewrite.html">Documentation de référence de
mod_rewrite. Il montre comment utiliser
mod_rewrite pour rediriger et remettre en
correspondance une requête. Il contient de
-nombreux exemples d'utilisation courante de mod_rewrite avec une
+nombreux exemples d'utilisation courante de mod_rewrite avec une
description détaillée de leur fonctionnement.
Vous devez vous attacher à comprendre le
@@ -119,7 +119,7 @@ RewriteRule "^foo\.html$" "bar.html" [
Dans l'exemple interne, on a utilisé mod_rewrite afin
+ href="#old-to-new-intern">interne, on a utilisé mod_rewrite afin
de dissimuler la redirection au client. Dans cet exemple, en
revanche, on aurait pu se contenter d'une directive Redirect :
@@ -248,8 +248,8 @@ RewriteRule "^foo\.html$" "foo.cgi" [H=cgi-script]
- Discussion
-
Cet exemple utilise une fonctionnalité souvent méconnue de
- mod_rewrite, en tirant avantage de l'ordre d'exécution du jeu de
- règles. En particulier, mod_rewrite évalue la partie gauche des
+ mod_rewrite, en tirant avantage de l'ordre d'exécution du jeu de
+ règles. En particulier, mod_rewrite évalue la partie gauche des
règles de réécriture avant d'évaluer les directives RewriteCond. En
conséquence, $1 est déjà défini au moment où les directives
RewriteCond sont évaluées. Ceci nous permet de tester l'existence du
@@ -286,7 +286,7 @@ RewriteRule "^foo\.html$" "foo.cgi" [H=cgi-script]
-
-
Pour y parvenir, il vaut mieux se passer de mod_rewrite, et utiliser
+
Pour y parvenir, il vaut mieux se passer de mod_rewrite, et utiliser
plutôt la directive Redirect dans
une section de serveur virtuel pour le/les noms d'hôte non canoniques.
@@ -322,7 +322,7 @@ type="section">If (versions 2.4 et ultérieures) :
Si, pour une raison particulière, vous voulez tout de même utiliser
-mod_rewrite - dans le cas, par exemple, où vous avez besoin
+mod_rewrite - dans le cas, par exemple, où vous avez besoin
d'un jeu plus important de règles de réécritures - vous pouvez utiliser
la recette suivante :
diff --git a/docs/manual/rewrite/tech.xml.fr b/docs/manual/rewrite/tech.xml.fr
index ebc785286a7..6f8ac66cf5d 100644
--- a/docs/manual/rewrite/tech.xml.fr
+++ b/docs/manual/rewrite/tech.xml.fr
@@ -1,7 +1,7 @@
-
+
@@ -29,7 +29,7 @@
Ce document passe en revue certains détails techniques à propos du
-module mod_rewrite et de la mise en correspondance des URLs
+module mod_rewrite et de la mise en correspondance des URLs
Documentation du module mod_rewrite
Introduction à mod_rewrite
@@ -52,7 +52,7 @@ correspondance
authentification, autorisation, gestion de contenu ou journalisation (la
liste n'est pas exhaustive).
- mod_rewrite agit dans deux de ces phases (ou accroches - hooks -
+
mod_rewrite agit dans deux de ces phases (ou accroches - hooks -
comme on les nomme souvent) pour la réécriture des URLs.
Tout d'abord, il utilise le hook traduction URL vers nom de
@@ -78,7 +78,7 @@ correspondance
type="section">Directory) sont appliquées. Ce processus
s'exécute au cours de la phase Fixup.
- Dans tous ces cas, mod_rewrite réécrit le
+
Dans tous ces cas, mod_rewrite réécrit le
REQUEST_URI soit vers une nouvelle URL, soit vers un
nom de fichier.
@@ -86,7 +86,7 @@ correspondance
fichiers .htaccess et les sections
Directory), les règles de réécriture s'appliquent après
la traduction de l'URL en nom de fichier. C'est pourquoi le chemin
- URL auquel mod_rewrite compare initialement les directives
+ URL auquel mod_rewrite compare initialement les directives
RewriteRule est le
chemin complet vers le nom de fichier traduit amputé de la partie
répertoires (y compris le dernier slash).
@@ -140,7 +140,7 @@ correspondance
- Pour une étude plus approfondie de la manière dont mod_rewrite
+
Pour une étude plus approfondie de la manière dont mod_rewrite
manipule les URLs dans les différents contextes, vous pouvez
consulter les entrées du
journal générées au cours du processus de réécriture.
@@ -149,7 +149,7 @@ correspondance
Traitement du jeu de règles
- Maintenant, quand mod_rewrite se lance dans ces deux phases de
+
Maintenant, quand mod_rewrite se lance dans ces deux phases de
l'API, il lit le jeu de règles configurées depuis la structure
contenant sa configuration (qui a été elle-même créée soit au
démarrage d'Apache pour le contexte du serveur, soit lors du
@@ -180,15 +180,15 @@ correspondance
L'URL est tout d'abord comparée au
Modèle de chaque règle. Lorsqu'une règle ne s'applique
- pas, mod_rewrite stoppe immédiatement le traitement de cette règle
+ pas, mod_rewrite stoppe immédiatement le traitement de cette règle
et passe à la règle suivante. Si l'URL correspond au
- Modèle, mod_rewrite recherche la présence de conditions
+ Modèle, mod_rewrite recherche la présence de conditions
correspondantes (les directives Rewritecond apparaissant dans la
configuration juste
- avant les règles de réécriture). S'il n'y en a pas, mod_rewrite remplace
+ avant les règles de réécriture). S'il n'y en a pas, mod_rewrite remplace
l'URL par une chaîne élaborée à partir de la chaîne de
Substitution, puis passe à la règle suivante. Si des
- conditions sont présentes, mod_rewrite lance un bouclage
+ conditions sont présentes, mod_rewrite lance un bouclage
secondaire afin de les traiter selon l'ordre dans lequel elles
sont définies. La logique de traitement des conditions est
différente : on ne compare pas l'URL à un modèle. Une chaîne de
From c0d027ee5ea746aff2894b8753ad2dfaa7e30955 Mon Sep 17 00:00:00 2001
From: Rich Bowen
Date: Mon, 27 Apr 2026 17:42:23 +0000
Subject: [PATCH 15/18] Fix broken links in thread_safety.xml
git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1933397 13f79535-47bb-0310-9956-ffa450edef68
---
docs/manual/developer/thread_safety.xml | 14 +++++++-------
1 file changed, 7 insertions(+), 7 deletions(-)
diff --git a/docs/manual/developer/thread_safety.xml b/docs/manual/developer/thread_safety.xml
index c74fd064bab..7c4b3b89023 100644
--- a/docs/manual/developer/thread_safety.xml
+++ b/docs/manual/developer/thread_safety.xml
@@ -152,11 +152,11 @@
| |
? |
|
- | Berkeley DB |
+
| Berkeley DB |
3.x, 4.x |
Yes |
Be careful about sharing a connection across threads. |
- | bzip2 |
+
| bzip2 |
|
Yes |
Both low-level and high-level APIs are thread-safe. However,
@@ -165,7 +165,7 @@
| |
? |
|
- | C-Client |
+
| C-Client |
|
Perhaps |
c-client uses strtok() and
@@ -210,7 +210,7 @@
href="http://www.imagemagick.com/www/changelog.html"
>Change log).
|
- | Imlib2 |
|
? |
@@ -224,8 +224,8 @@
Yes |
Use mysqlclient_r library variant to ensure thread-safety. For
more information, please read http://dev.mysql.com/doc/mysql/en/Threaded_clients.html. |
+ href="https://dev.mysql.com/doc/c-api/8.0/en/c-api-threaded-clients.html"
+ >https://dev.mysql.com/doc/c-api/8.0/en/c-api-threaded-clients.html.
| Net-SNMP |
5.0.x |
? |
@@ -261,7 +261,7 @@
? |
|
| libpq (PostgreSQL) |
8.x |
Yes |
From d4734d0420625796e9f3cdc53d495231ae6ee930 Mon Sep 17 00:00:00 2001
From: Rich Bowen
Date: Mon, 27 Apr 2026 17:53:01 +0000
Subject: [PATCH 16/18] Fix broken links in ssl_intro.xml
git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1933399 13f79535-47bb-0310-9956-ffa450edef68
---
docs/manual/ssl/ssl_intro.xml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/docs/manual/ssl/ssl_intro.xml b/docs/manual/ssl/ssl_intro.xml
index 4467d097a51..8a462371843 100644
--- a/docs/manual/ssl/ssl_intro.xml
+++ b/docs/manual/ssl/ssl_intro.xml
@@ -655,8 +655,8 @@ See for instance [SSL3]
- Alan O. Freier, Philip Karlton, Paul C. Kocher,
The SSL Protocol
Version 3.0
, 1996. See http://www.netscape.com/eng/ssl3/draft302.txt.
+href="https://datatracker.ietf.org/doc/html/rfc6101"
+>RFC 6101.
- [TLS1]
- Tim Dierks, Christopher Allen,
The TLS Protocol Version 1.0
,
From 08d25538bccb463ce053d1de3f42763d97a67084 Mon Sep 17 00:00:00 2001
From: Rich Bowen
Date: Mon, 27 Apr 2026 18:05:38 +0000
Subject: [PATCH 17/18] Fix broken links, but this module seems abandoned.
git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1933401 13f79535-47bb-0310-9956-ffa450edef68
---
docs/manual/mod/mod_privileges.xml | 18 +++++++++---------
1 file changed, 9 insertions(+), 9 deletions(-)
diff --git a/docs/manual/mod/mod_privileges.xml b/docs/manual/mod/mod_privileges.xml
index ac85d256734..f716c0e9f7d 100644
--- a/docs/manual/mod/mod_privileges.xml
+++ b/docs/manual/mod/mod_privileges.xml
@@ -34,7 +34,7 @@ OpenSolaris platforms
This module enables different Virtual Hosts to run with different
Unix User and Group IDs, and with different
-Solaris Privileges. In particular, it offers a solution to the
problem of privilege separation between different Virtual Hosts, first
promised by the abandoned perchild MPM. It also offers other security
@@ -175,7 +175,7 @@ non-threaded MPMs (prefork or custom MPM).
under which the server will process requests to a virtualhost.
The userid is set before the request is processed and reset afterwards
using Solaris Privileges. Since the setting applies to the
process, this is not compatible with threaded MPMs.
Unix-userid is one of:
@@ -212,7 +212,7 @@ non-threaded MPMs (prefork or custom MPM).
under which the server will process requests to a virtualhost.
The group is set before the request is processed and reset afterwards
using Solaris Privileges. Since the setting applies to the
process, this is not compatible with threaded MPMs.
Unix-group is one of:
@@ -247,7 +247,7 @@ non-threaded MPMs (prefork or custom MPM).
Determines whether the virtual host processes requests with
security enhanced by removal of Privileges that are rarely needed in a webserver, but which are
available by default to a normal Unix user and may therefore
be required by modules and applications. It is recommended that
@@ -274,7 +274,7 @@ non-threaded MPMs (prefork or custom MPM).
Determines whether the virtual host is allowed to run fork and exec,
the privileges required to run subprocesses. If this is set to
Off the virtualhost is denied the privileges and will not
be able to run traditional CGI programs or scripts under the traditional
@@ -304,9 +304,9 @@ non-threaded MPMs (prefork or custom MPM).
This server-wide directive determines whether Apache will run with
the privileges required to run
- dtrace.
+ dtrace.
Note that DTracePrivileges On will not in itself
activate DTrace, but DTracePrivileges Off will prevent
it working.
@@ -326,7 +326,7 @@ and when mod_privileges is compiled with the
VHostPrivs can be used to assign arbitrary privileges to a virtual host. Each privilege-name
is the name of a Solaris privilege, such as file_setid
or sys_nfs.
@@ -358,7 +358,7 @@ and when mod_privileges is compiled with the
VHostCGIPrivs can be used to assign arbitrary privileges to subprocesses created by a virtual host, as discussed
under VHostCGIMode. Each privilege-name
is the name of a Solaris privilege, such as file_setid
From 574ab1e79d01fae79562bb34ffcef2b6f582f0b6 Mon Sep 17 00:00:00 2001
From: Jeff McKenna
Date: Tue, 28 Apr 2026 12:07:26 -0300
Subject: [PATCH 18/18] CMake: update min version required
---
CMakeLists.txt | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/CMakeLists.txt b/CMakeLists.txt
index e9b39bdd13e..306a2ae55f4 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -17,7 +17,7 @@
# CMAKE_MINIMUM_REQUIRED should be the first directive in the file:
# https://cmake.org/cmake/help/latest/command/cmake_minimum_required.html
-CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
+CMAKE_MINIMUM_REQUIRED(VERSION 3.16...3.29)
PROJECT(HTTPD C)