From d179cbcdc2b1a97f0f3147bc502af22009a882ba Mon Sep 17 00:00:00 2001 From: Mark Salyzyn Date: Fri, 20 Nov 2020 09:30:29 -0800 Subject: [PATCH] storaged: protect global proto_loaded proto_loaded is not thread safe, so we must protect it with a mutex proto_lock. Signed-off-by: hanhongli@360.cn Signed-off-by: gongguang@360.cn Signed-off-by: Mark Salyzyn Bug: 170732441 Test: compile Change-Id: I93416598b6047e890c66b922b360093aa42db8c5 --- storaged/include/storaged.h | 1 + storaged/storaged.cpp | 6 ++++++ 2 files changed, 7 insertions(+) diff --git a/storaged/include/storaged.h b/storaged/include/storaged.h index 6f9204879..79b5d41ac 100644 --- a/storaged/include/storaged.h +++ b/storaged/include/storaged.h @@ -86,6 +86,7 @@ class storaged_t : public android::hardware::health::V2_0::IHealthInfoCallback, sp health; unique_ptr storage_info; static const uint32_t current_version; + Mutex proto_lock; unordered_map proto_loaded; void load_proto(userid_t user_id); char* prepare_proto(userid_t user_id, StoragedProto* proto); diff --git a/storaged/storaged.cpp b/storaged/storaged.cpp index 573b8c563..b7aa89ff7 100644 --- a/storaged/storaged.cpp +++ b/storaged/storaged.cpp @@ -162,6 +162,8 @@ storaged_t::storaged_t(void) { } void storaged_t::add_user_ce(userid_t user_id) { + Mutex::Autolock _l(proto_lock); + if (!proto_loaded[user_id]) { load_proto(user_id); proto_loaded[user_id] = true; @@ -169,6 +171,8 @@ void storaged_t::add_user_ce(userid_t user_id) { } void storaged_t::remove_user_ce(userid_t user_id) { + Mutex::Autolock _l(proto_lock); + proto_loaded[user_id] = false; mUidm.clear_user_history(user_id); RemoveFileIfExists(proto_path(user_id), nullptr); @@ -298,6 +302,8 @@ void storaged_t::flush_proto(userid_t user_id, StoragedProto* proto) { } void storaged_t::flush_protos(unordered_map* protos) { + Mutex::Autolock _l(proto_lock); + for (auto& it : *protos) { /* * Don't flush proto if we haven't attempted to load it from file.