From 0255ef3e9601abacb7db7b9a41fae228ff35e90c Mon Sep 17 00:00:00 2001 From: LiuYangkuan Date: Mon, 11 Jun 2018 11:51:16 -0400 Subject: [PATCH] client: fix bug #24491 _ll_drop_pins may access invalid iterator Fixes: https://tracker.ceph.com/issues/24491 Signed-off-by: Liu Yangkuan (cherry picked from commit 97188fef8596f098aa43aa745a217b40a6c29ea4) Conflicts: src/client/Client.cc: Resolved in _ll_drop_pins for ldout --- src/client/Client.cc | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/client/Client.cc b/src/client/Client.cc index 41eff1b4b2a2..70b0f16f0fd7 100644 --- a/src/client/Client.cc +++ b/src/client/Client.cc @@ -10431,6 +10431,7 @@ int Client::_ll_put(Inode *in, int num) void Client::_ll_drop_pins() { ldout(cct, 10) << "_ll_drop_pins" << dendl; + std::set to_be_put; //this set will be deconstructed item by item when exit ceph::unordered_map::iterator next; for (ceph::unordered_map::iterator it = inode_map.begin(); it != inode_map.end(); @@ -10438,8 +10439,10 @@ void Client::_ll_drop_pins() Inode *in = it->second; next = it; ++next; - if (in->ll_ref) + if (in->ll_ref){ + to_be_put.insert(in); _ll_put(in, in->ll_ref); + } } } -- 2.47.3