Commit 56f6bc94 authored by Chris Hamilton's avatar Chris Hamilton Committed by Commit Bot

Fix trailing garbage when pasting from clipboard.

A previous CL used GlobalSize as the explicit size of clipboard data, removing
trailing nulls. This was a fix to open-ended copying logic that would
occasionally read past the end of the buffer for clipboard entries not
containing terminating nulls. It turns out that some clipboard entries
contain much less data than the entire buffer, and don't pad out to the
end with terminating nulls (only seen on Win7 when copying from command line or
other console apps). The fix is to copy until first null or end of the
buffer.

BUG=821609

Change-Id: Id0e733ccf10b0f7d2f7ec401a584d7f14d4fd063
Reviewed-on: https://chromium-review.googlesource.com/964722Reviewed-by: default avatarDaniel Cheng <dcheng@chromium.org>
Commit-Queue: Chris Hamilton <chrisha@chromium.org>
Cr-Commit-Position: refs/heads/master@{#543487}
parent d55c4370
...@@ -208,12 +208,13 @@ void FreeData(unsigned int format, HANDLE data) { ...@@ -208,12 +208,13 @@ void FreeData(unsigned int format, HANDLE data) {
} }
template <typename StringType> template <typename StringType>
void TrimTrailingNulls(StringType* result) { void TrimAfterNull(StringType* result) {
// Text copied to the clipboard may explicitly contain trailing null // Text copied to the clipboard may explicitly contain null characters that
// characters that should be ignored, depending on the application that does // should be ignored, depending on the application that does the copying.
// the copying. constexpr typename StringType::value_type kNull = 0;
while (!result->empty() && result->back() == 0) size_t pos = result->find_first_of(kNull);
result->pop_back(); if (pos != StringType::npos)
result->resize(pos);
} }
} // namespace } // namespace
...@@ -505,7 +506,7 @@ void ClipboardWin::ReadText(ClipboardType type, base::string16* result) const { ...@@ -505,7 +506,7 @@ void ClipboardWin::ReadText(ClipboardType type, base::string16* result) const {
result->assign(static_cast<const base::char16*>(::GlobalLock(data)), result->assign(static_cast<const base::char16*>(::GlobalLock(data)),
::GlobalSize(data) / sizeof(base::char16)); ::GlobalSize(data) / sizeof(base::char16));
::GlobalUnlock(data); ::GlobalUnlock(data);
TrimTrailingNulls(result); TrimAfterNull(result);
} }
void ClipboardWin::ReadAsciiText(ClipboardType type, void ClipboardWin::ReadAsciiText(ClipboardType type,
...@@ -530,7 +531,7 @@ void ClipboardWin::ReadAsciiText(ClipboardType type, ...@@ -530,7 +531,7 @@ void ClipboardWin::ReadAsciiText(ClipboardType type,
result->assign(static_cast<const char*>(::GlobalLock(data)), result->assign(static_cast<const char*>(::GlobalLock(data)),
::GlobalSize(data)); ::GlobalSize(data));
::GlobalUnlock(data); ::GlobalUnlock(data);
TrimTrailingNulls(result); TrimAfterNull(result);
} }
void ClipboardWin::ReadHTML(ClipboardType type, void ClipboardWin::ReadHTML(ClipboardType type,
...@@ -560,7 +561,7 @@ void ClipboardWin::ReadHTML(ClipboardType type, ...@@ -560,7 +561,7 @@ void ClipboardWin::ReadHTML(ClipboardType type,
std::string cf_html(static_cast<const char*>(::GlobalLock(data)), std::string cf_html(static_cast<const char*>(::GlobalLock(data)),
::GlobalSize(data)); ::GlobalSize(data));
::GlobalUnlock(data); ::GlobalUnlock(data);
TrimTrailingNulls(&cf_html); TrimAfterNull(&cf_html);
size_t html_start = std::string::npos; size_t html_start = std::string::npos;
size_t start_index = std::string::npos; size_t start_index = std::string::npos;
...@@ -593,7 +594,7 @@ void ClipboardWin::ReadRTF(ClipboardType type, std::string* result) const { ...@@ -593,7 +594,7 @@ void ClipboardWin::ReadRTF(ClipboardType type, std::string* result) const {
DCHECK_EQ(type, CLIPBOARD_TYPE_COPY_PASTE); DCHECK_EQ(type, CLIPBOARD_TYPE_COPY_PASTE);
ReadData(GetRtfFormatType(), result); ReadData(GetRtfFormatType(), result);
TrimTrailingNulls(result); TrimAfterNull(result);
} }
SkBitmap ClipboardWin::ReadImage(ClipboardType type) const { SkBitmap ClipboardWin::ReadImage(ClipboardType type) const {
...@@ -716,7 +717,7 @@ void ClipboardWin::ReadBookmark(base::string16* title, std::string* url) const { ...@@ -716,7 +717,7 @@ void ClipboardWin::ReadBookmark(base::string16* title, std::string* url) const {
base::string16 bookmark(static_cast<const base::char16*>(::GlobalLock(data)), base::string16 bookmark(static_cast<const base::char16*>(::GlobalLock(data)),
::GlobalSize(data) / sizeof(base::char16)); ::GlobalSize(data) / sizeof(base::char16));
::GlobalUnlock(data); ::GlobalUnlock(data);
TrimTrailingNulls(&bookmark); TrimAfterNull(&bookmark);
ParseBookmarkClipboardFormat(bookmark, title, url); ParseBookmarkClipboardFormat(bookmark, title, url);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment