1
0
mirror of https://github.com/apache/httpd.git synced 2025-08-07 04:02:58 +03:00

Define ap_method_mask_t (typedef for apr_uint64_t) and use for method

bitmasks rather than apr_int64_t.  Fixes UBSan errors shifting to the
top bit of a signed integer.

* include/httpd.h: Add ap_method_mask_t, use it for AP_METHOD_BIT.
  (struct ap_method_mask_t): Likewise for method_mask field.
  (struct request_rec): Likewise for allowed field.

* include/http_config.h (struct cmd_parms): Likewise for limited field.

* include/ap_mmn.h: Bump MMN major.

* modules/*/*.c: Adjust all method masks to use ap_method_mask_t.


git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1874114 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Joe Orton
2020-02-17 10:11:56 +00:00
parent b853e4925d
commit 2517583a44
9 changed files with 25 additions and 15 deletions

View File

@@ -1,6 +1,11 @@
-*- coding: utf-8 -*- -*- coding: utf-8 -*-
Changes with Apache 2.5.1 Changes with Apache 2.5.1
*) core: ap_method_mask_t type added for method bitmasks, changed
from apr_int64_t and used for the method_mask field in
ap_method_list_t, AP_METHOD_BIT, allowed field of request_rec,
limited field of cmd_parms. [Joe Orton]
*) mod_ssl: Do not keep connections to OCSP responders alive when doing *) mod_ssl: Do not keep connections to OCSP responders alive when doing
OCSP requests. PR 64135. [Ruediger Pluem] OCSP requests. PR 64135. [Ruediger Pluem]

View File

@@ -621,14 +621,15 @@
* 20190312.7 (2.5.1-dev) AP_REG_DEFAULT macro in ap_regex.h * 20190312.7 (2.5.1-dev) AP_REG_DEFAULT macro in ap_regex.h
* 20190312.8 (2.5.1-dev) ap_is_chunked() in httpd.h * 20190312.8 (2.5.1-dev) ap_is_chunked() in httpd.h
* 20190312.9 (2.5.1-dev) AP_REG_NO_DEFAULT macro in ap_regex.h * 20190312.9 (2.5.1-dev) AP_REG_NO_DEFAULT macro in ap_regex.h
* 20200217.0 (2.5.1-dev) Add and use ap_method_mask_t type
*/ */
#define MODULE_MAGIC_COOKIE 0x41503235UL /* "AP25" */ #define MODULE_MAGIC_COOKIE 0x41503235UL /* "AP25" */
#ifndef MODULE_MAGIC_NUMBER_MAJOR #ifndef MODULE_MAGIC_NUMBER_MAJOR
#define MODULE_MAGIC_NUMBER_MAJOR 20190312 #define MODULE_MAGIC_NUMBER_MAJOR 20200217
#endif #endif
#define MODULE_MAGIC_NUMBER_MINOR 9 /* 0...n */ #define MODULE_MAGIC_NUMBER_MINOR 0 /* 0...n */
/** /**
* Determine if the server's current MODULE_MAGIC_NUMBER is at least a * Determine if the server's current MODULE_MAGIC_NUMBER is at least a

View File

@@ -295,7 +295,7 @@ struct cmd_parms_struct {
/** Table of directives allowed per AllowOverrideList */ /** Table of directives allowed per AllowOverrideList */
apr_table_t *override_list; apr_table_t *override_list;
/** Which methods are <Limit>ed */ /** Which methods are <Limit>ed */
apr_int64_t limited; ap_method_mask_t limited;
/** methods which are limited */ /** methods which are limited */
apr_array_header_t *limited_xmethods; apr_array_header_t *limited_xmethods;
/** methods which are xlimited */ /** methods which are xlimited */

View File

