diff --git a/browser/download/download_target_determiner.cc b/browser/download/download_target_determiner.cc index 97fa792681feef05aa9efe283b6504484ec6f215..036a23f57372257a3967f9dbb8cd158e9f971a1d 100644 --- a/browser/download/download_target_determiner.cc +++ b/browser/download/download_target_determiner.cc @@ -551,6 +551,11 @@ DownloadTargetDeterminer::DoRequestConfirmation() { // file name first. std::wstring sanitized_name = ui::RemoveEnvVarFromFileName( virtual_path_.BaseName().value(), L"%"); + // remove leading "." to avoid resorting to potential extension + // bug: 41486690 + while (!sanitized_name.empty() && sanitized_name.back() == L'.') { + sanitized_name.pop_back(); + } if (sanitized_name.empty()) { sanitized_name = base::UTF8ToWide( l10n_util::GetStringUTF8(IDS_DEFAULT_DOWNLOAD_FILENAME)); diff --git a/browser/download/download_target_determiner_unittest.cc b/browser/download/download_target_determiner_unittest.cc index 3e2ebd5ff75dad0b46d465d5ddb02abc4b89069e..9c29f6e393064f6ac0647f1bba1dae314e17df98 100644 --- a/browser/download/download_target_determiner_unittest.cc +++ b/browser/download/download_target_determiner_unittest.cc @@ -2481,7 +2481,16 @@ TEST_F(DownloadTargetDeterminerTest, TestSanitizeEnvVariable) { DownloadItem::TARGET_DISPOSITION_PROMPT, EXPECT_CRDOWNLOAD}, - {// 2: File name is an env var. + {// 2: File name falling back to dangerous extensions after removing env var. + SAVE_AS, download::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, + DownloadFileType::NOT_DANGEROUS, "http://example.com/foo2.lnk.%%", + "application/octet-stream", FILE_PATH_LITERAL(""), + + FILE_PATH_LITERAL("foo2.download"), + DownloadItem::TARGET_DISPOSITION_PROMPT, + + EXPECT_CRDOWNLOAD}, + {// 3: File name is an env var. SAVE_AS, download::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, DownloadFileType::NOT_DANGEROUS, "http://example.com/%foo.txt%", "text/plain", FILE_PATH_LITERAL(""),