aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--common.cpp2
-rw-r--r--fish_tests.cpp16
2 files changed, 17 insertions, 1 deletions
diff --git a/common.cpp b/common.cpp
index 3fce76d6..b7cdedc8 100644
--- a/common.cpp
+++ b/common.cpp
@@ -1197,7 +1197,7 @@ static size_t read_unquoted_escape(const wchar_t *input, wcstring *result, bool
case L'U':
{
chars=8;
- max_val = WCHAR_MAX;
+ max_val = mini(WCHAR_MAX, 0x10FFFF); // Largest Unicode code point - see #1107
break;
}
diff --git a/fish_tests.cpp b/fish_tests.cpp
index 321d109b..b226d307 100644
--- a/fish_tests.cpp
+++ b/fish_tests.cpp
@@ -144,6 +144,22 @@ static void test_unescape_sane()
err(L"In unescaping '%ls', expected '%ls' but got '%ls'\n", tests[i].input, tests[i].expected, output.c_str());
}
}
+
+ // test for overflow
+ if (unescape_string(L"echo \\UFFFFFF", &output, UNESCAPE_DEFAULT))
+ {
+ err(L"Should not have been able to unescape \\UFFFFFF\n");
+ }
+ if (unescape_string(L"echo \\U110000", &output, UNESCAPE_DEFAULT))
+ {
+ err(L"Should not have been able to unescape \\U110000\n");
+ }
+ if (! unescape_string(L"echo \\U10FFFF", &output, UNESCAPE_DEFAULT))
+ {
+ err(L"Should have been able to unescape \\U10FFFF\n");
+ }
+
+
}
/**