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:
5
CHANGES
5
CHANGES
@@ -1,6 +1,9 @@
|
|||||||
-*- coding: utf-8 -*-
|
-*- coding: utf-8 -*-
|
||||||
Changes with Apache 2.5.0
|
Changes with Apache 2.5.0
|
||||||
|
|
||||||
|
*) mod_proxy: Don't limit the size of the connectable Unix Domain Socket
|
||||||
|
paths. [Christophe Jaillet, Yann Ylavic]
|
||||||
|
|
||||||
*) mod_ssl: dump SSL IO/state for the write side of the connection(s),
|
*) mod_ssl: dump SSL IO/state for the write side of the connection(s),
|
||||||
like reads (level TRACE4). [Yann Ylavic]
|
like reads (level TRACE4). [Yann Ylavic]
|
||||||
|
|
||||||
@@ -31,7 +34,7 @@ Changes with Apache 2.5.0
|
|||||||
PR 56286 [Micha Lenk <micha lenk info>]
|
PR 56286 [Micha Lenk <micha lenk info>]
|
||||||
|
|
||||||
*) mod_proxy_fdpass: Fix computation of the size of 'struct sockaddr_un'
|
*) mod_proxy_fdpass: Fix computation of the size of 'struct sockaddr_un'
|
||||||
when passed to 'connec()'.
|
when passed to 'connect()'.
|
||||||
[Graham Dumpleton <grahamd apache org>]
|
[Graham Dumpleton <grahamd apache org>]
|
||||||
|
|
||||||
*) mod_socache_shmcb: Correct counting of expirations for status display.
|
*) mod_socache_shmcb: Correct counting of expirations for status display.
|
||||||
|
@@ -461,6 +461,7 @@
|
|||||||
Changes 3rd argument's type of
|
Changes 3rd argument's type of
|
||||||
ap_mpm_register_socket_callback and
|
ap_mpm_register_socket_callback and
|
||||||
ap_mpm_register_socket_callback_timeout.
|
ap_mpm_register_socket_callback_timeout.
|
||||||
|
* 20140611.1 (2.5.0-dev) Add ap_proxy_connect_uds().
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define MODULE_MAGIC_COOKIE 0x41503235UL /* "AP25" */
|
#define MODULE_MAGIC_COOKIE 0x41503235UL /* "AP25" */
|
||||||
@@ -468,7 +469,7 @@
|
|||||||
#ifndef MODULE_MAGIC_NUMBER_MAJOR
|
#ifndef MODULE_MAGIC_NUMBER_MAJOR
|
||||||
#define MODULE_MAGIC_NUMBER_MAJOR 20140611
|
#define MODULE_MAGIC_NUMBER_MAJOR 20140611
|
||||||
#endif
|
#endif
|
||||||
#define MODULE_MAGIC_NUMBER_MINOR 0 /* 0...n */
|
#define MODULE_MAGIC_NUMBER_MINOR 1 /* 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
|
||||||
|
@@ -874,6 +874,17 @@ PROXY_DECLARE(int) ap_proxy_connect_backend(const char *proxy_function,
|
|||||||
proxy_conn_rec *conn,
|
proxy_conn_rec *conn,
|
||||||
proxy_worker *worker,
|
proxy_worker *worker,
|
||||||
server_rec *s);
|
server_rec *s);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Make a connection to a Unix Domain Socket (UDS) path
|
||||||
|
* @param sock UDS to connect
|
||||||
|
* @param uds_path UDS path to connect to
|
||||||
|
* @param p pool to make the sock addr
|
||||||
|
* @return APR_SUCCESS or error status
|
||||||
|
*/
|
||||||
|
PROXY_DECLARE(apr_status_t) ap_proxy_connect_uds(apr_socket_t *sock,
|
||||||
|
const char *uds_path,
|
||||||
|
apr_pool_t *p);
|
||||||
/**
|
/**
|
||||||
* Make a connection record for backend connection
|
* Make a connection record for backend connection
|
||||||
* @param proxy_function calling proxy scheme (http, ajp, ...)
|
* @param proxy_function calling proxy scheme (http, ajp, ...)
|
||||||
|
@@ -24,12 +24,6 @@
|
|||||||
#error This module only works on unix platforms with the correct OS support
|
#error This module only works on unix platforms with the correct OS support
|
||||||
#endif
|
#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"
|
#include "mod_proxy_fdpass.h"
|
||||||
|
|
||||||
module AP_MODULE_DECLARE_DATA proxy_fdpass_module;
|
module AP_MODULE_DECLARE_DATA proxy_fdpass_module;
|
||||||
@@ -54,56 +48,10 @@ static int proxy_fdpass_canon(request_rec *r, char *url)
|
|||||||
return OK;
|
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,
|
static apr_status_t get_socket_from_path(apr_pool_t *p,
|
||||||
const char* path,
|
const char* path,
|
||||||
apr_socket_t **out_sock)
|
apr_socket_t **out_sock)
|
||||||
{
|
{
|
||||||
struct sockaddr_un sa;
|
|
||||||
apr_socket_t *s;
|
apr_socket_t *s;
|
||||||
apr_status_t rv;
|
apr_status_t rv;
|
||||||
*out_sock = NULL;
|
*out_sock = NULL;
|
||||||
@@ -114,10 +62,7 @@ static apr_status_t get_socket_from_path(apr_pool_t *p,
|
|||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
||||||
sa.sun_family = AF_UNIX;
|
rv = ap_proxy_connect_uds(s, path, p);
|
||||||
apr_cpystrn(sa.sun_path, path, sizeof(sa.sun_path));
|
|
||||||
|
|
||||||
rv = socket_connect_un(s, &sa);
|
|
||||||
if (rv != APR_SUCCESS) {
|
if (rv != APR_SUCCESS) {
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
@@ -2550,13 +2550,16 @@ static apr_status_t send_http_connect(proxy_conn_rec *backend,
|
|||||||
|
|
||||||
|
|
||||||
#if APR_HAVE_SYS_UN_H
|
#if APR_HAVE_SYS_UN_H
|
||||||
/* lifted from mod_proxy_fdpass.c; tweaked addrlen in connect() call */
|
/* TODO: In APR 2.x: Extend apr_sockaddr_t to possibly be a path !!! */
|
||||||
static apr_status_t socket_connect_un(apr_socket_t *sock,
|
PROXY_DECLARE(apr_status_t) ap_proxy_connect_uds(apr_socket_t *sock,
|
||||||
struct sockaddr_un *sa)
|
const char *uds_path,
|
||||||
|
apr_pool_t *p)
|
||||||
{
|
{
|
||||||
apr_status_t rv;
|
apr_status_t rv;
|
||||||
apr_os_sock_t rawsock;
|
apr_os_sock_t rawsock;
|
||||||
apr_interval_time_t t;
|
apr_interval_time_t t;
|
||||||
|
struct sockaddr_un *sa;
|
||||||
|
apr_socklen_t addrlen, pathlen;
|
||||||
|
|
||||||
rv = apr_os_sock_get(&rawsock, sock);
|
rv = apr_os_sock_get(&rawsock, sock);
|
||||||
if (rv != APR_SUCCESS) {
|
if (rv != APR_SUCCESS) {
|
||||||
@@ -2568,29 +2571,30 @@ static apr_status_t socket_connect_un(apr_socket_t *sock,
|
|||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
||||||
do {
|
pathlen = strlen(uds_path);
|
||||||
const socklen_t addrlen = APR_OFFSETOF(struct sockaddr_un, sun_path)
|
/* copy the UDS path (including NUL) to the sockaddr_un */
|
||||||
+ strlen(sa->sun_path) + 1;
|
addrlen = APR_OFFSETOF(struct sockaddr_un, sun_path) + pathlen;
|
||||||
rv = connect(rawsock, (struct sockaddr*)sa, addrlen);
|
sa = (struct sockaddr_un *)apr_palloc(p, addrlen + 1);
|
||||||
} while (rv == -1 && errno == EINTR);
|
memcpy(sa->sun_path, uds_path, pathlen + 1);
|
||||||
|
sa->sun_family = AF_UNIX;
|
||||||
|
|
||||||
if ((rv == -1) && (errno == EINPROGRESS || errno == EALREADY)
|
do {
|
||||||
&& (t > 0)) {
|
rv = connect(rawsock, (struct sockaddr*)sa, addrlen);
|
||||||
|
} while (rv == -1 && (rv = errno) == EINTR);
|
||||||
|
|
||||||
|
if (rv && rv != EISCONN) {
|
||||||
|
if ((rv == EINPROGRESS || rv == EALREADY) && (t > 0)) {
|
||||||
#if APR_MAJOR_VERSION < 2
|
#if APR_MAJOR_VERSION < 2
|
||||||
rv = apr_wait_for_io_or_timeout(NULL, sock, 0);
|
rv = apr_wait_for_io_or_timeout(NULL, sock, 0);
|
||||||
#else
|
#else
|
||||||
rv = apr_socket_wait(sock, APR_WAIT_WRITE);
|
rv = apr_socket_wait(sock, APR_WAIT_WRITE);
|
||||||
#endif
|
#endif
|
||||||
|
}
|
||||||
if (rv != APR_SUCCESS) {
|
if (rv != APR_SUCCESS) {
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (rv == -1 && errno != EISCONN) {
|
|
||||||
return errno;
|
|
||||||
}
|
|
||||||
|
|
||||||
return APR_SUCCESS;
|
return APR_SUCCESS;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@@ -2623,8 +2627,6 @@ PROXY_DECLARE(int) ap_proxy_connect_backend(const char *proxy_function,
|
|||||||
#if APR_HAVE_SYS_UN_H
|
#if APR_HAVE_SYS_UN_H
|
||||||
if (conn->uds_path)
|
if (conn->uds_path)
|
||||||
{
|
{
|
||||||
struct sockaddr_un sa;
|
|
||||||
|
|
||||||
rv = apr_socket_create(&newsock, AF_UNIX, SOCK_STREAM, 0,
|
rv = apr_socket_create(&newsock, AF_UNIX, SOCK_STREAM, 0,
|
||||||
conn->scpool);
|
conn->scpool);
|
||||||
if (rv != APR_SUCCESS) {
|
if (rv != APR_SUCCESS) {
|
||||||
@@ -2638,10 +2640,7 @@ PROXY_DECLARE(int) ap_proxy_connect_backend(const char *proxy_function,
|
|||||||
}
|
}
|
||||||
conn->connection = NULL;
|
conn->connection = NULL;
|
||||||
|
|
||||||
sa.sun_family = AF_UNIX;
|
rv = ap_proxy_connect_uds(newsock, conn->uds_path, conn->scpool);
|
||||||
apr_cpystrn(sa.sun_path, conn->uds_path, sizeof(sa.sun_path));
|
|
||||||
|
|
||||||
rv = socket_connect_un(newsock, &sa);
|
|
||||||
if (rv != APR_SUCCESS) {
|
if (rv != APR_SUCCESS) {
|
||||||
apr_socket_close(newsock);
|
apr_socket_close(newsock);
|
||||||
ap_log_error(APLOG_MARK, APLOG_ERR, rv, s, APLOGNO(02454)
|
ap_log_error(APLOG_MARK, APLOG_ERR, rv, s, APLOGNO(02454)
|
||||||
|
Reference in New Issue
Block a user