This is an automated email from the ASF dual-hosted git repository.

dataroaring pushed a commit to branch compaction_opt
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/compaction_opt by this push:
     new 27c5fd84a7 [bugfix](runtime_filter) cherry-pick 14362 heap use after 
free (#14363)
27c5fd84a7 is described below

commit 27c5fd84a738cad92aabffc779ae1acafa8bae51
Author: yixiutt <102007456+yixi...@users.noreply.github.com>
AuthorDate: Thu Nov 17 16:17:29 2022 +0800

    [bugfix](runtime_filter) cherry-pick 14362 heap use after free (#14363)
---
 be/src/runtime/fragment_mgr.cpp     | 15 +++++++++++++++
 be/src/runtime/runtime_filter_mgr.h |  4 +++-
 2 files changed, 18 insertions(+), 1 deletion(-)

diff --git a/be/src/runtime/fragment_mgr.cpp b/be/src/runtime/fragment_mgr.cpp
index 58b3b1d95b..cb88fb9481 100644
--- a/be/src/runtime/fragment_mgr.cpp
+++ b/be/src/runtime/fragment_mgr.cpp
@@ -1027,6 +1027,21 @@ Status FragmentMgr::merge_filter(const 
PMergeFilterRequest* request,
     UniqueId queryid = request->query_id();
     std::shared_ptr<RuntimeFilterMergeControllerEntity> filter_controller;
     RETURN_IF_ERROR(_runtimefilter_controller.acquire(queryid, 
&filter_controller));
+    auto fragment_instance_id = filter_controller->instance_id();
+    TUniqueId tfragment_instance_id = fragment_instance_id.to_thrift();
+    std::shared_ptr<FragmentExecState> fragment_state;
+    {
+        std::unique_lock<std::mutex> lock(_lock);
+        auto iter = _fragment_map.find(tfragment_instance_id);
+        if (iter == _fragment_map.end()) {
+            VLOG_CRITICAL << "unknown fragment-id:" << fragment_instance_id;
+            return Status::InvalidArgument("fragment-id: {}", 
fragment_instance_id.to_string());
+        }
+
+        // hold reference to fragment_state, or else runtime_state can be 
destroyed
+        // when filter_controller->merge is still in progress
+        fragment_state = iter->second;
+    }
     RETURN_IF_ERROR(filter_controller->merge(request, attach_data));
     return Status::OK();
 }
diff --git a/be/src/runtime/runtime_filter_mgr.h 
b/be/src/runtime/runtime_filter_mgr.h
index 63960f0182..1228bcbdc4 100644
--- a/be/src/runtime/runtime_filter_mgr.h
+++ b/be/src/runtime/runtime_filter_mgr.h
@@ -122,7 +122,9 @@ public:
     Status merge(const PMergeFilterRequest* request,
                  butil::IOBufAsZeroCopyInputStream* attach_data);
 
-    UniqueId query_id() { return _query_id; }
+    UniqueId query_id() const { return _query_id; }
+
+    UniqueId instance_id() const { return _fragment_instance_id; }
 
     struct RuntimeFilterCntlVal {
         int64_t create_time;


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org
For additional commands, e-mail: commits-h...@doris.apache.org

Reply via email to