summaryrefslogtreecommitdiff
blob: e55f55e663e2d22f3fff30d2b25c98319beb42d3 (plain)
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
--- trunk/src/sandbox/linux/services/broker_process.cc	2013/07/09 21:47:01	210650
+++ trunk/src/sandbox/linux/services/broker_process.cc	2013/07/09 21:47:27	210651
@@ -53,7 +53,7 @@
 // async signal safe if |file_to_open| is NULL.
 // TODO(jln): assert signal safety.
 bool GetFileNameInWhitelist(const std::vector<std::string>& allowed_file_names,
-                            const std::string& requested_filename,
+                            const char* requested_filename,
                             const char** file_to_open) {
   if (file_to_open && *file_to_open) {
     // Make sure that callers never pass a non-empty string. In case callers
@@ -62,13 +62,17 @@
     RAW_LOG(FATAL, "*file_to_open should be NULL");
     return false;
   }
+
+  // Look for |requested_filename| in |allowed_file_names|.
+  // We don't use ::find() because it takes a std::string and
+  // the conversion allocates memory.
   std::vector<std::string>::const_iterator it;
-  it = std::find(allowed_file_names.begin(), allowed_file_names.end(),
-                 requested_filename);
-  if (it < allowed_file_names.end()) {  // requested_filename was found?
-    if (file_to_open)
-      *file_to_open = it->c_str();
-    return true;
+  for (it = allowed_file_names.begin(); it != allowed_file_names.end(); it++) {
+    if (strcmp(requested_filename, it->c_str()) == 0) {
+      if (file_to_open)
+        *file_to_open = it->c_str();
+      return true;
+    }
   }
   return false;
 }
@@ -393,6 +397,7 @@
   const char* file_to_access = NULL;
   const bool safe_to_access_file = GetFileNameIfAllowedToAccess(
       requested_filename.c_str(), mode, &file_to_access);
+
   if (safe_to_access_file) {
     CHECK(file_to_access);
     int access_ret = access(file_to_access, mode);