HYL_OK3568_LINUX/buildroot/package/mtp/0006-UbuntuMtpDatabase-Don-t-modify-element-in-BOOST_FORE.patch
2025-05-10 21:49:39 +08:00

83 lines
2.9 KiB
Diff

From 9ebda0dd531a7afd16eac9070a36591056cb7a0e Mon Sep 17 00:00:00 2001
From: Zain Wang <wzz@rock-chips.com>
Date: Fri, 8 Nov 2019 10:07:15 +0800
Subject: [PATCH] UbuntuMtpDatabase: Don't modify element in BOOST_FOREACH
Signed-off-by: Zain Wang <wzz@rock-chips.com>
---
server/UbuntuMtpDatabase.h | 37 +++++++++++++++++++------------------
1 file changed, 19 insertions(+), 18 deletions(-)
diff --git a/server/UbuntuMtpDatabase.h b/server/UbuntuMtpDatabase.h
index d675809..71561bf 100644
--- a/server/UbuntuMtpDatabase.h
+++ b/server/UbuntuMtpDatabase.h
@@ -317,16 +317,23 @@ private:
}
else if(ievent->len > 0 && ievent->mask & IN_DELETE)
{
+ MtpObjectHandle exist = -1; /* ROOT */
+
VLOG(2) << __PRETTY_FUNCTION__ << ": file deleted: " << p.string();
BOOST_FOREACH(MtpObjectHandle i, db | boost::adaptors::map_keys) {
if (db.at(i).path == p.string()) {
- VLOG(2) << "deleting file at handle " << i;
- deleteFile(i);
- if (local_server)
- local_server->sendObjectRemoved(i);
+ exist = i;
break;
}
}
+
+ if (exist != -1) {
+ VLOG(2) << "deleting file at handle " << exist
+ <<"(path: " << db.at(exist).path << ")\n";
+ deleteFile(exist);
+ if (local_server)
+ local_server->sendObjectRemoved(exist);
+ }
}
}
@@ -375,9 +382,13 @@ public:
virtual void removeStorage(MtpStorageID storage)
{
// remove all database entries corresponding to said storage.
- BOOST_FOREACH(MtpObjectHandle i, db | boost::adaptors::map_keys) {
- if (db.at(i).storage_id == storage)
- db.erase(i);
+ std::map<MtpObjectHandle, DbEntry>::iterator obj;
+
+ for (std::map<MtpObjectHandle, DbEntry>::iterator i = db.begin();
+ i != db.end();) {
+ obj = i++;
+ if (obj->second.storage_id == storage)
+ db.erase(obj);
}
}
@@ -1044,18 +1055,8 @@ public:
new_size = db.erase(handle);
- if (orig_size > new_size) {
- /* Recursively remove children object from the DB as well.
- * we can safely ignore failures here, since the objects
- * would not be reachable anyway.
- */
- BOOST_FOREACH(MtpObjectHandle i, db | boost::adaptors::map_keys) {
- if (db.at(i).parent == handle)
- db.erase(i);
- }
-
+ if (orig_size > new_size)
return MTP_RESPONSE_OK;
- }
else
return MTP_RESPONSE_GENERAL_ERROR;
}
--
2.7.4