]> sourceware.org Git - newlib-cygwin.git/commitdiff
Cygwin: console: Do not use memcmp() to compare INPUT_RECORD.
authorTakashi Yano <takashi.yano@nifty.ne.jp>
Sat, 19 Mar 2022 00:21:04 +0000 (09:21 +0900)
committerTakashi Yano <takashi.yano@nifty.ne.jp>
Sat, 19 Mar 2022 00:21:04 +0000 (09:21 +0900)
- 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.

winsup/cygwin/fhandler_console.cc

index fd5f972d8936a7d0fe9eaefc90bee158a857fc58..5625b7be249ea14a41097f6801d0261e6f9b045d 100644 (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,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;
 }
This page took 0.03607 seconds and 5 git commands to generate.