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