mirror of
https://github.com/apache/httpd.git
synced 2025-08-08 15:02:10 +03:00
mod_proxy: Don't limit the size of the connectable Unix Domain Socket paths.
Since connect() to UDS path is used at several places, introduce ap_proxy_connect_uds() in proxy_util. git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1602989 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
@@ -24,12 +24,6 @@
|
||||
#error This module only works on unix platforms with the correct OS support
|
||||
#endif
|
||||
|
||||
#include "apr_version.h"
|
||||
#if APR_MAJOR_VERSION < 2
|
||||
/* for apr_wait_for_io_or_timeout */
|
||||
#include "apr_support.h"
|
||||
#endif
|
||||
|
||||
#include "mod_proxy_fdpass.h"
|
||||
|
||||
module AP_MODULE_DECLARE_DATA proxy_fdpass_module;
|
||||
@@ -54,56 +48,10 @@ static int proxy_fdpass_canon(request_rec *r, char *url)
|
||||
return OK;
|
||||
}
|
||||
|
||||
/* TODO: In APR 2.x: Extend apr_sockaddr_t to possibly be a path !!! */
|
||||
/* XXX: The same function exists in proxy_util.c */
|
||||
static apr_status_t socket_connect_un(apr_socket_t *sock,
|
||||
struct sockaddr_un *sa)
|
||||
{
|
||||
apr_status_t rv;
|
||||
apr_os_sock_t rawsock;
|
||||
apr_interval_time_t t;
|
||||
|
||||
rv = apr_os_sock_get(&rawsock, sock);
|
||||
if (rv != APR_SUCCESS) {
|
||||
return rv;
|
||||
}
|
||||
|
||||
rv = apr_socket_timeout_get(sock, &t);
|
||||
if (rv != APR_SUCCESS) {
|
||||
return rv;
|
||||
}
|
||||
|
||||
do {
|
||||
const socklen_t addrlen = APR_OFFSETOF(struct sockaddr_un, sun_path)
|
||||
+ strlen(sa->sun_path) + 1;
|
||||
rv = connect(rawsock, (struct sockaddr*)sa, addrlen);
|
||||
} while (rv == -1 && errno == EINTR);
|
||||
|
||||
if ((rv == -1) && (errno == EINPROGRESS || errno == EALREADY)
|
||||
&& (t > 0)) {
|
||||
#if APR_MAJOR_VERSION < 2
|
||||
rv = apr_wait_for_io_or_timeout(NULL, sock, 0);
|
||||
#else
|
||||
rv = apr_socket_wait(sock, APR_WAIT_WRITE);
|
||||
#endif
|
||||
|
||||
if (rv != APR_SUCCESS) {
|
||||
return rv;
|
||||
}
|
||||
}
|
||||
|
||||
if (rv == -1 && errno != EISCONN) {
|
||||
return errno;
|
||||
}
|
||||
|
||||
return APR_SUCCESS;
|
||||
}
|
||||
|
||||
static apr_status_t get_socket_from_path(apr_pool_t *p,
|
||||
const char* path,
|
||||
apr_socket_t **out_sock)
|
||||
{
|
||||
struct sockaddr_un sa;
|
||||
apr_socket_t *s;
|
||||
apr_status_t rv;
|
||||
*out_sock = NULL;
|
||||
@@ -114,10 +62,7 @@ static apr_status_t get_socket_from_path(apr_pool_t *p,
|
||||
return rv;
|
||||
}
|
||||
|
||||
sa.sun_family = AF_UNIX;
|
||||
apr_cpystrn(sa.sun_path, path, sizeof(sa.sun_path));
|
||||
|
||||
rv = socket_connect_un(s, &sa);
|
||||
rv = ap_proxy_connect_uds(s, path, p);
|
||||
if (rv != APR_SUCCESS) {
|
||||
return rv;
|
||||
}
|
||||
|
Reference in New Issue
Block a user