CFI: avoid a bad cast in InsertBeforeMany.
[chromium-blink-merge.git] / dbus / string_util.cc
blob16e483a5feabd3925649dc4f252b4434965b91c1
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "dbus/string_util.h"
7 #include "base/strings/string_util.h"
9 namespace dbus {
11 // This implementation is based upon D-Bus Specification Version 0.19.
12 bool IsValidObjectPath(const std::string& value) {
13 // A valid object path begins with '/'.
14 if (!base::StartsWith(value, "/", base::CompareCase::SENSITIVE))
15 return false;
17 // Elements are pieces delimited by '/'. For instance, "org", "chromium",
18 // "Foo" are elements of "/org/chromium/Foo".
19 int element_length = 0;
20 for (size_t i = 1; i < value.size(); ++i) {
21 const char c = value[i];
22 if (c == '/') {
23 // No element may be the empty string.
24 if (element_length == 0)
25 return false;
26 element_length = 0;
27 } else {
28 // Each element must only contain "[A-Z][a-z][0-9]_".
29 const bool is_valid_character =
30 ('A' <= c && c <= 'Z') || ('a' <= c && c <= 'z') ||
31 ('0' <= c && c <= '9') || c == '_';
32 if (!is_valid_character)
33 return false;
34 element_length++;
38 // A trailing '/' character is not allowed unless the path is the root path.
39 if (value.size() > 1 &&
40 base::EndsWith(value, "/", base::CompareCase::SENSITIVE))
41 return false;
43 return true;
46 } // namespace dbus