Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1248)

Unified Diff: net/base/net_util.cc

Issue 7647014: Replace whitespace at beginning and end of file with hyphens, rather than silently discarding. (Closed) Base URL: http://git.chromium.org/git/chromium.git@trunk
Patch Set: Trying again, seem to be merge issues on try server Created 9 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | net/base/net_util_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: net/base/net_util.cc
diff --git a/net/base/net_util.cc b/net/base/net_util.cc
old mode 100644
new mode 100755
index 0be8daa9932f5bdda87cb0dd4de2406a5ce2a771..a288a62bfb3aeb5e3f704a644d8ea577e2251cd3
--- a/net/base/net_util.cc
+++ b/net/base/net_util.cc
@@ -158,6 +158,18 @@ static const int kAllowedFtpPorts[] = {
22, // ssh
};
+std::string::size_type CountTrailingChars(
+ const std::string input,
+ const std::string::value_type trailing_chars[]) {
+ const std::string::size_type last_good_char =
+ input.find_last_not_of(trailing_chars);
+
+ if (last_good_char == std::string::npos)
+ return input.length();
+ else
+ return input.length() - last_good_char - 1;
+}
+
// Similar to Base64Decode. Decodes a Q-encoded string to a sequence
// of bytes. If input is invalid, return false.
bool QPDecode(const std::string& input, std::string* output) {
@@ -1458,15 +1470,32 @@ string16 GetSuggestedFilename(const GURL& url,
filename = url.host();
}
+#if defined(OS_WIN)
+ std::string::size_type trimmed_trailing_character_count =
+ CountTrailingChars(filename, " .");
+#endif
SanitizeGeneratedFileName(filename);
// Sanitization can cause the filename to disappear (e.g.: if the filename
// consisted entirely of spaces and '.'s), in which case we use the default.
- if (filename.empty() && default_name.empty())
- filename = kFinalFallbackName;
+ if (filename.empty()) {
+#if defined(OS_WIN)
+ trimmed_trailing_character_count = 0;
+#endif
+ if (default_name.empty())
+ filename = kFinalFallbackName;
+ }
#if defined(OS_WIN)
string16 path = (filename.empty())? default_name : UTF8ToUTF16(filename);
+ // On Windows we want to preserve or replace all characters including
+ // whitespace to prevent file extension obfuscation on trusted websites
+ // e.g. Gmail might think evil.exe. is safe, so we don't want it to become
+ // evil.exe when we download it
+ std::wstring::size_type path_length_before_trim = path.length();
+ TrimWhitespace(path, TRIM_TRAILING, &path);
+ trimmed_trailing_character_count += path_length_before_trim - path.length();
file_util::ReplaceIllegalCharactersInPath(&path, '-');
+ path.append(trimmed_trailing_character_count, '-');
FilePath result(path);
GenerateSafeFileName(mime_type, &result);
return result.value();
« no previous file with comments | « no previous file | net/base/net_util_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698