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;
}
}