From 2c831b4c50e7c9efcca9cabfac729cb295c72f56 Mon Sep 17 00:00:00 2001 From: PekingSpades <180665176+PekingSpades@users.noreply.github.com> Date: Wed, 31 Dec 2025 19:47:25 +0800 Subject: [PATCH] Fix null pointer checks and pointer size mismatch in KeyCodeConverter --- CodingKeys/KeyCodeConverter.m | 30 ++++++++++++++++++++++-------- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/CodingKeys/KeyCodeConverter.m b/CodingKeys/KeyCodeConverter.m index 076bc86..c2b32a4 100644 --- a/CodingKeys/KeyCodeConverter.m +++ b/CodingKeys/KeyCodeConverter.m @@ -72,6 +72,7 @@ + (NSDictionary *)fixKeys { static CGKeyCode keyCodeForChar(const char c) { static CFMutableDictionaryRef charToCodeDict = NULL; CGKeyCode code; + const void *codeValue = NULL; UniChar character = c; CFStringRef charStr = NULL; @@ -95,27 +96,40 @@ static CGKeyCode keyCodeForChar(const char c) { } charStr = CFStringCreateWithCharacters(kCFAllocatorDefault, &character, 1); - - if (!CFDictionaryGetValueIfPresent(charToCodeDict, charStr, (const void **)&code)) { + if (charStr == NULL) { + return UINT16_MAX; + } + + if (CFDictionaryGetValueIfPresent(charToCodeDict, charStr, &codeValue)) { + code = (CGKeyCode)(uintptr_t)codeValue; + } else { code = UINT16_MAX; } - + CFRelease(charStr); - + return code; } static CFStringRef createStringForKey(CGKeyCode keyCode) { TISInputSourceRef currentKeyboard = TISCopyCurrentKeyboardInputSource(); + if (currentKeyboard == NULL) { + return NULL; + } + CFDataRef layoutData = TISGetInputSourceProperty(currentKeyboard, kTISPropertyUnicodeKeyLayoutData); - + if (layoutData == NULL) { + CFRelease(currentKeyboard); + return NULL; + } + const UCKeyboardLayout *keyboardLayout = (const UCKeyboardLayout *)CFDataGetBytePtr(layoutData); - + UInt32 keysDown = 0; UniChar chars[4]; UniCharCount realLength; - + UCKeyTranslate(keyboardLayout, keyCode, kUCKeyActionDisplay, @@ -127,7 +141,7 @@ static CFStringRef createStringForKey(CGKeyCode keyCode) { &realLength, chars); CFRelease(currentKeyboard); - + return CFStringCreateWithCharacters(kCFAllocatorDefault, chars, 1); }