diff options
author | Jim Jagielski <jim@apache.org> | 2014-01-23 15:09:40 +0100 |
---|---|---|
committer | Jim Jagielski <jim@apache.org> | 2014-01-23 15:09:40 +0100 |
commit | e614823e31c25cabfa0a9f558252b255b2a89d8d (patch) | |
tree | 389794c30b9dadca9ee57afcd742a87df8260ba4 /modules/proxy/proxy_util.c | |
parent | a comma leaked onto the page (diff) | |
download | apache2-e614823e31c25cabfa0a9f558252b255b2a89d8d.tar.xz apache2-e614823e31c25cabfa0a9f558252b255b2a89d8d.zip |
Tuck away UDS path in request-rec, since worker isn't
thread-safe. Protect from NULL refs.
git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1560689 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to '')
-rw-r--r-- | modules/proxy/proxy_util.c | 64 |
1 files changed, 35 insertions, 29 deletions
diff --git a/modules/proxy/proxy_util.c b/modules/proxy/proxy_util.c index 1a09ed71ac..73d4c8b82e 100644 --- a/modules/proxy/proxy_util.c +++ b/modules/proxy/proxy_util.c @@ -1958,11 +1958,8 @@ PROXY_DECLARE(int) ap_proxy_pre_request(proxy_worker **worker, *ptr = '\0'; rv = apr_uri_parse(r->pool, ptr2, &urisock); if (rv == APR_SUCCESS) { - char *sockpath = ap_runtime_dir_relative(r->pool, urisock.path);; - if (PROXY_STRNCPY((*worker)->s->uds_path, sockpath) != APR_SUCCESS) { - ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, APLOGNO(02597) - "worker uds path (%s) too long", sockpath); - } + char *sockpath = ap_runtime_dir_relative(r->pool, urisock.path); + apr_table_setn(r->notes, "uds_path", sockpath); r->filename = ptr+1; /* so we get the scheme for the uds */ *url = apr_pstrdup(r->pool, r->filename); ap_log_rerror(APLOG_MARK, APLOG_TRACE2, 0, r, @@ -2130,28 +2127,7 @@ PROXY_DECLARE(int) ap_proxy_acquire_connection(const char *proxy_function, (*conn)->worker = worker; (*conn)->close = 0; (*conn)->inreslist = 0; - - if (*worker->s->uds_path) { - if ((*conn)->uds_path == NULL) { - /* use (*conn)->pool instead of worker->cp->pool to match lifetime */ - (*conn)->uds_path = apr_pstrdup((*conn)->pool, worker->s->uds_path); - } - if ((*conn)->uds_path) { - ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, APLOGNO(02545) - "%s: has determined UDS as %s", - proxy_function, (*conn)->uds_path); - } - else { - /* should never happen */ - ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, APLOGNO(02546) - "%s: cannot determine UDS (%s)", - proxy_function, worker->s->uds_path); - - } - } - else { - (*conn)->uds_path = NULL; - } + (*conn)->uds_path = NULL; return OK; } @@ -2183,6 +2159,7 @@ ap_proxy_determine_connection(apr_pool_t *p, request_rec *r, int server_port; apr_status_t err = APR_SUCCESS; apr_status_t uerr = APR_SUCCESS; + const char *uds_path; /* * Break up the URL to determine the host to connect to @@ -2223,7 +2200,26 @@ ap_proxy_determine_connection(apr_pool_t *p, request_rec *r, * to check host and port on the conn and be careful about * spilling the cached addr from the worker. */ - if (!(*worker->s->uds_path) && + uds_path = (*worker->s->uds_path ? worker->s->uds_path : apr_table_get(r->notes, "uds_path")); + if (uds_path) { + if (conn->uds_path == NULL) { + /* use (*conn)->pool instead of worker->cp->pool to match lifetime */ + conn->uds_path = apr_pstrdup(conn->pool, uds_path); + } + if (conn->uds_path) { + ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, APLOGNO(02545) + "%s: has determined UDS as %s", + uri->scheme, conn->uds_path); + } + else { + /* should never happen */ + ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, APLOGNO(02546) + "%s: cannot determine UDS (%s)", + uri->scheme, uds_path); + + } + } + if (!(uds_path) && (!conn->hostname || !worker->s->is_address_reusable || worker->s->disablereuse)) { if (proxyname) { @@ -2275,7 +2271,17 @@ ap_proxy_determine_connection(apr_pool_t *p, request_rec *r, conn->pool); } } - if (!(*worker->s->uds_path) && worker->s->is_address_reusable && !worker->s->disablereuse) { + else { + /* + * In UDS cases, some structs are NULL. Protect from de-refs + * and provide info for logging at the same time. + */ + apr_sockaddr_t *sa; + apr_sockaddr_info_get(&sa, NULL, APR_UNSPEC, 0, 0, conn->pool); + conn->hostname = "httpd-UDS"; + conn->addr = sa; + } + if (!(uds_path) && worker->s->is_address_reusable && !worker->s->disablereuse) { /* * Looking up the backend address for the worker only makes sense if * we can reuse the address. |