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