Merge the 2021-08-05 SPL branch from AOSP-Partner

* security-aosp-pi-release:
  audio HAL - fix UAFs

Change-Id: I4cf0d75b2d7c8828ef64d945740078020ec9f605
diff --git a/gnss/1.0/default/Gnss.cpp b/gnss/1.0/default/Gnss.cpp
index 32c131c..5bc6d80 100644
--- a/gnss/1.0/default/Gnss.cpp
+++ b/gnss/1.0/default/Gnss.cpp
@@ -198,6 +198,10 @@
     uint32_t ephemerisMask = svInfo->ephemeris_mask;
     uint32_t almanacMask = svInfo->almanac_mask;
     uint32_t usedInFixMask = svInfo->used_in_fix_mask;
+    // Our HALs report a bigger svinfo struct, HaxxSvStatus, which includes a GLONASS and
+    // a Beidou usage mask
+    uint32_t gloUsedInFixMask = *(&(svInfo->used_in_fix_mask) + 1); // the next int
+    uint64_t bdsUsedInFixMask = *(&(svInfo->used_in_fix_mask) + 2); // the next int
     /*
      * Conversion from GpsSvInfo to IGnssCallback::GnssSvInfo happens below.
      */
@@ -231,10 +235,13 @@
         info.svFlag = static_cast<uint8_t>(IGnssCallback::GnssSvFlags::NONE);
 
         /*
-         * Only GPS info is valid for these fields, as these masks are just 32
-         * bits, by GPS prn.
+         * GPS, GLONASS and Beidou info is valid for these fields, as these masks
+         * are just 32/64 bits, by GPS prn, another for GLONASS prn and another
+         * for Beidou prn.
          */
-        if (info.constellation == GnssConstellationType::GPS) {
+        if (info.constellation == GnssConstellationType::GPS ||
+            info.constellation == GnssConstellationType::GLONASS ||
+            info.constellation == GnssConstellationType::BEIDOU) {
             int32_t svidMask = (1 << (info.svid - 1));
             if ((ephemerisMask & svidMask) != 0) {
                 info.svFlag |= IGnssCallback::GnssSvFlags::HAS_EPHEMERIS_DATA;
@@ -242,7 +249,12 @@
             if ((almanacMask & svidMask) != 0) {
                 info.svFlag |= IGnssCallback::GnssSvFlags::HAS_ALMANAC_DATA;
             }
-            if ((usedInFixMask & svidMask) != 0) {
+            if ((info.constellation == GnssConstellationType::GPS &&
+                 (usedInFixMask & svidMask) != 0) ||
+                (info.constellation == GnssConstellationType::GLONASS &&
+                 (gloUsedInFixMask & svidMask) != 0) ||
+                (info.constellation == GnssConstellationType::BEIDOU &&
+                 (bdsUsedInFixMask & svidMask) != 0)) {
                 info.svFlag |= IGnssCallback::GnssSvFlags::USED_IN_FIX;
             }
         }