aboutsummaryrefslogtreecommitdiff
path: root/winsup
diff options
context:
space:
mode:
authorTakashi Yano <takashi.yano@nifty.ne.jp>2022-03-19 09:21:04 +0900
committerTakashi Yano <takashi.yano@nifty.ne.jp>2022-03-19 09:35:42 +0900
commit8a12474bb5d287d73229270509b49a0c6b8fcabb (patch)
tree3e4e940e9dc8c56146078d5c303869e466458527 /winsup
parent5f10ebc0a76633066bd30c89b715692d68e19f9f (diff)
downloadnewlib-8a12474bb5d287d73229270509b49a0c6b8fcabb.zip
newlib-8a12474bb5d287d73229270509b49a0c6b8fcabb.tar.gz
newlib-8a12474bb5d287d73229270509b49a0c6b8fcabb.tar.bz2
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.
Diffstat (limited to 'winsup')
-rw-r--r--winsup/cygwin/fhandler_console.cc41
1 files changed, 38 insertions, 3 deletions
diff --git a/winsup/cygwin/fhandler_console.cc b/winsup/cygwin/fhandler_console.cc
index 1bfe05a..d2ed15a 100644
--- a/winsup/cygwin/fhandler_console.cc
+++ b/winsup/cygwin/fhandler_console.cc
@@ -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,8 +199,41 @@ 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)
- return false;
+ 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;
}