From 9ebda0dd531a7afd16eac9070a36591056cb7a0e Mon Sep 17 00:00:00 2001 From: Zain Wang Date: Fri, 8 Nov 2019 10:07:15 +0800 Subject: [PATCH] UbuntuMtpDatabase: Don't modify element in BOOST_FOREACH Signed-off-by: Zain Wang --- 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::iterator obj; + + for (std::map::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