]> git.ipfire.org Git - thirdparty/apache/httpd.git/commitdiff
* modules/core/mod_watchdog.c (wd_worker): Fix crashes snuck into
authorJoe Orton <jorton@apache.org>
Thu, 16 Apr 2020 17:55:48 +0000 (17:55 +0000)
committerJoe Orton <jorton@apache.org>
Thu, 16 Apr 2020 17:55:48 +0000 (17:55 +0000)
  r1876599 where a destroyed pool was reused.  Rename the "ctx"
  variable to reflect its purpose.  Also tweak the pool tags.

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

modules/core/mod_watchdog.c

index d833939cb0ac7ca79fd4bc338e99b37ade4496af..1723eeec5106df38bc2bf02fac8904070dbf37b7 100644 (file)
@@ -112,7 +112,7 @@ static void* APR_THREAD_FUNC wd_worker(apr_thread_t *thread, void *data)
     int probed = 0;
     int inited = 0;
     int mpmq_s = 0;
-    apr_pool_t *ctx = NULL;
+    apr_pool_t *temp_pool = NULL;
 
     w->pool = apr_thread_pool_get(thread);
     w->is_running = 1;
@@ -166,15 +166,16 @@ static void* APR_THREAD_FUNC wd_worker(apr_thread_t *thread, void *data)
                      w->singleton ? "Singleton " : "", w->name);
         apr_time_clock_hires(w->pool);
         if (wl) {
-            apr_pool_create(&ctx, w->pool);
-            apr_pool_tag(ctx, "wd_running");
+            apr_pool_create(&temp_pool, w->pool);
+            apr_pool_tag(temp_pool, "wd_running-singleton");
             while (wl && w->is_running) {
                 /* Execute watchdog callback */
                 wl->status = (*wl->callback_fn)(AP_WATCHDOG_STATE_STARTING,
-                                                (void *)wl->data, ctx);
+                                                (void *)wl->data, temp_pool);
                 wl = wl->next;
             }
-            apr_pool_destroy(ctx);
+            apr_pool_destroy(temp_pool);
+            temp_pool = NULL;
         }
         else {
             ap_run_watchdog_init(wd_server_conf->s, w->name, w->pool);
@@ -202,14 +203,14 @@ static void* APR_THREAD_FUNC wd_worker(apr_thread_t *thread, void *data)
             if (wl->status == APR_SUCCESS) {
                 wl->step += (apr_time_now() - curr);
                 if (wl->step >= wl->interval) {
-                    if (!ctx) {
-                        apr_pool_create(&ctx, w->pool);
-                        apr_pool_tag(ctx, "wd_running");
+                    if (!temp_pool) {
+                        apr_pool_create(&temp_pool, w->pool);
+                        apr_pool_tag(temp_pool, "wd_running-callback");
                     }
                     wl->step = 0;
                     /* Execute watchdog callback */
                     wl->status = (*wl->callback_fn)(AP_WATCHDOG_STATE_RUNNING,
-                                                    (void *)wl->data, ctx);
+                                                    (void *)wl->data, temp_pool);
                     if (ap_mpm_query(AP_MPMQ_MPM_STATE, &mpmq_s) != APR_SUCCESS) {
                         w->is_running = 0;
                     }
@@ -226,17 +227,19 @@ static void* APR_THREAD_FUNC wd_worker(apr_thread_t *thread, void *data)
              */
             w->step += (apr_time_now() - curr);
             if (w->step >= wd_interval) {
-                if (!ctx) {
-                    apr_pool_create(&ctx, w->pool);
-                    apr_pool_tag(ctx, "wd_running");
+                if (!temp_pool) {
+                    apr_pool_create(&temp_pool, w->pool);
+                    apr_pool_tag(temp_pool, "wd_running");
                 }
                 w->step = 0;
                 /* Run watchdog step hook */
-                ap_run_watchdog_step(wd_server_conf->s, w->name, ctx);
+                ap_run_watchdog_step(wd_server_conf->s, w->name, temp_pool);
             }
         }
-        if (ctx)
-            apr_pool_destroy(ctx);
+        if (temp_pool) {
+            apr_pool_destroy(temp_pool);
+            temp_pool = NULL;
+        }                
         if (!w->is_running) {
             break;
         }