1From 9ebda0dd531a7afd16eac9070a36591056cb7a0e Mon Sep 17 00:00:00 2001 2From: Zain Wang <wzz@rock-chips.com> 3Date: Fri, 8 Nov 2019 10:07:15 +0800 4Subject: [PATCH] UbuntuMtpDatabase: Don't modify element in BOOST_FOREACH 5 6Signed-off-by: Zain Wang <wzz@rock-chips.com> 7--- 8 server/UbuntuMtpDatabase.h | 37 +++++++++++++++++++------------------ 9 1 file changed, 19 insertions(+), 18 deletions(-) 10 11diff --git a/server/UbuntuMtpDatabase.h b/server/UbuntuMtpDatabase.h 12index d675809..71561bf 100644 13--- a/server/UbuntuMtpDatabase.h 14+++ b/server/UbuntuMtpDatabase.h 15@@ -317,16 +317,23 @@ private: 16 } 17 else if(ievent->len > 0 && ievent->mask & IN_DELETE) 18 { 19+ MtpObjectHandle exist = -1; /* ROOT */ 20+ 21 VLOG(2) << __PRETTY_FUNCTION__ << ": file deleted: " << p.string(); 22 BOOST_FOREACH(MtpObjectHandle i, db | boost::adaptors::map_keys) { 23 if (db.at(i).path == p.string()) { 24- VLOG(2) << "deleting file at handle " << i; 25- deleteFile(i); 26- if (local_server) 27- local_server->sendObjectRemoved(i); 28+ exist = i; 29 break; 30 } 31 } 32+ 33+ if (exist != -1) { 34+ VLOG(2) << "deleting file at handle " << exist 35+ <<"(path: " << db.at(exist).path << ")\n"; 36+ deleteFile(exist); 37+ if (local_server) 38+ local_server->sendObjectRemoved(exist); 39+ } 40 } 41 } 42 43@@ -375,9 +382,13 @@ public: 44 virtual void removeStorage(MtpStorageID storage) 45 { 46 // remove all database entries corresponding to said storage. 47- BOOST_FOREACH(MtpObjectHandle i, db | boost::adaptors::map_keys) { 48- if (db.at(i).storage_id == storage) 49- db.erase(i); 50+ std::map<MtpObjectHandle, DbEntry>::iterator obj; 51+ 52+ for (std::map<MtpObjectHandle, DbEntry>::iterator i = db.begin(); 53+ i != db.end();) { 54+ obj = i++; 55+ if (obj->second.storage_id == storage) 56+ db.erase(obj); 57 } 58 } 59 60@@ -1044,18 +1055,8 @@ public: 61 62 new_size = db.erase(handle); 63 64- if (orig_size > new_size) { 65- /* Recursively remove children object from the DB as well. 66- * we can safely ignore failures here, since the objects 67- * would not be reachable anyway. 68- */ 69- BOOST_FOREACH(MtpObjectHandle i, db | boost::adaptors::map_keys) { 70- if (db.at(i).parent == handle) 71- db.erase(i); 72- } 73- 74+ if (orig_size > new_size) 75 return MTP_RESPONSE_OK; 76- } 77 else 78 return MTP_RESPONSE_GENERAL_ERROR; 79 } 80-- 812.7.4 82 83