From 43fa5b848147d846761fecbea0317331510dd287 Mon Sep 17 00:00:00 2001 From: "hashimoto@chromium.org" Date: Tue, 5 Jun 2012 04:15:50 +0000 Subject: 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 --- dbus/string_util.cc | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 dbus/string_util.cc (limited to 'dbus/string_util.cc') 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 -- cgit v1.1