diff options
author | aedla@chromium.org <aedla@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-01-28 13:47:55 +0000 |
---|---|---|
committer | aedla@chromium.org <aedla@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-01-28 13:47:55 +0000 |
commit | aeae59f4a1f15e80b6a726734ca6190cf111eeee (patch) | |
tree | 1eddadd678a01096f582865fe9b003fdcbab5727 /base/file_path.cc | |
parent | de6912ddcad4b29b13a5592d331ebe29cd728924 (diff) | |
download | chromium_src-aeae59f4a1f15e80b6a726734ca6190cf111eeee.zip chromium_src-aeae59f4a1f15e80b6a726734ca6190cf111eeee.tar.gz chromium_src-aeae59f4a1f15e80b6a726734ca6190cf111eeee.tar.bz2 |
Don't allow '\0' characters in FilePath.
BUG=169777
Review URL: https://chromiumcodereview.appspot.com/11642041
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@179141 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'base/file_path.cc')
-rw-r--r-- | base/file_path.cc | 28 |
1 files changed, 23 insertions, 5 deletions
diff --git a/base/file_path.cc b/base/file_path.cc index 094c699..70cfb51 100644 --- a/base/file_path.cc +++ b/base/file_path.cc @@ -47,6 +47,8 @@ namespace { const char* kCommonDoubleExtensionSuffixes[] = { "gz", "z", "bz2" }; const char* kCommonDoubleExtensions[] = { "user.js" }; +const FilePath::CharType kStringTerminator = FILE_PATH_LITERAL('\0'); + // If this FilePath contains a drive letter specification, returns the // position of the last character of the drive letter specification, // otherwise returns npos. This can only be true on Windows, when a pathname @@ -182,6 +184,9 @@ FilePath::FilePath(const FilePath& that) : path_(that.path_) { } FilePath::FilePath(const StringType& path) : path_(path) { + StringType::size_type nul_pos = path_.find(kStringTerminator); + if (nul_pos != StringType::npos) + path_.erase(nul_pos, StringType::npos); } FilePath::~FilePath() { @@ -454,7 +459,17 @@ bool FilePath::MatchesExtension(const StringType& extension) const { } FilePath FilePath::Append(const StringType& component) const { - DCHECK(!IsPathAbsolute(component)); + const StringType* appended = &component; + StringType without_nuls; + + StringType::size_type nul_pos = component.find(kStringTerminator); + if (nul_pos != StringType::npos) { + without_nuls = component.substr(0, nul_pos); + appended = &without_nuls; + } + + DCHECK(!IsPathAbsolute(*appended)); + if (path_.compare(kCurrentDirectory) == 0) { // Append normally doesn't do any normalization, but as a special case, // when appending to kCurrentDirectory, just return a new path for the @@ -463,7 +478,7 @@ FilePath FilePath::Append(const StringType& component) const { // it's likely in practice to wind up with FilePath objects containing // only kCurrentDirectory when calling DirName on a single relative path // component. - return FilePath(component); + return FilePath(*appended); } FilePath new_path(path_); @@ -472,7 +487,7 @@ FilePath FilePath::Append(const StringType& component) const { // Don't append a separator if the path is empty (indicating the current // directory) or if the path component is empty (indicating nothing to // append). - if (component.length() > 0 && new_path.path_.length() > 0) { + if (appended->length() > 0 && new_path.path_.length() > 0) { // Don't append a separator if the path still ends with a trailing // separator after stripping (indicating the root directory). if (!IsSeparator(new_path.path_[new_path.path_.length() - 1])) { @@ -483,7 +498,7 @@ FilePath FilePath::Append(const StringType& component) const { } } - new_path.path_.append(component); + new_path.path_.append(*appended); return new_path; } @@ -589,7 +604,7 @@ FilePath FilePath::FromUTF8Unsafe(const std::string& utf8) { } #endif -void FilePath::WriteToPickle(Pickle* pickle) { +void FilePath::WriteToPickle(Pickle* pickle) const { #if defined(OS_WIN) pickle->WriteString16(path_); #else @@ -606,6 +621,9 @@ bool FilePath::ReadFromPickle(PickleIterator* iter) { return false; #endif + if (path_.find(kStringTerminator) != StringType::npos) + return false; + return true; } |