libprocessgroup: Prevent aggregate profiles from referencing stale ones
Currently when vendor overrides a profile the profile object is being replaced with a new one. However the old profile might have been referenced by an aggregate profile and with such profile replacement the aggregate profile is left referencing a stale object. Fix this by replacing the content of the old profile with the content from the new one instead of replacing the object itself. Bug: 148311066 Test: override profiles referenced in aggregate profile and verify Test: correct replacement Change-Id: Iabddbf3580455e5263fedad6665cf52fb323e50a Signed-off-by: Suren Baghdasaryan <surenb@google.com>
This commit is contained in:
parent
347d6406f0
commit
8438595f21
|
@ -288,6 +288,11 @@ bool ApplyProfileAction::ExecuteForTask(int tid) const {
|
|||
return true;
|
||||
}
|
||||
|
||||
void TaskProfile::MoveTo(TaskProfile* profile) {
|
||||
profile->elements_ = std::move(elements_);
|
||||
profile->res_cached_ = res_cached_;
|
||||
}
|
||||
|
||||
bool TaskProfile::ExecuteForProcess(uid_t uid, pid_t pid) const {
|
||||
for (const auto& element : elements_) {
|
||||
if (!element->ExecuteForProcess(uid, pid)) {
|
||||
|
@ -458,7 +463,15 @@ bool TaskProfiles::Load(const CgroupMap& cg_map, const std::string& file_name) {
|
|||
LOG(WARNING) << "Unknown profile action: " << action_name;
|
||||
}
|
||||
}
|
||||
profiles_[profile_name] = profile;
|
||||
auto iter = profiles_.find(profile_name);
|
||||
if (iter == profiles_.end()) {
|
||||
profiles_[profile_name] = profile;
|
||||
} else {
|
||||
// Move the content rather that replace the profile because old profile might be
|
||||
// referenced from an aggregate profile if vendor overrides task profiles
|
||||
profile->MoveTo(iter->second.get());
|
||||
profile.reset();
|
||||
}
|
||||
}
|
||||
|
||||
const Json::Value& aggregateprofiles_val = root["AggregateProfiles"];
|
||||
|
|
|
@ -143,6 +143,7 @@ class TaskProfile {
|
|||
TaskProfile() : res_cached_(false) {}
|
||||
|
||||
void Add(std::unique_ptr<ProfileAction> e) { elements_.push_back(std::move(e)); }
|
||||
void MoveTo(TaskProfile* profile);
|
||||
|
||||
bool ExecuteForProcess(uid_t uid, pid_t pid) const;
|
||||
bool ExecuteForTask(int tid) const;
|
||||
|
|
Loading…
Reference in New Issue