summaryrefslogtreecommitdiff
path: root/indra/llwindow/llopenglview-objc.mm
diff options
context:
space:
mode:
authorAndrey Kleshchev <andreykproductengine@lindenlab.com>2024-01-11 00:19:56 +0200
committerAndrey Kleshchev <117672381+akleshchev@users.noreply.github.com>2024-01-11 17:18:12 +0200
commit0d8bd79c79c1e917bc49669426bdfa89dc48ff04 (patch)
treef755f6c915d3b7310422afbca4cdf7aec770cc1d /indra/llwindow/llopenglview-objc.mm
parent7d4de08fa9c43f6e21267cb861cbac8a9280e5ec (diff)
SL-20750 MacOS Crash processing attributed string
Diffstat (limited to 'indra/llwindow/llopenglview-objc.mm')
-rw-r--r--indra/llwindow/llopenglview-objc.mm68
1 files changed, 42 insertions, 26 deletions
diff --git a/indra/llwindow/llopenglview-objc.mm b/indra/llwindow/llopenglview-objc.mm
index 37f4568b98..0bd4e506a2 100644
--- a/indra/llwindow/llopenglview-objc.mm
+++ b/indra/llwindow/llopenglview-objc.mm
@@ -736,33 +736,49 @@ attributedStringInfo getSegments(NSAttributedString *str)
// SL-19801 Special workaround for system emoji picker
if ([aString length] == 2)
{
- uint32_t b0 = [aString characterAtIndex:0];
- uint32_t b1 = [aString characterAtIndex:1];
- if (((b0 & 0xF000) == 0xD000) && ((b1 & 0xF000) == 0xD000))
- {
- uint32_t b = 0x10000 | ((b0 & 0x3F) << 10) | (b1 & 0x3FF);
- callUnicodeCallback(b, 0);
- return;
- }
- }
-
- if (!mHasMarkedText)
- {
- for (NSInteger i = 0; i < [aString length]; i++)
- {
- callUnicodeCallback([aString characterAtIndex:i], mModifiers);
- }
- } else {
- resetPreedit();
- // We may never get this point since unmarkText may be called before insertText ever gets called once we submit our text.
- // But just in case...
-
- for (NSInteger i = 0; i < [aString length]; i++)
- {
- handleUnicodeCharacter([aString characterAtIndex:i]);
- }
- mHasMarkedText = FALSE;
+ @try
+ {
+ uint32_t b0 = [aString characterAtIndex:0];
+ uint32_t b1 = [aString characterAtIndex:1];
+ if (((b0 & 0xF000) == 0xD000) && ((b1 & 0xF000) == 0xD000))
+ {
+ uint32_t b = 0x10000 | ((b0 & 0x3F) << 10) | (b1 & 0x3FF);
+ callUnicodeCallback(b, 0);
+ return;
+ }
+ }
+ @catch(NSException * e)
+ {
+ // One of the characters is an attribute string?
+ NSLog(@"Encountered an unsupported attributed character. Exception: %@ String: %@", e.name, aString);
+ return;
+ }
}
+
+ @try
+ {
+ if (!mHasMarkedText)
+ {
+ for (NSInteger i = 0; i < [aString length]; i++)
+ {
+ callUnicodeCallback([aString characterAtIndex:i], mModifiers);
+ }
+ } else {
+ resetPreedit();
+ // We may never get this point since unmarkText may be called before insertText ever gets called once we submit our text.
+ // But just in case...
+
+ for (NSInteger i = 0; i < [aString length]; i++)
+ {
+ handleUnicodeCharacter([aString characterAtIndex:i]);
+ }
+ mHasMarkedText = FALSE;
+ }
+ }
+ @catch(NSException * e)
+ {
+ NSLog(@"Failed to process an attributed string. Exception: %@ String: %@", e.name, aString);
+ }
}
- (void) insertNewline:(id)sender