| Index: base/file_path.cc
|
| diff --git a/base/file_path.cc b/base/file_path.cc
|
| index 094c699587d36bd83cb509d5b82e7c5383667d04..70cfb51823b3ef0e21d3ac8203fb6e53706c695b 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;
|
| }
|
|
|
|
|