hc
2023-11-06 e3e12f52b214121840b44c91de5b3e5af5d3eb84
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
From 9ebda0dd531a7afd16eac9070a36591056cb7a0e Mon Sep 17 00:00:00 2001
From: Zain Wang <wzz@rock-chips.com>
Date: Fri, 8 Nov 2019 10:07:15 +0800
Subject: [PATCH] UbuntuMtpDatabase: Don't modify element in BOOST_FOREACH
 
Signed-off-by: Zain Wang <wzz@rock-chips.com>
---
 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<MtpObjectHandle, DbEntry>::iterator obj;
+
+        for (std::map<MtpObjectHandle, DbEntry>::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