diff --git a/httpd-2.4.46-freebind.patch b/httpd-2.4.46-freebind.patch
new file mode 100644
index 0000000..b348dcc
--- /dev/null
+++ b/httpd-2.4.46-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 e7af21d..01d54b7 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.
+
+
++
++
++
++
++
The ListenFree
directive is
++ identical to the Listen
directive.
++ The only difference is in the usage of the IP_FREEBIND socket
++ option, which is enabled by default with ListenFree
.
++ If IP_FREEBIND is enabled, it allows httpd to bind to an IP
++ address that is nonlocal or does not (yet) exist. This allows httpd to
++ listen on a socket without requiring the underlying network interface
++ or the specified dynamic IP address to be up at the time when httpd
++ is trying to bind to it.
++
++
++
++
+ ![top](../images/up.gif)
+
+
+diff --git a/include/ap_listen.h b/include/ap_listen.h
+index 58c2574..1a53292 100644
+--- a/include/ap_listen.h
++++ b/include/ap_listen.h
+@@ -137,6 +137,9 @@ AP_DECLARE_NONSTD(const char *) ap_set_listenbacklog(cmd_parms *cmd, void *dummy
+ AP_DECLARE_NONSTD(const char *) ap_set_listencbratio(cmd_parms *cmd, void *dummy, const char *arg);
+ AP_DECLARE_NONSTD(const char *) ap_set_listener(cmd_parms *cmd, void *dummy,
+ int argc, char *const argv[]);
++AP_DECLARE_NONSTD(const char *) ap_set_freelistener(cmd_parms *cmd, void *dummy,
++ int argc, char *const argv[]);
++
+ AP_DECLARE_NONSTD(const char *) ap_set_send_buffer_size(cmd_parms *cmd, void *dummy,
+ const char *arg);
+ AP_DECLARE_NONSTD(const char *) ap_set_receive_buffer_size(cmd_parms *cmd,
+@@ -150,6 +153,8 @@ AP_INIT_TAKE1("ListenCoresBucketsRatio", ap_set_listencbratio, NULL, RSRC_CONF,
+ "Ratio between the number of CPU cores (online) and the number of listeners buckets"), \
+ AP_INIT_TAKE_ARGV("Listen", ap_set_listener, NULL, RSRC_CONF, \
+ "A port number or a numeric IP address and a port number, and an optional protocol"), \
++AP_INIT_TAKE_ARGV("ListenFree", ap_set_freelistener, NULL, RSRC_CONF, \
++ "A port number or a numeric IP address and a port number, and an optional protocol"), \
+ AP_INIT_TAKE1("SendBufferSize", ap_set_send_buffer_size, NULL, RSRC_CONF, \
+ "Send buffer size in bytes"), \
+ AP_INIT_TAKE1("ReceiveBufferSize", ap_set_receive_buffer_size, NULL, \
+diff --git a/server/listen.c b/server/listen.c
+index e2e028a..6ef664b 100644
+--- a/server/listen.c
++++ b/server/listen.c
+@@ -63,6 +63,7 @@ static int ap_listenbacklog;
+ static int ap_listencbratio;
+ static int send_buffer_size;
+ static int receive_buffer_size;
++static int ap_listenfreebind;
+ #ifdef HAVE_SYSTEMD
+ static int use_systemd = -1;
+ #endif
+@@ -162,6 +163,21 @@ static apr_status_t make_sock(apr_pool_t *p, ap_listen_rec *server, int do_bind_
+ }
+ #endif
+
++
++#if defined(APR_SO_FREEBIND)
++ if (ap_listenfreebind) {
++ if (apr_socket_opt_set(s, APR_SO_FREEBIND, one) < 0) {
++ stat = apr_get_netos_error();
++ ap_log_perror(APLOG_MARK, APLOG_CRIT, stat, p, APLOGNO(02182)
++ "make_sock: apr_socket_opt_set: "
++ "error setting APR_SO_FREEBIND");
++ apr_socket_close(s);
++ return stat;
++ }
++ }
++#endif
++
++
+ if (do_bind_listen) {
+ #if APR_HAVE_IPV6
+ if (server->bind_addr->family == APR_INET6) {
+@@ -956,6 +972,7 @@ AP_DECLARE(void) ap_listen_pre_config(void)
+ }
+ }
+
++
+ AP_DECLARE_NONSTD(const char *) ap_set_listener(cmd_parms *cmd, void *dummy,
+ int argc, char *const argv[])
+ {
+@@ -1016,6 +1033,14 @@ AP_DECLARE_NONSTD(const char *) ap_set_listener(cmd_parms *cmd, void *dummy,
+ return alloc_listener(cmd->server->process, host, port, proto, NULL);
+ }
+
++AP_DECLARE_NONSTD(const char *) ap_set_freelistener(cmd_parms *cmd, void *dummy,
++ int argc,
++ char *const argv[])
++{
++ ap_listenfreebind = 1;
++ return ap_set_listener(cmd, dummy, argc, argv);
++}
++
+ AP_DECLARE_NONSTD(const char *) ap_set_listenbacklog(cmd_parms *cmd,
+ void *dummy,
+ const char *arg)
diff --git a/httpd.spec b/httpd.spec
index 4f0fc81..1713f77 100644
--- a/httpd.spec
+++ b/httpd.spec
@@ -13,7 +13,7 @@
Summary: Apache HTTP Server
Name: httpd
Version: 2.4.46
-Release: 14%{?dist}
+Release: 15%{?dist}
URL: https://httpd.apache.org/
Source0: https://www.apache.org/dist/httpd/httpd-%{version}.tar.bz2
Source1: https://www.apache.org/dist/httpd/httpd-%{version}.tar.bz2.asc
@@ -89,6 +89,9 @@ Patch45: httpd-2.4.43-logjournal.patch
Patch46: httpd-2.4.46-proxy-ws-idle-timeout.patch
# https://bugzilla.redhat.com/show_bug.cgi?id=1949969
Patch47: httpd-2.4.43-pr37355.patch
+# https://bugzilla.redhat.com/show_bug.cgi?id=1949606
+Patch48: httpd-2.4.46-freebind.patch
+
# Bug fixes
# https://bugzilla.redhat.com/show_bug.cgi?id=1397243
@@ -244,6 +247,7 @@ written in the Lua programming language.
%patch45 -p1 -b .logjournal
%patch46 -p1 -b .proxy-ws-idle-timeout
%patch47 -p1 -b .pr37355
+%patch48 -p1 -b .freebind
%patch60 -p1 -b .enable-sslv3
%patch62 -p1 -b .r1870095
@@ -789,6 +793,9 @@ exit $rv
%{_rpmconfigdir}/macros.d/macros.httpd
%changelog
+* Wed May 26 2021 Luboš Uhliarik - 2.4.46-15
+- Resolves: #1949606 - RFE: httpd, add IP_FREEBIND support for Listen
+
* Wed May 19 2021 Lubos Uhliarik - 2.4.46-14
- Resolves: #1949969 - httpd : mod_proxy should allow to specify
Proxy-Authorization in ProxyRemote directive