@@ -637,10 +637,14 @@ AP_DECLARE(const char *) ap_get_server_built(void);
*/ */
#define METHODS 64 #define METHODS 64
/**
* The type used for method masks.
*/
typedef apr_uint64_t ap_method_mask_t;
/** /**
* The method mask bit to shift for anding with a bitmask. * The method mask bit to shift for anding with a bitmask.
*/ */
#define AP_METHOD_BIT ((apr_int64_t)1) #define AP_METHOD_BIT ((ap_method_mask_t)1)
/** @} */ /** @} */
@@ -656,7 +660,7 @@ typedef struct ap_method_list_t ap_method_list_t;
*/ */
struct ap_method_list_t { struct ap_method_list_t {
/** The bitmask used for known methods */ /** The bitmask used for known methods */
apr_int64_t method_mask; ap_method_mask_t method_mask;
/** the array used for extension methods */ /** the array used for extension methods */
apr_array_header_t *method_list; apr_array_header_t *method_list;
}; };
@@ -886,7 +890,7 @@ struct request_rec {
* HTTP_METHOD_NOT_ALLOWED. Unfortunately this means that a Script GET * HTTP_METHOD_NOT_ALLOWED. Unfortunately this means that a Script GET
* handler can't be installed by mod_actions. * handler can't be installed by mod_actions.
*/ */
apr_int64_t allowed; ap_method_mask_t allowed;
/** Array of extension methods */ /** Array of extension methods */
apr_array_header_t *allowed_xmethods; apr_array_header_t *allowed_xmethods;
/** List of allowed methods */ /** List of allowed methods */

View File

@@ -53,7 +53,7 @@ enum allowdeny_type {
}; };
typedef struct { typedef struct {
apr_int64_t limited; ap_method_mask_t limited;
union { union {
char *from; char *from;
apr_ipsubnet_t *ip; apr_ipsubnet_t *ip;
@@ -243,7 +243,7 @@ static int find_allowdeny(request_rec *r, apr_array_header_t *a, int method)
{ {
allowdeny *ap = (allowdeny *) a->elts; allowdeny *ap = (allowdeny *) a->elts;
apr_int64_t mmask = (AP_METHOD_BIT << method); ap_method_mask_t mmask = (AP_METHOD_BIT << method);
int i; int i;
int gothost = 0; int gothost = 0;
const char *remotehost = NULL; const char *remotehost = NULL;

View File

@@ -45,7 +45,7 @@
typedef struct am_conf_t { typedef struct am_conf_t {
int allowed_set; int allowed_set;
apr_int64_t allowed; ap_method_mask_t allowed;
} am_conf_t; } am_conf_t;
module AP_MODULE_DECLARE_DATA allowmethods_module; module AP_MODULE_DECLARE_DATA allowmethods_module;

View File

@@ -70,7 +70,7 @@ struct authz_section_conf {
const char *provider_args; const char *provider_args;
const void *provider_parsed_args; const void *provider_parsed_args;
const authz_provider *provider; const authz_provider *provider;
apr_int64_t limited; ap_method_mask_t limited;
authz_logic_op op; authz_logic_op op;
int negate; int negate;
/** true if this is not a real container but produced by AuthMerging; /** true if this is not a real container but produced by AuthMerging;
@@ -478,7 +478,7 @@ static const char *add_authz_section(cmd_parms *cmd, void *mconfig,
authz_section_conf *old_section = conf->section; authz_section_conf *old_section = conf->section;
authz_section_conf *section; authz_section_conf *section;
int old_overrides = cmd->override; int old_overrides = cmd->override;
apr_int64_t old_limited = cmd->limited; ap_method_mask_t old_limited = cmd->limited;
const char *errmsg; const char *errmsg;
if (endp == NULL) { if (endp == NULL) {
@@ -1016,7 +1016,7 @@ static authz_status method_check_authorization(request_rec *r,
const char *require_line, const char *require_line,
const void *parsed_require_line) const void *parsed_require_line)
{ {
const apr_int64_t *allowed = parsed_require_line; const ap_method_mask_t *allowed = parsed_require_line;
if (*allowed & (AP_METHOD_BIT << r->method_number)) if (*allowed & (AP_METHOD_BIT << r->method_number))
return AUTHZ_GRANTED; return AUTHZ_GRANTED;
else else
@@ -1027,7 +1027,7 @@ static const char *method_parse_config(cmd_parms *cmd, const char *require_line,
const void **parsed_require_line) const void **parsed_require_line)
{ {
const char *w, *t; const char *w, *t;
apr_int64_t *allowed = apr_pcalloc(cmd->pool, sizeof(apr_int64_t)); ap_method_mask_t *allowed = apr_pcalloc(cmd->pool, sizeof *allowed);
t = require_line; t = require_line;

View File

@@ -854,7 +854,7 @@ AP_DECLARE(const char *) ap_get_status_line(int status)
*/ */
static char *make_allow(request_rec *r) static char *make_allow(request_rec *r)
{ {
apr_int64_t mask; ap_method_mask_t mask;
apr_array_header_t *allow = apr_array_make(r->pool, 10, sizeof(char *)); apr_array_header_t *allow = apr_array_make(r->pool, 10, sizeof(char *));
apr_hash_index_t *hi = apr_hash_first(r->pool, methods_registry); apr_hash_index_t *hi = apr_hash_first(r->pool, methods_registry);
/* For TRACE below */ /* For TRACE below */

View File

@@ -857,7 +857,7 @@ AP_DECLARE(void) ap_allow_standard_methods(request_rec *r, int reset, ...)
{ {
int method; int method;
va_list methods; va_list methods;
apr_int64_t mask; ap_method_mask_t mask;
/* /*
* Get rid of any current settings if requested; not just the * Get rid of any current settings if requested; not just the