diff options
author | hashimoto@chromium.org <hashimoto@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-06-05 04:15:50 +0000 |
---|---|---|
committer | hashimoto@chromium.org <hashimoto@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-06-05 04:15:50 +0000 |
commit | 43fa5b848147d846761fecbea0317331510dd287 (patch) | |
tree | eae5721b0ae1bd1fb4be7d93e66266a0b2b2beca /dbus/string_util.cc | |
parent | 44437a2af771d8302a128a38aa25953ce7eaa51f (diff) | |
download | chromium_src-43fa5b848147d846761fecbea0317331510dd287.zip chromium_src-43fa5b848147d846761fecbea0317331510dd287.tar.gz chromium_src-43fa5b848147d846761fecbea0317331510dd287.tar.bz2 |
Explicitly CHECK arguments in dbus::MessageWriter::AppendString/ObjectPath
Add dbus::IsStringValidObjectPath() and dbus::ObjectPath::IsValid()
BUG=129335
TEST=dbus_unittests
Review URL: https://chromiumcodereview.appspot.com/10502011
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@140489 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'dbus/string_util.cc')
-rw-r--r-- | dbus/string_util.cc | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/dbus/string_util.cc b/dbus/string_util.cc new file mode 100644 index 0000000..4d4c9da --- /dev/null +++ b/dbus/string_util.cc @@ -0,0 +1,48 @@ +// Copyright (c) 2012 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "dbus/string_util.h" + +#include "base/string_util.h" + +namespace dbus { + +bool IsValidObjectPath(const std::string& value) { + // This implementation is based upon D-Bus Specification Version 0.19. + + const bool kCaseSensitive = true; + + // A valid object path begins with '/'. + if (!StartsWithASCII(value, "/", kCaseSensitive)) + return false; + + // Elements are pieces delimited by '/'. For instance, "org", "chromium", + // "Foo" are elements of "/org/chromium/Foo". + int element_length = 0; + for (size_t i = 1; i < value.size(); ++i) { + const char c = value[i]; + if (c == '/') { + // No element may be the empty string. + if (element_length == 0) + return false; + element_length = 0; + } else { + // Each element must only contain "[A-Z][a-z][0-9]_". + const bool is_valid_character = + ('A' <= c && c <= 'Z') || ('a' <= c && c <= 'z') || + ('0' <= c && c <= '9') || c == '_'; + if (!is_valid_character) + return false; + element_length++; + } + } + + // A trailing '/' character is not allowed unless the path is the root path. + if (value.size() > 1 && EndsWith(value, "/", kCaseSensitive)) + return false; + + return true; +} + +} // namespace dbus |