fix: using a proper std::string to store KeyInfo buffers

This commit is contained in:
Luiz Sardinha
2026-02-12 18:40:44 +01:00
committed by Chris Rizzitello
parent 3c6aa9999b
commit 99da66dbf7
5 changed files with 9 additions and 31 deletions

View File

@ -30,8 +30,6 @@ IKeyState::KeyInfo *IKeyState::KeyInfo::alloc(KeyID id, KeyModifierMask mask, Ke
info->m_mask = mask;
info->m_button = button;
info->m_count = count;
info->m_screens = nullptr;
info->m_screensBuffer[0] = '\0';
return info;
}
@ -39,43 +37,24 @@ IKeyState::KeyInfo *IKeyState::KeyInfo::alloc(
KeyID id, KeyModifierMask mask, KeyButton button, int32_t count, const std::set<std::string> &destinations
)
{
std::string screens = join(destinations);
const char *buffer = screens.c_str();
// build structure
#if SYSAPI_WIN32
// On windows we use malloc to avoid random test failures
auto *info = (KeyInfo *)malloc(sizeof(KeyInfo) + screens.size());
#else
auto *info = new KeyInfo();
#endif
info->m_key = id;
info->m_mask = mask;
info->m_button = button;
info->m_count = count;
info->m_screens = info->m_screensBuffer;
std::copy(buffer, buffer + screens.size() + 1, info->m_screensBuffer);
info->m_screens = join(destinations);
return info;
}
IKeyState::KeyInfo *IKeyState::KeyInfo::alloc(const KeyInfo &x)
{
auto bufferLen = strnlen(x.m_screensBuffer, SIZE_MAX);
#if SYSAPI_WIN32
// On windows we use malloc to avoid random test failures
auto info = (KeyInfo *)malloc(sizeof(KeyInfo) + bufferLen);
#else
auto *info = new KeyInfo();
#endif
info->m_key = x.m_key;
info->m_mask = x.m_mask;
info->m_button = x.m_button;
info->m_count = x.m_count;
info->m_screens = x.m_screens ? info->m_screensBuffer : nullptr;
memcpy(info->m_screensBuffer, x.m_screensBuffer, bufferLen + 1);
info->m_screens = x.m_screens;
return info;
}
@ -107,7 +86,7 @@ bool IKeyState::KeyInfo::equal(const KeyInfo *a, const KeyInfo *b)
{
return (
a->m_key == b->m_key && a->m_mask == b->m_mask && a->m_button == b->m_button && a->m_count == b->m_count &&
strcmp(a->m_screensBuffer, b->m_screensBuffer) == 0
a->m_screens == b->m_screens
);
}

View File

@ -45,8 +45,7 @@ public:
KeyModifierMask m_mask;
KeyButton m_button;
int32_t m_count;
char *m_screens;
char m_screensBuffer[1];
std::string m_screens;
};
using KeyButtonSet = std::set<KeyButton>;

View File

@ -469,8 +469,8 @@ std::string InputFilter::KeystrokeAction::format() const
);
} else {
return deskflow::string::sprintf(
"%s(%s,%.*s)", type, deskflow::KeyMap::formatKey(m_keyInfo->m_key, m_keyInfo->m_mask).c_str(),
strnlen(m_keyInfo->m_screens + 1, SIZE_MAX) - 1, m_keyInfo->m_screens + 1
"%s(%s,%s)", type, deskflow::KeyMap::formatKey(m_keyInfo->m_key, m_keyInfo->m_mask).c_str(),
m_keyInfo->m_screens.c_str()
);
}
}

View File

@ -1219,13 +1219,13 @@ void Server::handleKeyDownEvent(const Event &event)
{
const auto *info = static_cast<IPlatformScreen::KeyInfo *>(event.getData());
auto lang = AppUtil::instance().getCurrentLanguageCode();
onKeyDown(info->m_key, info->m_mask, info->m_button, lang, info->m_screens);
onKeyDown(info->m_key, info->m_mask, info->m_button, lang, info->m_screens.c_str());
}
void Server::handleKeyUpEvent(const Event &event)
{
auto *info = static_cast<IPlatformScreen::KeyInfo *>(event.getData());
onKeyUp(info->m_key, info->m_mask, info->m_button, info->m_screens);
onKeyUp(info->m_key, info->m_mask, info->m_button, info->m_screens.c_str());
}
void Server::handleKeyRepeatEvent(const Event &event)

View File

@ -12,7 +12,7 @@
void IKeyStateTests::allocDestination()
{
auto info = IKeyState::KeyInfo::alloc(1, 2, 3, 4, {"test1", "test2"});
QCOMPARE(info->m_screensBuffer, ":test1:test2:");
QCOMPARE(info->m_screens, ":test1:test2:");
}
QTEST_MAIN(IKeyStateTests)