]> git.ipfire.org Git - thirdparty/apache/httpd.git/commitdiff
mpm_event: Follow up to r1821558.
authorYann Ylavic <ylavic@apache.org>
Fri, 19 Jan 2018 08:26:00 +0000 (08:26 +0000)
committerYann Ylavic <ylavic@apache.org>
Fri, 19 Jan 2018 08:26:00 +0000 (08:26 +0000)
Don't crash (in listener) if we can't create the ptrans allocator.

git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1821595 13f79535-47bb-0310-9956-ffa450edef68

server/mpm/event/event.c

index 8c4d1e058ff87e38e078ce788c0b28fd57b8d8e1..b272433aa1b46a1322da7a283a3a161992d224d4 100644 (file)
@@ -2053,23 +2053,31 @@ static void * APR_THREAD_FUNC listener_thread(apr_thread_t * thd, void *dummy)
 
                     if (ptrans == NULL) {
                         /* create a new transaction pool for each accepted socket */
-                        apr_allocator_t *allocator;
-
-                        apr_allocator_create(&allocator);
-                        apr_allocator_max_free_set(allocator, ap_max_mem_free);
-                        apr_pool_create_ex(&ptrans, pconf, NULL, allocator);
-                        if (ptrans == NULL) {
+                        apr_allocator_t *allocator = NULL;
+
+                        rc = apr_allocator_create(&allocator);
+                        if (rc == APR_SUCCESS) {
+                            apr_allocator_max_free_set(allocator,
+                                                       ap_max_mem_free);
+                            rc = apr_pool_create_ex(&ptrans, pconf, NULL,
+                                                    allocator);
+                            if (rc == APR_SUCCESS) {
+                                apr_pool_tag(ptrans, "transaction");
+                                apr_allocator_owner_set(allocator, ptrans);
+                            }
+                        }
+                        if (rc != APR_SUCCESS) {
                             ap_log_error(APLOG_MARK, APLOG_CRIT, rc,
                                          ap_server_conf, APLOGNO(03097)
                                          "Failed to create transaction pool");
-                            apr_allocator_destroy(allocator);
+                            if (allocator) {
+                                apr_allocator_destroy(allocator);
+                            }
                             resource_shortage = 1;
                             signal_threads(ST_GRACEFUL);
                             continue;
                         }
-                        apr_allocator_owner_set(allocator, ptrans);
                     }
-                    apr_pool_tag(ptrans, "transaction");
 
                     get_worker(&have_idle_worker, 1, &workers_were_busy);
                     rc = lr->accept_func(&csd, lr, ptrans);