svn commit: r1936893 - httpd/httpd/trunk/server
[email protected] Wed, 05 Aug 2026 09:00:00 -0000
| Newsgroups | gmane.comp.apache.cvs |
|---|---|
| Message-ID | <178592040092.2592446.9727899192487977069@svn03-he-fi> |
Author: gbechis
Date: Wed Aug 5 09:00:00 2026
New Revision: 1936893
Log:
OpenBSD doesn't support connect() to INADDR_ANY and returns EINVAL (22),
fallback to 127.0.0.1 if lp->bind_addr is INADDR_ANY and that connect() fails with EINVAL
bz #69857
Modified:
httpd/httpd/trunk/server/mpm_unix.c
Modified: httpd/httpd/trunk/server/mpm_unix.c
==============================================================================
--- httpd/httpd/trunk/server/mpm_unix.c Wed Aug 5 08:30:54 2026 (r1936892)
+++ httpd/httpd/trunk/server/mpm_unix.c Wed Aug 5 09:00:00 2026 (r1936893)
@@ -674,6 +674,34 @@ static apr_status_t dummy_connection(ap_
}
rv = apr_socket_connect(sock, lp->bind_addr);
+#ifdef __OpenBSD__
+ /* OpenBSD's connect() returns EINVAL when the target address is the
+ * wildcard address (INADDR_ANY / IN6ADDR_ANY),
+ * Retry against the loopback address in that case. */
+ if (rv != APR_SUCCESS && APR_STATUS_IS_EINVAL(rv)) {
+ int is_wildcard = 0;
+
+ if (lp->bind_addr->family == APR_INET) {
+ is_wildcard = (lp->bind_addr->sa.sin.sin_addr.s_addr == INADDR_ANY);
+ }
+#if APR_HAVE_IPV6
+ else if (lp->bind_addr->family == APR_INET6) {
+ is_wildcard = IN6_IS_ADDR_UNSPECIFIED(&lp->bind_addr->sa.sin6.sin6_addr);
+ }
+#endif
+
+ if (is_wildcard) {
+ apr_sockaddr_t *loopback;
+ const char *ip = (lp->bind_addr->family == APR_INET6) ? "::1" : "127.0.0.1";
+
+ rv = apr_sockaddr_info_get(&loopback, ip, lp->bind_addr->family,
+ lp->bind_addr->port, 0, p);
+ if (rv == APR_SUCCESS) {
+ rv = apr_socket_connect(sock, loopback);
+ }
+ }
+ }
+#endif /* __OpenBSD__ */
if (rv != APR_SUCCESS) {
int log_level = APLOG_WARNING;