From 7e70c26faac2dfae2855fb9148fcc7205c6cfd02 Mon Sep 17 00:00:00 2001 From: Basile Burg Date: Sat, 24 Feb 2018 12:29:23 +0100 Subject: [PATCH] fix #442 - Prevent crash when cursor is in the middle of a UTF sequence --- src/dcd/server/autocomplete/complete.d | 9 ++++++++- tests/tc_middle_of_utf/expected1.txt | 0 tests/tc_middle_of_utf/file.d | 1 + tests/tc_middle_of_utf/run.sh | 5 +++++ 4 files changed, 14 insertions(+), 1 deletion(-) create mode 100644 tests/tc_middle_of_utf/expected1.txt create mode 100644 tests/tc_middle_of_utf/file.d create mode 100755 tests/tc_middle_of_utf/run.sh diff --git a/src/dcd/server/autocomplete/complete.d b/src/dcd/server/autocomplete/complete.d index b3a9b4c..9012ad0 100644 --- a/src/dcd/server/autocomplete/complete.d +++ b/src/dcd/server/autocomplete/complete.d @@ -114,8 +114,15 @@ AutocompleteResponse dotCompletion(T)(T beforeTokens, const(Token)[] tokenArray, // of at the end auto t = beforeTokens[$ - 1]; if (cursorPosition - t.index >= 0 && cursorPosition - t.index <= t.text.length) + { partial = t.text[0 .. cursorPosition - t.index]; - significantTokenType = tok!"identifier"; + // issue 442 - prevent `partial` to start in the middle of a MBC + // since later there's a non-nothrow call to `toUpper` + import std.utf : validate, UTFException; + try validate(partial); + catch (UTFException) partial = ""; + } + significantTokenType = partial.length ? tok!"identifier" : tok!""; beforeTokens = beforeTokens[0 .. $ - 1]; } else if (beforeTokens.length >= 2 && beforeTokens[$ - 1] == tok!".") diff --git a/tests/tc_middle_of_utf/expected1.txt b/tests/tc_middle_of_utf/expected1.txt new file mode 100644 index 0000000..e69de29 diff --git a/tests/tc_middle_of_utf/file.d b/tests/tc_middle_of_utf/file.d new file mode 100644 index 0000000..e520836 --- /dev/null +++ b/tests/tc_middle_of_utf/file.d @@ -0,0 +1 @@ +ß diff --git a/tests/tc_middle_of_utf/run.sh b/tests/tc_middle_of_utf/run.sh new file mode 100755 index 0000000..9e6d161 --- /dev/null +++ b/tests/tc_middle_of_utf/run.sh @@ -0,0 +1,5 @@ +set -e +set -u + +../../bin/dcd-client $1 file.d -c1 > actual1.txt +diff actual1.txt expected1.txt