Cygwin: console: Do not use memcmp() to compare INPUT_RECORD.

- Using memcmp() to compare structure such as INPUT_RECORD is not
  correct manner because padding may not be initialized. This patch
  stops to use memcmp() for comparison of INPUT_RECORD.
This commit is contained in:
Takashi Yano 2022-03-19 09:21:04 +09:00
parent 92519e3d0c
commit 090797e3d3
1 changed files with 38 additions and 3 deletions

View File

@ -186,7 +186,9 @@ inrec_eq (const INPUT_RECORD *a, const INPUT_RECORD *b, DWORD n)
{
for (DWORD i = 0; i < n; i++)
{
if (a[i].EventType == KEY_EVENT && b[i].EventType == KEY_EVENT)
if (a[i].EventType != b[i].EventType)
return false;
else if (a[i].EventType == KEY_EVENT)
{ /* wVirtualKeyCode, wVirtualScanCode and dwControlKeyState
of the readback key event may be different from that of
written event. Therefore they are ignored. */
@ -197,9 +199,42 @@ inrec_eq (const INPUT_RECORD *a, const INPUT_RECORD *b, DWORD n)
|| ak->wRepeatCount != bk->wRepeatCount)
return false;
}
else if (memcmp (a + i, b + i, sizeof (INPUT_RECORD)) != 0)
else if (a[i].EventType == MOUSE_EVENT)
{
const MOUSE_EVENT_RECORD *am = &a[i].Event.MouseEvent;
const MOUSE_EVENT_RECORD *bm = &b[i].Event.MouseEvent;
if (am->dwMousePosition.X != bm->dwMousePosition.X
|| am->dwMousePosition.Y != bm->dwMousePosition.Y
|| am->dwButtonState != bm->dwButtonState
|| am->dwControlKeyState != bm->dwControlKeyState
|| am->dwEventFlags != bm->dwEventFlags)
return false;
}
else if (a[i].EventType == WINDOW_BUFFER_SIZE_EVENT)
{
const WINDOW_BUFFER_SIZE_RECORD
*aw = &a[i].Event.WindowBufferSizeEvent;
const WINDOW_BUFFER_SIZE_RECORD
*bw = &b[i].Event.WindowBufferSizeEvent;
if (aw->dwSize.X != bw->dwSize.X
|| aw->dwSize.Y != bw->dwSize.Y)
return false;
}
else if (a[i].EventType == MENU_EVENT)
{
const MENU_EVENT_RECORD *am = &a[i].Event.MenuEvent;
const MENU_EVENT_RECORD *bm = &b[i].Event.MenuEvent;
if (am->dwCommandId != bm->dwCommandId)
return false;
}
else if (a[i].EventType == FOCUS_EVENT)
{
const FOCUS_EVENT_RECORD *af = &a[i].Event.FocusEvent;
const FOCUS_EVENT_RECORD *bf = &b[i].Event.FocusEvent;
if (af->bSetFocus != bf->bSetFocus)
return false;
}
}
return true;
}