fix(macos): null-check the input source languages before counting them

TISGetInputSourceProperty returns NULL for an input source that has no
kTISPropertyInputSourceLanguages value, but both loops evaluate
CFArrayGetCount(layoutLanguages) before the "&& layoutLanguages" guard.
The guard is therefore dead and CFArrayGetCount dereferences NULL.

Test the pointer first.

Signed-off-by: rNoz <rnoz.commits@gmail.com>
This commit is contained in:
rNoz 2026-07-28 10:43:42 +02:00 committed by Nick Bolton
parent 35d877e128
commit 3006b95a02

View file

@ -77,7 +77,7 @@ std::vector<std::string> AppUtilUnix::getKeyboardLayoutList()
layoutLanguages = (CFArrayRef)TISGetInputSourceProperty(keyboardLayout, kTISPropertyInputSourceLanguages);
}
char temporaryCString[128] = {0};
for (CFIndex index = 0; index < CFArrayGetCount(layoutLanguages) && layoutLanguages; index++) {
for (CFIndex index = 0; layoutLanguages && index < CFArrayGetCount(layoutLanguages); index++) {
auto languageCode = (CFStringRef)CFArrayGetValueAtIndex(layoutLanguages, index);
if (!languageCode || !CFStringGetCString(languageCode, temporaryCString, 128, kCFStringEncodingUTF8)) {
continue;
@ -163,7 +163,7 @@ std::string AppUtilUnix::getCurrentLanguageCode()
layoutLanguages = (CFArrayRef)TISGetInputSourceProperty(source.get(), kTISPropertyInputSourceLanguages);
}
char temporaryCString[128] = {0};
for (CFIndex index = 0; index < CFArrayGetCount(layoutLanguages) && layoutLanguages; index++) {
for (CFIndex index = 0; layoutLanguages && index < CFArrayGetCount(layoutLanguages); index++) {
auto languageCode = (CFStringRef)CFArrayGetValueAtIndex(layoutLanguages, index);
if (!languageCode || !CFStringGetCString(languageCode, temporaryCString, 128, kCFStringEncodingUTF8)) {
continue;