Index: content/browser/web_contents/web_drag_dest_gtk.cc |
diff --git a/content/browser/web_contents/web_drag_dest_gtk.cc b/content/browser/web_contents/web_drag_dest_gtk.cc |
index d3b9ff89171518ec48c4d0249d9e3a20a02bfa5b..a623510c6051562af55cb3eb840a705ca5118907 100644 |
--- a/content/browser/web_contents/web_drag_dest_gtk.cc |
+++ b/content/browser/web_contents/web_drag_dest_gtk.cc |
@@ -53,6 +53,7 @@ WebDragDestGtk::WebDragDestGtk(WebContents* web_contents, GtkWidget* widget) |
widget_(widget), |
context_(NULL), |
data_requests_(0), |
+ renderer_tainted_(false), |
delegate_(NULL), |
canceled_(false), |
method_factory_(this) { |
@@ -121,7 +122,10 @@ gboolean WebDragDestGtk::OnDragMotion(GtkWidget* sender, |
// text/plain with file URLs when dragging files, we want to handle |
// text/uri-list after text/plain so that the plain text can be cleared if |
// it's a file drag. |
+ // Similarly, renderer taint must occur before anything else so we can |
+ // ignore potentially forged filenames when handling text/uri-list. |
static int supported_targets[] = { |
+ ui::RENDERER_TAINT, |
ui::TEXT_PLAIN, |
ui::TEXT_URI_LIST, |
ui::TEXT_HTML, |
@@ -131,6 +135,7 @@ gboolean WebDragDestGtk::OnDragMotion(GtkWidget* sender, |
ui::CUSTOM_DATA, |
}; |
+ renderer_tainted_ = false; |
// Add the delegate's requested target if applicable. Need to do this here |
// since gtk_drag_get_data will dispatch to our drag-data-received. |
data_requests_ = arraysize(supported_targets) + (delegate() ? 1 : 0); |
@@ -182,7 +187,9 @@ void WebDragDestGtk::OnDragDataReceived( |
if (raw_data && data_length > 0) { |
// If the source can't provide us with valid data for a requested target, |
// raw_data will be NULL. |
- if (target == ui::GetAtomForTarget(ui::TEXT_PLAIN)) { |
+ if (target == ui::GetAtomForTarget(ui::RENDERER_TAINT)) { |
+ renderer_tainted_ = true; |
+ } else if (target == ui::GetAtomForTarget(ui::TEXT_PLAIN)) { |
guchar* text = gtk_selection_data_get_text(data); |
if (text) { |
drop_data_->text = base::NullableString16( |
@@ -201,11 +208,11 @@ void WebDragDestGtk::OnDragDataReceived( |
// TODO(estade): Can the filenames have a non-UTF8 encoding? |
GURL url(*uri_iter); |
base::FilePath file_path; |
- if (url.SchemeIs(kFileScheme) && |
+ if (!renderer_tainted_ && |
+ url.SchemeIs(kFileScheme) && |
net::FileURLToFilePath(url, &file_path)) { |
- drop_data_->filenames.push_back( |
- DropData::FileInfo(base::UTF8ToUTF16(file_path.value()), |
- base::string16())); |
+ drop_data_->filenames.push_back(DropData::FileInfo( |
+ base::UTF8ToUTF16(file_path.value()), base::string16())); |
// This is a hack. Some file managers also populate text/plain with |
// a file URL when dragging files, so we clear it to avoid exposing |
// it to the web content. |