Changes with Apache 2.4.26
- *) core: Disallow multiple Listen on the same IP:port when listener buckets
- are configured (ListenCoresBucketsRatio > 0), consistently with the single
- bucket case (default), thus avoiding the leak of the corresponding socket
- descriptors on graceful restart. [Yann Ylavic]
-
*) mod_cache: Fix a regression in 2.4.25 for the forward proxy case by
computing and using the same entity key according to when the cache
checks, loads and saves the request.
return APR_SUCCESS;
}
-static int find_listeners(ap_listen_rec **from, ap_listen_rec **to,
- const char *addr, apr_port_t port)
+static const char *alloc_listener(process_rec *process, char *addr,
+ apr_port_t port, const char* proto,
+ void *slave)
{
- int found = 0;
-
- while (*from) {
- apr_sockaddr_t *sa = (*from)->bind_addr;
+ ap_listen_rec **walk, *last;
+ apr_status_t status;
+ apr_sockaddr_t *sa;
+ int found_listener = 0;
+ /* see if we've got an old listener for this address:port */
+ for (walk = &old_listeners; *walk;) {
+ sa = (*walk)->bind_addr;
/* Some listeners are not real so they will not have a bind_addr. */
if (sa) {
ap_listen_rec *new;
if (port == oldport &&
((!addr && !sa->hostname) ||
((addr && sa->hostname) && !strcmp(sa->hostname, addr)))) {
- found = 1;
- if (!to) {
- break;
- }
- new = *from;
- *from = new->next;
- new->next = *to;
- *to = new;
+ new = *walk;
+ *walk = new->next;
+ new->next = ap_listeners;
+ ap_listeners = new;
+ found_listener = 1;
continue;
}
}
- from = &(*from)->next;
- }
-
- return found;
-}
-
-static const char *alloc_listener(process_rec *process, const char *addr,
- apr_port_t port, const char* proto,
- void *slave)
-{
- ap_listen_rec *last;
- apr_status_t status;
- apr_sockaddr_t *sa;
-
- /* see if we've got a listener for this address:port, which is an error */
- if (find_listeners(&ap_listeners, NULL, addr, port)) {
- return "Cannot define multiple Listeners on the same IP:port";
+ walk = &(*walk)->next;
}
- /* see if we've got an old listener for this address:port */
- if (find_listeners(&old_listeners, &ap_listeners, addr, port)) {
+ if (found_listener) {
if (ap_listeners->slave != slave) {
return "Cannot define a slave on the same IP:port as a Listener";
}