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