diff --git a/httpd-2.4.43-mod_systemd.patch b/httpd-2.4.43-mod_systemd.patch
new file mode 100644
index 0000000000000000000000000000000000000000..8d7922e74143b60ec855fa083307c8ff30d7d6cf
--- /dev/null
+++ b/httpd-2.4.43-mod_systemd.patch
@@ -0,0 +1,96 @@
+
+More verbose startup logging for mod_systemd.
+
+--- httpd-2.4.43/modules/arch/unix/mod_systemd.c.mod_systemd
++++ httpd-2.4.43/modules/arch/unix/mod_systemd.c
+@@ -29,11 +29,14 @@
+ #include "mpm_common.h"
+
+ #include "systemd/sd-daemon.h"
++#include "systemd/sd-journal.h"
+
+ #if APR_HAVE_UNISTD_H
+ #include
+ #endif
+
++static char describe_listeners[30];
++
+ static int systemd_pre_config(apr_pool_t *pconf, apr_pool_t *plog,
+ apr_pool_t *ptemp)
+ {
+@@ -44,6 +47,20 @@
+ return OK;
+ }
+
++static char *dump_listener(ap_listen_rec *lr, apr_pool_t *p)
++{
++ apr_sockaddr_t *sa = lr->bind_addr;
++ char addr[128];
++
++ if (apr_sockaddr_is_wildcard(sa)) {
++ return apr_pstrcat(p, "port ", apr_itoa(p, sa->port), NULL);
++ }
++
++ apr_sockaddr_ip_getbuf(addr, sizeof addr, sa);
++
++ return apr_psprintf(p, "%s port %u", addr, sa->port);
++}
++
+ /* Report the service is ready in post_config, which could be during
+ * startup or after a reload. The server could still hit a fatal
+ * startup error after this point during ap_run_mpm(), so this is
+@@ -51,19 +68,51 @@
+ * the TCP ports so new connections will not be rejected. There will
+ * always be a possible async failure event simultaneous to the
+ * service reporting "ready", so this should be good enough. */
+-static int systemd_post_config(apr_pool_t *p, apr_pool_t *plog,
++static int systemd_post_config(apr_pool_t *pconf, apr_pool_t *plog,
+ apr_pool_t *ptemp, server_rec *main_server)
+ {
++ ap_listen_rec *lr;
++ apr_size_t plen = sizeof describe_listeners;
++ char *p = describe_listeners;
++
++ if (ap_state_query(AP_SQ_MAIN_STATE) == AP_SQ_MS_CREATE_PRE_CONFIG)
++ return OK;
++
++ for (lr = ap_listeners; lr; lr = lr->next) {
++ char *s = dump_listener(lr, ptemp);
++
++ if (strlen(s) + 3 < plen) {
++ char *newp = apr_cpystrn(p, s, plen);
++ if (lr->next)
++ newp = apr_cpystrn(newp, ", ", 3);
++ plen -= newp - p;
++ p = newp;
++ }
++ else {
++ if (plen < 4) {
++ p = describe_listeners + sizeof describe_listeners - 4;
++ plen = 4;
++ }
++ apr_cpystrn(p, "...", plen);
++ break;
++ }
++ }
++
+ sd_notify(0, "READY=1\n"
+ "STATUS=Configuration loaded.\n");
++
++ sd_journal_print(LOG_INFO, "Server configured, listening on: %s",
++ describe_listeners);
++
+ return OK;
+ }
+
+ static int systemd_pre_mpm(apr_pool_t *p, ap_scoreboard_e sb_type)
+ {
+ sd_notifyf(0, "READY=1\n"
+- "STATUS=Processing requests...\n"
+- "MAINPID=%" APR_PID_T_FMT, getpid());
++ "STATUS=Started, listening on: %s\n"
++ "MAINPID=%" APR_PID_T_FMT,
++ describe_listeners, getpid());
+
+ return OK;
+ }
diff --git a/httpd-2.4.43-sslprotdefault.patch b/httpd-2.4.43-sslprotdefault.patch
new file mode 100644
index 0000000000000000000000000000000000000000..d0898239dc52ffb5d8d7cac5607be514007c4411
--- /dev/null
+++ b/httpd-2.4.43-sslprotdefault.patch
@@ -0,0 +1,99 @@
+diff --git a/modules/ssl/ssl_engine_config.c b/modules/ssl/ssl_engine_config.c
+index 27e7a53..b53f3f8 100644
+--- a/modules/ssl/ssl_engine_config.c
++++ b/modules/ssl/ssl_engine_config.c
+@@ -119,7 +119,7 @@ static void modssl_ctx_init(modssl_ctx_t *mctx, apr_pool_t *p)
+ mctx->ticket_key = NULL;
+ #endif
+
+- mctx->protocol = SSL_PROTOCOL_DEFAULT;
++ mctx->protocol = SSL_PROTOCOL_NONE;
+ mctx->protocol_set = 0;
+
+ mctx->pphrase_dialog_type = SSL_PPTYPE_UNSET;
+@@ -263,6 +263,7 @@ static void modssl_ctx_cfg_merge(apr_pool_t *p,
+ if (add->protocol_set) {
+ mrg->protocol_set = 1;
+ mrg->protocol = add->protocol;
++ mrg->protocol_set = 1;
+ }
+ else {
+ mrg->protocol_set = base->protocol_set;
+
+diff --git a/modules/ssl/ssl_engine_init.c b/modules/ssl/ssl_engine_init.c
+index bfad47a..b0fcf81 100644
+--- a/modules/ssl/ssl_engine_init.c
++++ b/modules/ssl/ssl_engine_init.c
+@@ -577,6 +577,7 @@ static apr_status_t ssl_init_ctx_protocol(server_rec *s,
+ MODSSL_SSL_METHOD_CONST SSL_METHOD *method = NULL;
+ char *cp;
+ int protocol = mctx->protocol;
++ int protocol_set = mctx->protocol_set;
+ SSLSrvConfigRec *sc = mySrvConfig(s);
+ #if OPENSSL_VERSION_NUMBER >= 0x10100000L
+ int prot;
+@@ -586,12 +587,18 @@ static apr_status_t ssl_init_ctx_protocol(server_rec *s,
+ * Create the new per-server SSL context
+ */
+ if (protocol == SSL_PROTOCOL_NONE) {
+- ap_log_error(APLOG_MARK, APLOG_EMERG, 0, s, APLOGNO(02231)
+- "No SSL protocols available [hint: SSLProtocol]");
+- return ssl_die(s);
+- }
++ if (protocol_set) {
++ ap_log_error(APLOG_MARK, APLOG_EMERG, 0, s, APLOGNO(02231)
++ "No SSL protocols available [hint: SSLProtocol]");
++ return ssl_die(s);
++ }
+
+- cp = apr_pstrcat(p,
++ ap_log_error(APLOG_MARK, APLOG_TRACE3, 0, s,
++ "Using OpenSSL/system default SSL/TLS protocols");
++ cp = "default";
++ }
++ else {
++ cp = apr_pstrcat(p,
+ #ifndef OPENSSL_NO_SSL3
+ (protocol & SSL_PROTOCOL_SSLV3 ? "SSLv3, " : ""),
+ #endif
+@@ -604,7 +611,8 @@ static apr_status_t ssl_init_ctx_protocol(server_rec *s,
+ #endif
+ #endif
+ NULL);
+- cp[strlen(cp)-2] = NUL;
++ cp[strlen(cp)-2] = NUL;
++ }
+
+ ap_log_error(APLOG_MARK, APLOG_TRACE3, 0, s,
+ "Creating new SSL context (protocols: %s)", cp);
+@@ -705,13 +713,15 @@ static apr_status_t ssl_init_ctx_protocol(server_rec *s,
+ prot = SSL3_VERSION;
+ #endif
+ } else {
+- SSL_CTX_free(ctx);
+- mctx->ssl_ctx = NULL;
+- ap_log_error(APLOG_MARK, APLOG_EMERG, 0, s, APLOGNO(03378)
+- "No SSL protocols available [hint: SSLProtocol]");
+- return ssl_die(s);
++ if (protocol_set) {
++ SSL_CTX_free(ctx);
++ mctx->ssl_ctx = NULL;
++ ap_log_error(APLOG_MARK, APLOG_EMERG, 0, s, APLOGNO(03378)
++ "No SSL protocols available [hint: SSLProtocol]");
++ return ssl_die(s);
++ }
+ }
+- SSL_CTX_set_max_proto_version(ctx, prot);
++ if (protocol != SSL_PROTOCOL_NONE) SSL_CTX_set_max_proto_version(ctx, prot);
+
+ /* Next we scan for the minimal protocol version we should provide,
+ * but we do not allow holes between max and min */
+@@ -731,7 +741,7 @@ static apr_status_t ssl_init_ctx_protocol(server_rec *s,
+ prot = SSL3_VERSION;
+ }
+ #endif
+- SSL_CTX_set_min_proto_version(ctx, prot);
++ if (protocol != SSL_PROTOCOL_NONE) SSL_CTX_set_min_proto_version(ctx, prot);
+ #endif /* if OPENSSL_VERSION_NUMBER < 0x10100000L */
+
+ #ifdef SSL_OP_CIPHER_SERVER_PREFERENCE
diff --git a/httpd-2.4.48-export.patch b/httpd-2.4.48-export.patch
new file mode 100644
index 0000000000000000000000000000000000000000..439f7689adb9d8fb62b621cde7abfff2aa7118a9
--- /dev/null
+++ b/httpd-2.4.48-export.patch
@@ -0,0 +1,63 @@
+
+Reduce size of httpd binary by telling linker to export all symbols
+from libmain.a, rather than bloating the symbol table with ap_hack_*
+to do so indirectly.
+
+Upstream: https://svn.apache.org/r1861685 (as new default-off configure option)
+
+diff --git a/Makefile.in b/Makefile.in
+index 40c7076..ac98e5f 100644
+--- a/Makefile.in
++++ b/Makefile.in
+@@ -4,8 +4,15 @@ CLEAN_SUBDIRS = test
+
+ PROGRAM_NAME = $(progname)
+ PROGRAM_SOURCES = modules.c
+-PROGRAM_LDADD = buildmark.o $(HTTPD_LDFLAGS) $(PROGRAM_DEPENDENCIES) $(HTTPD_LIBS) $(EXTRA_LIBS) $(AP_LIBS) $(LIBS)
++PROGRAM_LDADD = buildmark.o $(HTTPD_LDFLAGS) \
++ $(PROGRAM_LDDEPS) \
++ $(HTTPD_LIBS) $(EXTRA_LIBS) $(AP_LIBS) $(LIBS)
+ PROGRAM_PRELINK = $(COMPILE) -c $(top_srcdir)/server/buildmark.c
++PROGRAM_LDDEPS = \
++ $(BUILTIN_LIBS) \
++ $(MPM_LIB) \
++ -Wl,--whole-archive,server/.libs/libmain.a,--no-whole-archive \
++ os/$(OS_DIR)/libos.la
+ PROGRAM_DEPENDENCIES = \
+ server/libmain.la \
+ $(BUILTIN_LIBS) \
+diff --git a/server/Makefile.in b/server/Makefile.in
+index 8111877..f00bb3f 100644
+--- a/server/Makefile.in
++++ b/server/Makefile.in
+@@ -12,7 +12,7 @@ LTLIBRARY_SOURCES = \
+ connection.c listen.c util_mutex.c \
+ mpm_common.c mpm_unix.c mpm_fdqueue.c \
+ util_charset.c util_cookies.c util_debug.c util_xml.c \
+- util_filter.c util_pcre.c util_regex.c exports.c \
++ util_filter.c util_pcre.c util_regex.c \
+ scoreboard.c error_bucket.c protocol.c core.c request.c ssl.c provider.c \
+ eoc_bucket.c eor_bucket.c core_filters.c \
+ util_expr_parse.c util_expr_scan.c util_expr_eval.c
+diff --git a/server/main.c b/server/main.c
+index 62e06df..17c09ee 100644
+--- a/server/main.c
++++ b/server/main.c
+@@ -835,17 +835,3 @@ int main(int argc, const char * const argv[])
+ return !OK;
+ }
+
+-#ifdef AP_USING_AUTOCONF
+-/* This ugly little hack pulls any function referenced in exports.c into
+- * the web server. exports.c is generated during the build, and it
+- * has all of the APR functions specified by the apr/apr.exports and
+- * apr-util/aprutil.exports files.
+- */
+-const void *ap_suck_in_APR(void);
+-const void *ap_suck_in_APR(void)
+-{
+- extern const void *ap_ugly_hack;
+-
+- return ap_ugly_hack;
+-}
+-#endif
diff --git a/httpd-2.4.48-full-release.patch b/httpd-2.4.48-full-release.patch
new file mode 100644
index 0000000000000000000000000000000000000000..6e31cc7847e12dc0fa9c463782c09cece2827c67
--- /dev/null
+++ b/httpd-2.4.48-full-release.patch
@@ -0,0 +1,46 @@
+diff --git a/server/core.c b/server/core.c
+index c36ff26..621c82a 100644
+--- a/server/core.c
++++ b/server/core.c
+@@ -3569,6 +3569,7 @@ enum server_token_type {
+ SrvTk_MINIMAL, /* eg: Apache/2.0.41 */
+ SrvTk_OS, /* eg: Apache/2.0.41 (UNIX) */
+ SrvTk_FULL, /* eg: Apache/2.0.41 (UNIX) PHP/4.2.2 FooBar/1.2b */
++ SrvTk_FULL_RELEASE, /* eg: Apache/2.0.41 (UNIX) (Release 32.el7) PHP/4.2.2 FooBar/1.2b */
+ SrvTk_PRODUCT_ONLY /* eg: Apache */
+ };
+ static enum server_token_type ap_server_tokens = SrvTk_FULL;
+@@ -3645,7 +3646,10 @@ static void set_banner(apr_pool_t *pconf)
+ else if (ap_server_tokens == SrvTk_MAJOR) {
+ ap_add_version_component(pconf, AP_SERVER_BASEPRODUCT "/" AP_SERVER_MAJORVERSION);
+ }
+- else {
++ else if (ap_server_tokens == SrvTk_FULL_RELEASE) {
++ ap_add_version_component(pconf, AP_SERVER_BASEVERSION " (" PLATFORM ") (Release @RELEASE@)");
++ }
++ else {
+ ap_add_version_component(pconf, AP_SERVER_BASEVERSION " (" PLATFORM ")");
+ }
+
+@@ -3653,7 +3657,7 @@ static void set_banner(apr_pool_t *pconf)
+ * Lock the server_banner string if we're not displaying
+ * the full set of tokens
+ */
+- if (ap_server_tokens != SrvTk_FULL) {
++ if (ap_server_tokens != SrvTk_FULL && ap_server_tokens != SrvTk_FULL_RELEASE) {
+ banner_locked++;
+ }
+ server_description = AP_SERVER_BASEVERSION " (" PLATFORM ")";
+@@ -3686,8 +3690,11 @@ static const char *set_serv_tokens(cmd_parms *cmd, void *dummy,
+ else if (!ap_cstr_casecmp(arg, "Full")) {
+ ap_server_tokens = SrvTk_FULL;
+ }
++ else if (!strcasecmp(arg, "Full-Release")) {
++ ap_server_tokens = SrvTk_FULL_RELEASE;
++ }
+ else {
+- return "ServerTokens takes 1 argument: 'Prod(uctOnly)', 'Major', 'Minor', 'Min(imal)', 'OS', or 'Full'";
++ return "ServerTokens takes 1 argument: 'Prod(uctOnly)', 'Major', 'Minor', 'Min(imal)', 'OS', 'Full' or 'Full-Release'";
+ }
+
+ return NULL;
diff --git a/httpd-2.4.48-proxy-ws-idle-timeout.patch b/httpd-2.4.48-proxy-ws-idle-timeout.patch
new file mode 100644
index 0000000000000000000000000000000000000000..d04dc681e77bbda0d9d3c78993dfa580c652275f
--- /dev/null
+++ b/httpd-2.4.48-proxy-ws-idle-timeout.patch
@@ -0,0 +1,109 @@
+diff --git a/docs/manual/mod/mod_proxy_wstunnel.html.en b/docs/manual/mod/mod_proxy_wstunnel.html.en
+index 9f2c120..61ff7de 100644
+--- a/docs/manual/mod/mod_proxy_wstunnel.html.en
++++ b/docs/manual/mod/mod_proxy_wstunnel.html.en
+@@ -83,6 +83,7 @@ in the response Upgrade
+
+
Available Languages: en |
+diff --git a/modules/proxy/mod_proxy_wstunnel.c b/modules/proxy/mod_proxy_wstunnel.c
+index bcbba42..c29ded1 100644
+--- a/modules/proxy/mod_proxy_wstunnel.c
++++ b/modules/proxy/mod_proxy_wstunnel.c
+@@ -22,6 +22,7 @@ module AP_MODULE_DECLARE_DATA proxy_wstunnel_module;
+ typedef struct {
+ unsigned int fallback_to_proxy_http :1,
+ fallback_to_proxy_http_set :1;
++ apr_time_t idle_timeout;
+ } proxyws_dir_conf;
+
+ static int can_fallback_to_proxy_http;
+@@ -152,6 +153,8 @@ static int proxy_wstunnel_request(apr_pool_t *p, request_rec *r,
+ conn_rec *c = r->connection;
+ apr_socket_t *sock = conn->sock;
+ conn_rec *backconn = conn->connection;
++ proxyws_dir_conf *dconf = ap_get_module_config(r->per_dir_config,
++ &proxy_wstunnel_module);
+ char *buf;
+ apr_bucket_brigade *header_brigade;
+ apr_bucket *e;
+@@ -229,10 +232,13 @@ static int proxy_wstunnel_request(apr_pool_t *p, request_rec *r,
+ c->keepalive = AP_CONN_CLOSE;
+
+ do { /* Loop until done (one side closes the connection, or an error) */
+- rv = apr_pollset_poll(pollset, -1, &pollcnt, &signalled);
++ rv = apr_pollset_poll(pollset, dconf->idle_timeout, &pollcnt, &signalled);
+ if (rv != APR_SUCCESS) {
+ if (APR_STATUS_IS_EINTR(rv)) {
+ continue;
++ } else if(APR_STATUS_IS_TIMEUP(rv)){
++ ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r, "RH: the connection has timed out");
++ return HTTP_REQUEST_TIME_OUT;
+ }
+ ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r, APLOGNO(02444) "error apr_poll()");
+ return HTTP_INTERNAL_SERVER_ERROR;
+@@ -418,11 +424,26 @@ cleanup:
+ return status;
+ }
+
++static const char * proxyws_set_idle(cmd_parms *cmd, void *conf, const char *val)
++{
++ proxyws_dir_conf *dconf = conf;
++ if (ap_timeout_parameter_parse(val, &(dconf->idle_timeout), "s") != APR_SUCCESS)
++ return "ProxyWebsocketIdleTimeout timeout has wrong format";
++
++ if (dconf->idle_timeout < 0)
++ return "ProxyWebsocketIdleTimeout timeout has to be a non-negative number";
++
++ if (!dconf->idle_timeout) dconf->idle_timeout = -1; /* loop indefinitely */
++
++ return NULL;
++}
++
+ static void *create_proxyws_dir_config(apr_pool_t *p, char *dummy)
+ {
+ proxyws_dir_conf *new =
+ (proxyws_dir_conf *) apr_pcalloc(p, sizeof(proxyws_dir_conf));
+
++ new->idle_timeout = -1; /* no timeout */
+ new->fallback_to_proxy_http = 1;
+
+ return (void *) new;
+@@ -465,7 +486,8 @@ static const command_rec ws_proxy_cmds[] =
+ proxyws_fallback_to_proxy_http, NULL, RSRC_CONF|ACCESS_CONF,
+ "whether to let mod_proxy_http handle the upgrade and tunneling, "
+ "On by default"),
+-
++ AP_INIT_TAKE1("ProxyWebsocketIdleTimeout", proxyws_set_idle, NULL, RSRC_CONF|ACCESS_CONF,
++ "timeout for activity in either direction, unlimited by default."),
+ {NULL}
+ };
+
diff --git a/httpd-2.4.57-r1912477+.patch b/httpd-2.4.57-r1912477+.patch
new file mode 100644
index 0000000000000000000000000000000000000000..6458df8148ab68d715f5e956a4ba26765206d480
--- /dev/null
+++ b/httpd-2.4.57-r1912477+.patch
@@ -0,0 +1,381 @@
+# ./pullrev.sh 1912477 1912571 1912718 1913654 1914438
+http://svn.apache.org/viewvc?view=revision&revision=1912477
+http://svn.apache.org/viewvc?view=revision&revision=1912571
+http://svn.apache.org/viewvc?view=revision&revision=1912718
+http://svn.apache.org/viewvc?view=revision&revision=1913654
+http://svn.apache.org/viewvc?view=revision&revision=1914438
+
+--- httpd-2.4.58/modules/dav/fs/config6.m4.r1912477+
++++ httpd-2.4.58/modules/dav/fs/config6.m4
+@@ -20,4 +20,10 @@
+
+ APACHE_MODULE(dav_fs, DAV provider for the filesystem. --enable-dav also enables mod_dav_fs., $dav_fs_objects, , $dav_fs_enable,,dav)
+
++if test "x$enable_dav_fs" = "xshared"; then
++ # The only symbol which needs to be exported is the module
++ # structure, so ask libtool to hide everything else:
++ APR_ADDTO(MOD_DAV_FS_LDADD, [-export-symbols-regex dav_fs_module])
++fi
++
+ APACHE_MODPATH_FINISH
+--- httpd-2.4.58/modules/dav/fs/dbm.c.r1912477+
++++ httpd-2.4.58/modules/dav/fs/dbm.c
+@@ -47,6 +47,10 @@
+ #include "http_log.h"
+ #include "http_main.h" /* for ap_server_conf */
+
++#ifndef DEFAULT_PROPDB_DBM_TYPE
++#define DEFAULT_PROPDB_DBM_TYPE "default"
++#endif
++
+ APLOG_USE_MODULE(dav_fs);
+
+ struct dav_db {
+@@ -100,7 +104,7 @@
+ /* There might not be a if we had problems creating it. */
+ if (db == NULL) {
+ errcode = 1;
+- errstr = "Could not open property database.";
++ errstr = "Could not open database.";
+ if (APR_STATUS_IS_EDSOOPEN(status))
+ ap_log_error(APLOG_MARK, APLOG_CRIT, status, ap_server_conf, APLOGNO(00576)
+ "The DBM driver could not be loaded");
+@@ -129,10 +133,10 @@
+ /* dav_dbm_open_direct: Opens a *dbm database specified by path.
+ * ro = boolean read-only flag.
+ */
+-dav_error * dav_dbm_open_direct(apr_pool_t *p, const char *pathname, int ro,
+- dav_db **pdb)
++dav_error * dav_dbm_open_direct(apr_pool_t *p, const char *pathname,
++ const char *dbmtype, int ro, dav_db **pdb)
+ {
+-#if APU_MAJOR_VERSION > 1 || (APU_MAJOR_VERSION == 1 && APU_MINOR_VERSION >= 7)
++#if APR_MAJOR_VERSION > 1 || (APU_MAJOR_VERSION == 1 && APU_MINOR_VERSION >= 7)
+ const apr_dbm_driver_t *driver;
+ const apu_err_t *err;
+ #endif
+@@ -141,13 +145,13 @@
+
+ *pdb = NULL;
+
+-#if APU_MAJOR_VERSION > 1 || (APU_MAJOR_VERSION == 1 && APU_MINOR_VERSION >= 7)
+- if ((status = apr_dbm_get_driver(&driver, NULL, &err, p)) != APR_SUCCESS) {
++#if APR_MAJOR_VERSION > 1 || (APU_MAJOR_VERSION == 1 && APU_MINOR_VERSION >= 7)
++ if ((status = apr_dbm_get_driver(&driver, dbmtype, &err, p)) != APR_SUCCESS) {
+ ap_log_error(APLOG_MARK, APLOG_ERR, status, ap_server_conf, APLOGNO(10289)
+- "mod_dav_fs: The DBM library '%s' could not be loaded: %s",
+- err->reason, err->msg);
++ "mod_dav_fs: The DBM library '%s' for '%s' could not be loaded: %s",
++ err->reason, dbmtype, err->msg);
+ return dav_new_error(p, HTTP_INTERNAL_SERVER_ERROR, 1, status,
+- "Could not load library for property database.");
++ "Could not load library for database.");
+ }
+ if ((status = apr_dbm_open2(&file, driver, pathname,
+ ro ? APR_DBM_READONLY : APR_DBM_RWCREATE,
+@@ -156,7 +160,7 @@
+ return dav_fs_dbm_error(NULL, p, status);
+ }
+ #else
+- if ((status = apr_dbm_open(&file, pathname,
++ if ((status = apr_dbm_open_ex(&file, dbmtype, pathname,
+ ro ? APR_DBM_READONLY : APR_DBM_RWCREATE,
+ APR_OS_DEFAULT, p))
+ != APR_SUCCESS
+@@ -206,7 +210,7 @@
+
+ /* ### do we need to deal with the umask? */
+
+- return dav_dbm_open_direct(p, pathname, ro, pdb);
++ return dav_dbm_open_direct(p, pathname, DEFAULT_PROPDB_DBM_TYPE, ro, pdb);
+ }
+
+ void dav_dbm_close(dav_db *db)
+--- httpd-2.4.58/modules/dav/fs/lock.c.r1912477+
++++ httpd-2.4.58/modules/dav/fs/lock.c
+@@ -181,8 +181,7 @@
+ {
+ request_rec *r; /* for accessing the uuid state */
+ apr_pool_t *pool; /* a pool to use */
+- const char *lockdb_path; /* where is the lock database? */
+-
++ const dav_fs_server_conf *conf; /* lock database config & metadata */
+ int opened; /* we opened the database */
+ dav_db *db; /* if non-NULL, the lock database */
+ };
+@@ -292,6 +291,19 @@
+ return dav_compare_locktoken(lt1, lt2);
+ }
+
++static apr_status_t dav_fs_lockdb_cleanup(void *data)
++{
++ dav_lockdb *lockdb = data;
++
++ apr_global_mutex_unlock(lockdb->info->conf->lockdb_mutex);
++
++ if (lockdb->info->db) {
++ dav_dbm_close(lockdb->info->db);
++ }
++
++ return APR_SUCCESS;
++}
++
+ /*
+ ** dav_fs_really_open_lockdb:
+ **
+@@ -300,15 +312,27 @@
+ static dav_error * dav_fs_really_open_lockdb(dav_lockdb *lockdb)
+ {
+ dav_error *err;
++ apr_status_t rv;
+
+ if (lockdb->info->opened)
+ return NULL;
+
++ rv = apr_global_mutex_lock(lockdb->info->conf->lockdb_mutex);
++ if (rv) {
++ return dav_new_error(lockdb->info->pool,
++ HTTP_INTERNAL_SERVER_ERROR,
++ DAV_ERR_LOCK_OPENDB, rv,
++ "Could not lock mutex for lock database.");
++ }
++
+ err = dav_dbm_open_direct(lockdb->info->pool,
+- lockdb->info->lockdb_path,
++ lockdb->info->conf->lockdb_path,
++ lockdb->info->conf->lockdb_type,
+ lockdb->ro,
+ &lockdb->info->db);
+ if (err != NULL) {
++ apr_global_mutex_unlock(lockdb->info->conf->lockdb_mutex);
++
+ return dav_push_error(lockdb->info->pool,
+ HTTP_INTERNAL_SERVER_ERROR,
+ DAV_ERR_LOCK_OPENDB,
+@@ -316,6 +340,10 @@
+ err);
+ }
+
++ apr_pool_cleanup_register(lockdb->info->pool, lockdb,
++ dav_fs_lockdb_cleanup,
++ dav_fs_lockdb_cleanup);
++
+ /* all right. it is opened now. */
+ lockdb->info->opened = 1;
+
+@@ -341,9 +369,9 @@
+ comb->pub.info = &comb->priv;
+ comb->priv.r = r;
+ comb->priv.pool = r->pool;
+-
+- comb->priv.lockdb_path = dav_get_lockdb_path(r);
+- if (comb->priv.lockdb_path == NULL) {
++ comb->priv.conf = dav_fs_get_server_conf(r);
++
++ if (comb->priv.conf == NULL || comb->priv.conf->lockdb_path == NULL) {
+ return dav_new_error(r->pool, HTTP_INTERNAL_SERVER_ERROR,
+ DAV_ERR_LOCK_NO_DB, 0,
+ "A lock database was not specified with the "
+@@ -369,8 +397,8 @@
+ */
+ static void dav_fs_close_lockdb(dav_lockdb *lockdb)
+ {
+- if (lockdb->info->db != NULL)
+- dav_dbm_close(lockdb->info->db);
++ apr_pool_cleanup_run(lockdb->info->pool, lockdb,
++ dav_fs_lockdb_cleanup);
+ }
+
+ /*
+--- httpd-2.4.58/modules/dav/fs/mod_dav_fs.c.r1912477+
++++ httpd-2.4.58/modules/dav/fs/mod_dav_fs.c
+@@ -14,31 +14,35 @@
+ * limitations under the License.
+ */
+
++#if !defined(_MSC_VER) && !defined(NETWARE)
++#include "ap_config_auto.h"
++#endif
++
+ #include "httpd.h"
+ #include "http_config.h"
++#include "http_core.h"
++#include "http_log.h"
+ #include "apr_strings.h"
+
+ #include "mod_dav.h"
+ #include "repos.h"
+
+-/* per-server configuration */
+-typedef struct {
+- const char *lockdb_path;
+-
+-} dav_fs_server_conf;
+-
+ extern module AP_MODULE_DECLARE_DATA dav_fs_module;
+
+ #ifndef DEFAULT_DAV_LOCKDB
+ #define DEFAULT_DAV_LOCKDB "davlockdb"
+ #endif
++#ifndef DEFAULT_DAV_LOCKDB_TYPE
++#define DEFAULT_DAV_LOCKDB_TYPE "default"
++#endif
+
+-const char *dav_get_lockdb_path(const request_rec *r)
+-{
+- dav_fs_server_conf *conf;
++static const char dav_fs_mutexid[] = "dav_fs-lockdb";
+
+- conf = ap_get_module_config(r->server->module_config, &dav_fs_module);
+- return conf->lockdb_path;
++static apr_global_mutex_t *dav_fs_lockdb_mutex;
++
++const dav_fs_server_conf *dav_fs_get_server_conf(const request_rec *r)
++{
++ return ap_get_module_config(r->server->module_config, &dav_fs_module);
+ }
+
+ static void *dav_fs_create_server_config(apr_pool_t *p, server_rec *s)
+@@ -57,15 +61,50 @@
+
+ newconf->lockdb_path =
+ child->lockdb_path ? child->lockdb_path : parent->lockdb_path;
++ newconf->lockdb_type =
++ child->lockdb_type ? child->lockdb_type : parent->lockdb_type;
+
+ return newconf;
+ }
+
++static int dav_fs_pre_config(apr_pool_t *pconf, apr_pool_t *plog, apr_pool_t *ptemp)
++{
++ if (ap_mutex_register(pconf, dav_fs_mutexid, NULL, APR_LOCK_DEFAULT, 0))
++ return !OK;
++ return OK;
++}
++
++static void dav_fs_child_init(apr_pool_t *p, server_rec *s)
++{
++ apr_status_t rv;
++
++ rv = apr_global_mutex_child_init(&dav_fs_lockdb_mutex,
++ apr_global_mutex_lockfile(dav_fs_lockdb_mutex),
++ p);
++ if (rv) {
++ ap_log_error(APLOG_MARK, APLOG_ERR, rv, s,
++ APLOGNO(10488) "child init failed for mutex");
++ }
++}
++
+ static apr_status_t dav_fs_post_config(apr_pool_t *p, apr_pool_t *plog,
+ apr_pool_t *ptemp, server_rec *base_server)
+ {
+ server_rec *s;
++ apr_status_t rv;
+
++ /* Ignore first pass through the config. */
++ if (ap_state_query(AP_SQ_MAIN_STATE) == AP_SQ_MS_CREATE_PRE_CONFIG)
++ return OK;
++
++ rv = ap_global_mutex_create(&dav_fs_lockdb_mutex, NULL, dav_fs_mutexid, NULL,
++ base_server, p, 0);
++ if (rv) {
++ ap_log_error(APLOG_MARK, APLOG_ERR, rv, base_server,
++ APLOGNO(10489) "could not create lock mutex");
++ return !OK;
++ }
++
+ for (s = base_server; s; s = s->next) {
+ dav_fs_server_conf *conf;
+
+@@ -74,6 +113,13 @@
+ if (!conf->lockdb_path) {
+ conf->lockdb_path = ap_state_dir_relative(p, DEFAULT_DAV_LOCKDB);
+ }
++ if (!conf->lockdb_type) {
++ conf->lockdb_type = DEFAULT_DAV_LOCKDB_TYPE;
++ }
++
++ /* Mutex is common across all vhosts, but could have one per
++ * vhost if required. */
++ conf->lockdb_mutex = dav_fs_lockdb_mutex;
+ }
+
+ return OK;
+@@ -98,19 +144,36 @@
+ return NULL;
+ }
+
++/*
++ * Command handler for the DAVLockDBType directive, which is TAKE1
++ */
++static const char *dav_fs_cmd_davlockdbtype(cmd_parms *cmd, void *config,
++ const char *arg1)
++{
++ dav_fs_server_conf *conf = ap_get_module_config(cmd->server->module_config,
++ &dav_fs_module);
++ conf->lockdb_type = arg1;
++
++ return NULL;
++}
++
+ static const command_rec dav_fs_cmds[] =
+ {
+ /* per server */
+ AP_INIT_TAKE1("DAVLockDB", dav_fs_cmd_davlockdb, NULL, RSRC_CONF,
+ "specify a lock database"),
++ AP_INIT_TAKE1("DAVLockDBType", dav_fs_cmd_davlockdbtype, NULL, RSRC_CONF,
++ "specify a lock database DBM type"),
+
+ { NULL }
+ };
+
+ static void register_hooks(apr_pool_t *p)
+ {
++ ap_hook_pre_config(dav_fs_pre_config, NULL, NULL, APR_HOOK_MIDDLE);
+ ap_hook_post_config(dav_fs_post_config, NULL, NULL, APR_HOOK_MIDDLE);
+-
++ ap_hook_child_init(dav_fs_child_init, NULL, NULL, APR_HOOK_MIDDLE);
++
+ dav_hook_gather_propsets(dav_fs_gather_propsets, NULL, NULL,
+ APR_HOOK_MIDDLE);
+ dav_hook_find_liveprop(dav_fs_find_liveprop, NULL, NULL, APR_HOOK_MIDDLE);
+--- httpd-2.4.58/modules/dav/fs/repos.h.r1912477+
++++ httpd-2.4.58/modules/dav/fs/repos.h
+@@ -25,6 +25,8 @@
+ #ifndef _DAV_FS_REPOS_H_
+ #define _DAV_FS_REPOS_H_
+
++#include "util_mutex.h"
++
+ /* the subdirectory to hold all DAV-related information for a directory */
+ #define DAV_FS_STATE_DIR ".DAV"
+ #define DAV_FS_STATE_FILE_FOR_DIR ".state_for_dir"
+@@ -53,8 +55,8 @@
+ /* DBM functions used by the repository and locking providers */
+ extern const dav_hooks_db dav_hooks_db_dbm;
+
+-dav_error * dav_dbm_open_direct(apr_pool_t *p, const char *pathname, int ro,
+- dav_db **pdb);
++dav_error * dav_dbm_open_direct(apr_pool_t *p, const char *pathname,
++ const char *dbmtype, int ro, dav_db **pdb);
+ void dav_dbm_get_statefiles(apr_pool_t *p, const char *fname,
+ const char **state1, const char **state2);
+ dav_error * dav_dbm_delete(dav_db *db, apr_datum_t key);
+@@ -64,8 +66,15 @@
+ int dav_dbm_exists(dav_db *db, apr_datum_t key);
+ void dav_dbm_close(dav_db *db);
+
+-/* where is the lock database located? */
+-const char *dav_get_lockdb_path(const request_rec *r);
++/* Per-server configuration. */
++typedef struct {
++ const char *lockdb_path;
++ const char *lockdb_type;
++ apr_global_mutex_t *lockdb_mutex;
++} dav_fs_server_conf;
++
++/* Returns server configuration for the request. */
++const dav_fs_server_conf *dav_fs_get_server_conf(const request_rec *r);
+
+ const dav_hooks_locks *dav_fs_get_lock_hooks(request_rec *r);
+ const dav_hooks_propdb *dav_fs_get_propdb_hooks(request_rec *r);
diff --git a/httpd-2.4.57-selinux.patch b/httpd-2.4.57-selinux.patch
new file mode 100644
index 0000000000000000000000000000000000000000..20babde25ad6a40d8dc8007e8de760bf455b99d7
--- /dev/null
+++ b/httpd-2.4.57-selinux.patch
@@ -0,0 +1,60 @@
+diff --git a/configure.in b/configure.in
+index 3932407..00e2369 100644
+--- a/configure.in
++++ b/configure.in
+@@ -531,6 +531,11 @@ gettid
+ dnl confirm that a void pointer is large enough to store a long integer
+ APACHE_CHECK_VOID_PTR_LEN
+
++AC_CHECK_LIB(selinux, is_selinux_enabled, [
++ AC_DEFINE(HAVE_SELINUX, 1, [Defined if SELinux is supported])
++ APR_ADDTO(HTTPD_LIBS, [-lselinux])
++])
++
+ if test $ac_cv_func_gettid = no; then
+ # On Linux before glibc 2.30, gettid() is only usable via syscall()
+ AC_CACHE_CHECK([for gettid() via syscall], ap_cv_gettid,
+diff --git a/server/core.c b/server/core.c
+index 8970a50..ff1024d 100644
+--- a/server/core.c
++++ b/server/core.c
+@@ -65,6 +65,10 @@
+ #include
+ #endif
+
++#ifdef HAVE_SELINUX
++#include
++#endif
++
+ /* LimitRequestBody handling */
+ #define AP_LIMIT_REQ_BODY_UNSET ((apr_off_t) -1)
+ #define AP_DEFAULT_LIMIT_REQ_BODY ((apr_off_t) 1<<30) /* 1GB */
+@@ -5170,6 +5174,28 @@ static int core_post_config(apr_pool_t *pconf, apr_pool_t *plog, apr_pool_t *pte
+ }
+ #endif
+
++#ifdef HAVE_SELINUX
++ {
++ static int already_warned = 0;
++ int is_enabled = is_selinux_enabled() > 0;
++
++ if (is_enabled && !already_warned) {
++ security_context_t con;
++
++ if (getcon(&con) == 0) {
++
++ ap_log_error(APLOG_MARK, APLOG_NOTICE, 0, NULL,
++ "SELinux policy enabled; "
++ "httpd running as context %s", con);
++
++ already_warned = 1;
++
++ freecon(con);
++ }
++ }
++ }
++#endif
++
+ return OK;
+ }
+
diff --git a/httpd-2.4.59-deplibs.patch b/httpd-2.4.59-deplibs.patch
new file mode 100644
index 0000000000000000000000000000000000000000..fc730ab59c63560656c3c5e84800a5590ee23e2f
--- /dev/null
+++ b/httpd-2.4.59-deplibs.patch
@@ -0,0 +1,16 @@
+diff --git a/configure.in b/configure.in
+index 7194de5..00e2369 100644
+--- a/configure.in
++++ b/configure.in
+@@ -843,9 +843,9 @@ APACHE_SUBST(INSTALL_SUEXEC)
+
+ dnl APR should go after the other libs, so the right symbols can be picked up
+ if test x${apu_found} != xobsolete; then
+- AP_LIBS="$AP_LIBS `$apu_config --avoid-ldap --link-libtool --libs`"
++ AP_LIBS="$AP_LIBS `$apu_config --avoid-ldap --link-libtool`"
+ fi
+-AP_LIBS="$AP_LIBS `$apr_config --link-libtool --libs`"
++AP_LIBS="$AP_LIBS `$apr_config --link-libtool`"
+ APACHE_SUBST(AP_LIBS)
+ APACHE_SUBST(AP_BUILD_SRCLIB_DIRS)
+ APACHE_SUBST(AP_CLEAN_SRCLIB_DIRS)
diff --git a/httpd-2.4.62-engine-fallback.patch b/httpd-2.4.62-engine-fallback.patch
new file mode 100644
index 0000000000000000000000000000000000000000..d10d2c5f35178ef05ce6c7ec483a49c91c2bd2df
--- /dev/null
+++ b/httpd-2.4.62-engine-fallback.patch
@@ -0,0 +1,64 @@
+Index: modules/ssl/ssl_engine_pphrase.c
+===================================================================
+--- modules/ssl/ssl_engine_pphrase.c (revision 1920590)
++++ modules/ssl/ssl_engine_pphrase.c (working copy)
+@@ -806,6 +806,9 @@
+ return APR_SUCCESS;
+ }
+
++/* Tries to load the key and optionally certificate via the ENGINE
++ * API. Returns APR_ENOTIMPL if the keypair could not be loaded via an
++ * ENGINE implementation. */
+ static apr_status_t modssl_load_keypair_engine(server_rec *s, apr_pool_t *pconf,
+ apr_pool_t *ptemp,
+ const char *vhostid,
+@@ -831,7 +834,7 @@
+ ap_log_error(APLOG_MARK, APLOG_EMERG, 0, s, APLOGNO(10131)
+ "Init: Unrecognized private key identifier `%s'",
+ keyid);
+- return ssl_die(s);
++ return APR_ENOTIMPL;
+ }
+
+ scheme = apr_pstrmemdup(ptemp, keyid, c - keyid);
+@@ -839,8 +842,8 @@
+ ap_log_error(APLOG_MARK, APLOG_EMERG, 0, s, APLOGNO(10132)
+ "Init: Failed to load engine for private key %s",
+ keyid);
+- ssl_log_ssl_error(SSLLOG_MARK, APLOG_EMERG, s);
+- return ssl_die(s);
++ ssl_log_ssl_error(SSLLOG_MARK, APLOG_NOTICE, s);
++ return APR_ENOTIMPL;
+ }
+
+ if (!ENGINE_init(e)) {
+@@ -996,15 +999,21 @@
+ X509 **pubkey, EVP_PKEY **privkey)
+ {
+ #if MODSSL_HAVE_ENGINE_API
+- SSLModConfigRec *mc = myModConfig(s);
++ apr_status_t rv;
+
+- /* For OpenSSL 3.x, use the STORE-based API if either ENGINE
+- * support was not present compile-time, or if it's built but
+- * SSLCryptoDevice is not configured. */
+- if (mc->szCryptoDevice)
+- return modssl_load_keypair_engine(s, pconf, ptemp,
+- vhostid, certid, keyid,
+- pubkey, privkey);
++ rv = modssl_load_keypair_engine(s, pconf, ptemp,
++ vhostid, certid, keyid,
++ pubkey, privkey);
++ if (rv == APR_SUCCESS) {
++ return rv;
++ }
++ /* If STORE support is not present, all errors are fatal here; if
++ * STORE is present and the ENGINE could not be loaded, ignore the
++ * error and fall through to try loading via the STORE API. */
++ else if (!MODSSL_HAVE_OPENSSL_STORE || rv != APR_ENOTIMPL) {
++ return ssl_die(s);
++ }
++
+ #endif
+ #if MODSSL_HAVE_OPENSSL_STORE
+ return modssl_load_keypair_store(s, ptemp, vhostid, certid, keyid,
diff --git a/httpd-2.4.62-freebind.patch b/httpd-2.4.62-freebind.patch
new file mode 100644
index 0000000000000000000000000000000000000000..93a0143966c0db746c111bb59e48d67aa1f9e32e
--- /dev/null
+++ b/httpd-2.4.62-freebind.patch
@@ -0,0 +1,124 @@
+diff --git a/docs/manual/mod/mpm_common.html.en b/docs/manual/mod/mpm_common.html.en
+index d7a2fea..c911a4e 100644
+--- a/docs/manual/mod/mpm_common.html.en
++++ b/docs/manual/mod/mpm_common.html.en
+@@ -42,6 +42,7 @@ more than one multi-processing module (MPM)
+
EnableExceptionHook
+
GracefulShutdownTimeout
+
Listen
++
ListenFree
+
ListenBackLog
+
ListenCoresBucketsRatio
+
MaxConnectionsPerChild
+@@ -244,6 +245,31 @@ discussion of the Address already in use
error message,
+ including other causes.
+
+
++
++