Merge UBSan vla-bounds-not-positive fix from upstream am: ff1aa200b8 am: 41fcfd8bf0 am: 75305ca9be

Original change: https://android-review.googlesource.com/c/platform/external/libchrome-gestures/+/2871708

Change-Id: I17359821d4a1c76bcc5cbac580d8167ff39dd2b1
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
diff --git a/METADATA b/METADATA
index 9f26ca1..c2fe6b5 100644
--- a/METADATA
+++ b/METADATA
@@ -6,7 +6,7 @@
     type: GIT
     value: "https://chromium.googlesource.com/chromiumos/platform/gestures/"
   }
-  version: "d2ec17e2817001e97841fbab6da708a4183da4e1"
-  last_upgrade_date { year: 2023 month: 12 day: 4  }
+  version: "b31ef0adcaff61c045e95158cb9720543b42b531"
+  last_upgrade_date { year: 2023 month: 12 day: 13  }
   license_type: NOTICE
 }
diff --git a/include/immediate_interpreter.h b/include/immediate_interpreter.h
index 92d12a0..1be420e 100644
--- a/include/immediate_interpreter.h
+++ b/include/immediate_interpreter.h
@@ -344,6 +344,7 @@
   FRIEND_TEST(ImmediateInterpreterTest, ClickTest);
   FRIEND_TEST(ImmediateInterpreterTest, FlingDepthTest);
   FRIEND_TEST(ImmediateInterpreterTest, GetGesturingFingersTest);
+  FRIEND_TEST(ImmediateInterpreterTest, GetGesturingFingersWithEmptyStateTest);
   FRIEND_TEST(ImmediateInterpreterTest, PalmAtEdgeTest);
   FRIEND_TEST(ImmediateInterpreterTest, PalmReevaluateTest);
   FRIEND_TEST(ImmediateInterpreterTest, PalmTest);
diff --git a/src/immediate_interpreter.cc b/src/immediate_interpreter.cc
index 00d8b16..c1aa568 100644
--- a/src/immediate_interpreter.cc
+++ b/src/immediate_interpreter.cc
@@ -1729,6 +1729,10 @@
   if (pointing_.size() <= kMaxGesturingFingers)
     return pointing_;
 
+  if (hwstate.finger_cnt <= 0) {
+    return {};
+  }
+
   const FingerState* fs[hwstate.finger_cnt];
   for (size_t i = 0; i < hwstate.finger_cnt; ++i)
     fs[i] = &hwstate.fingers[i];
diff --git a/src/immediate_interpreter_unittest.cc b/src/immediate_interpreter_unittest.cc
index 0d4b195..c7c6db2 100644
--- a/src/immediate_interpreter_unittest.cc
+++ b/src/immediate_interpreter_unittest.cc
@@ -1501,7 +1501,7 @@
   TestInterpreterWrapper wrapper(&ii, &hwprops);
 
   FingerState finger_states[] = {
-    // TM, Tm, WM, Wm, Press, Orientation, X, Y, TrID
+    // TM, Tm, WM, Wm, Press, Orientation, X, Y, TrID, flags
     {0, 0, 0, 0, 1, 0, 61, 70, 91, 0},
     {0, 0, 0, 0, 1, 0, 62, 65, 92, 0},
     {0, 0, 0, 0, 1, 0, 62, 69, 93, 0},
@@ -1562,6 +1562,27 @@
   EXPECT_TRUE(ids.end() != ids.find(92));
 }
 
+TEST(ImmediateInterpreterTest, GetGesturingFingersWithEmptyStateTest) {
+  ImmediateInterpreter ii(nullptr, nullptr);
+  HardwareProperties hwprops = {};
+  TestInterpreterWrapper wrapper(&ii, &hwprops);
+
+  FingerState finger_states[] = {
+    // TM, Tm, WM, Wm, Press, Orientation, X, Y, TrID, flags
+    {0, 0, 0, 0, 1, 0, 61, 70, 91, 0},
+    {0, 0, 0, 0, 1, 0, 62, 65, 92, 0},
+    {0, 0, 0, 0, 1, 0, 62, 69, 93, 0},
+    {0, 0, 0, 0, 1, 0, 62, 61, 94, 0},
+    {0, 0, 0, 0, 1, 0, 63, 80, 95, 0},
+  };
+  HardwareState five_finger_hwstate =
+      make_hwstate(200000, 0, 5, 5, &finger_states[0]);
+  HardwareState no_finger_hwstate = make_hwstate(200001, 0, 0, 0, nullptr);
+  ii.ResetSameFingersState(five_finger_hwstate);
+  ii.UpdatePointingFingers(five_finger_hwstate);
+  EXPECT_TRUE(ii.GetGesturingFingers(no_finger_hwstate).empty());
+}
+
 namespace {
 std::set<short> MkSet() {
   return std::set<short>();