From 4d667aefdae2f120ae77548f07c0a18fd83f0a8a Mon Sep 17 00:00:00 2001 From: Neil Hodgson Date: Tue, 15 May 2018 19:20:22 +1000 Subject: Fix crashes for invalid DBCS characters when dragging text, changing case of text, case-insensitive searching, and retrieving text as UTF-8. --- cocoa/ScintillaCocoa.mm | 14 ++++++++++++++ doc/ScintillaHistory.html | 4 ++++ 2 files changed, 18 insertions(+) diff --git a/cocoa/ScintillaCocoa.mm b/cocoa/ScintillaCocoa.mm index 56dc306e8..662280092 100644 --- a/cocoa/ScintillaCocoa.mm +++ b/cocoa/ScintillaCocoa.mm @@ -557,6 +557,10 @@ public: return 1; } else { CFStringRef cfsVal = CFStringFromString(mixed, lenMixed, encoding); + if (!cfsVal) { + folded[0] = '\0'; + return 1; + } NSString *sMapped = [(__bridge NSString *)cfsVal stringByFoldingWithOptions: NSCaseInsensitiveSearch locale: [NSLocale currentLocale]]; @@ -633,6 +637,9 @@ std::string ScintillaCocoa::CaseMapString(const std::string &s, int caseMapping) vs.styles[STYLE_DEFAULT].characterSet); CFStringRef cfsVal = CFStringFromString(s.c_str(), s.length(), encoding); + if (!cfsVal) { + return s; + } NSString *sMapped; switch (caseMapping) { @@ -1248,6 +1255,8 @@ void ScintillaCocoa::DragScroll() { selectedText.characterSet); CFStringRef cfsVal = CFStringFromString(selectedText.Data(), selectedText.Length(), encoding); + if (!cfsVal) + return; if ([type compare: NSPasteboardTypeString] == NSOrderedSame) { [pasteboard setString: (__bridge NSString *)cfsVal forType: NSStringPboardType]; @@ -1517,6 +1526,8 @@ void ScintillaCocoa::SetPasteboardData(NSPasteboard *board, const SelectionText selectedText.characterSet); CFStringRef cfsVal = CFStringFromString(selectedText.Data(), selectedText.Length(), encoding); + if (!cfsVal) + return; NSArray *pbTypes = selectedText.rectangular ? @[NSStringPboardType, ScintillaRecPboardType] : @@ -1587,6 +1598,9 @@ Sci::Position ScintillaCocoa::TargetAsUTF8(char *text) const { vs.styles[STYLE_DEFAULT].characterSet); const std::string s = RangeText(targetStart, targetEnd); CFStringRef cfsVal = CFStringFromString(s.c_str(), s.length(), encoding); + if (!cfsVal) { + return 0; + } const std::string tmputf = EncodedBytesString(cfsVal, kCFStringEncodingUTF8); diff --git a/doc/ScintillaHistory.html b/doc/ScintillaHistory.html index d2a223985..1429ce7ab 100644 --- a/doc/ScintillaHistory.html +++ b/doc/ScintillaHistory.html @@ -545,6 +545,10 @@
  • Indicators are drawn for line end characters when displayed.
  • +
  • + Crashes fixed on macOS for invalid DBCS characters when dragging text, + changing case of text, case-insensitive searching, and retrieving text as UTF-8. +
  • Release 4.0.5 -- cgit v1.2.3