From 698e2106362add2bd3aca6f8ffebe9dd90a50529 Mon Sep 17 00:00:00 2001 From: Omar Emara Date: Wed, 18 Aug 2021 15:06:05 -0700 Subject: [PATCH] [LLDB][GUI] Fix text field incorrect key handling The isprint libc function was used to determine if the key code represents a printable character. The problem is that the specification leaves the behavior undefined if the key is not representable as an unsigned char, which is the case for many ncurses keys. This patch adds and explicit check for this undefined behavior and make it consistent. The llvm::isPrint function didn't work correctly for some reason, most likely because it takes a char instead of an int, which I guess makes it unsuitable for checking ncurses key codes. Reviewed By: clayborg Differential Revision: https://reviews.llvm.org/D108327 --- lldb/source/Core/IOHandlerCursesGUI.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/lldb/source/Core/IOHandlerCursesGUI.cpp b/lldb/source/Core/IOHandlerCursesGUI.cpp index 0ae41de..6e68c1d 100644 --- a/lldb/source/Core/IOHandlerCursesGUI.cpp +++ b/lldb/source/Core/IOHandlerCursesGUI.cpp @@ -1208,7 +1208,13 @@ public: // True if the key represents a char that can be inserted in the field // content, false otherwise. - virtual bool IsAcceptableChar(int key) { return isprint(key); } + virtual bool IsAcceptableChar(int key) { + // The behavior of isprint is undefined when the value is not representable + // as an unsigned char. So explicitly check for non-ascii key codes. + if (key > 127) + return false; + return isprint(key); + } HandleCharResult FieldDelegateHandleChar(int key) override { if (IsAcceptableChar(key)) { -- 2.7.4