diff options
author | Snild Dolkow <snild@sony.com> | 2023-07-14 12:43:35 +0200 |
---|---|---|
committer | Hung-ying Tyan <tyanh@google.com> | 2023-08-07 07:22:56 +0000 |
commit | 3c769ac06b79c9791d3c5ef7f42f4051d17cafb9 (patch) | |
tree | 40d627eadb3344d1c39ca4548fc65e53fc735386 | |
parent | afb6fe0ae3fcef77cb3d05fdf913ac8ca95d31d8 (diff) | |
download | native-3c769ac06b79c9791d3c5ef7f42f4051d17cafb9.tar.gz |
Let missing DeviceProductInfo pass through AIDL
On the way between SurfaceFlinger and DisplayManager, there are two
conversions done between the old and new StaticDisplayInfo types.
Neither of these conversions were checking that the incoming optional
DeviceProductInfo did indeed have a value before reading it.
Dereferencing an empty optional is undefined behavior. In practice,
the converters read zeroes, causing the output to have info fields
with present-but-invalid content.
On devices that do not provide DeviceProductInfo, DisplayManager got
a model year of 0, making DisplayTest#testGetDeviceProductInfo fail.
Fixes: 291101831
Fixes: 283031260
Fixes: 286718808
Test: cts DisplayTest#testGetDeviceProductInfo
Change-Id: I118a1ce6459697ce471cdec75d156adad479c654
(cherry picked from commit 8d675649a60fa64b07fd3d41710d924c4405d933)
-rw-r--r-- | libs/gui/SurfaceComposerClient.cpp | 65 | ||||
-rw-r--r-- | services/surfaceflinger/SurfaceFlinger.cpp | 56 |
2 files changed, 63 insertions, 58 deletions
diff --git a/libs/gui/SurfaceComposerClient.cpp b/libs/gui/SurfaceComposerClient.cpp index 0fda358b63..abff1c9d30 100644 --- a/libs/gui/SurfaceComposerClient.cpp +++ b/libs/gui/SurfaceComposerClient.cpp @@ -2523,38 +2523,41 @@ status_t SurfaceComposerClient::getStaticDisplayInfo(int64_t displayId, outInfo->secure = ginfo.secure; outInfo->installOrientation = static_cast<ui::Rotation>(ginfo.installOrientation); - DeviceProductInfo info; - std::optional<gui::DeviceProductInfo> dpi = ginfo.deviceProductInfo; - gui::DeviceProductInfo::ManufactureOrModelDate& date = dpi->manufactureOrModelDate; - info.name = dpi->name; - if (dpi->manufacturerPnpId.size() > 0) { - // copid from PnpId = std::array<char, 4> in ui/DeviceProductInfo.h - constexpr int kMaxPnpIdSize = 4; - size_t count = std::max<size_t>(kMaxPnpIdSize, dpi->manufacturerPnpId.size()); - std::copy_n(dpi->manufacturerPnpId.begin(), count, info.manufacturerPnpId.begin()); - } - if (dpi->relativeAddress.size() > 0) { - std::copy(dpi->relativeAddress.begin(), dpi->relativeAddress.end(), - std::back_inserter(info.relativeAddress)); - } - info.productId = dpi->productId; - if (date.getTag() == Tag::modelYear) { - DeviceProductInfo::ModelYear modelYear; - modelYear.year = static_cast<uint32_t>(date.get<Tag::modelYear>().year); - info.manufactureOrModelDate = modelYear; - } else if (date.getTag() == Tag::manufactureYear) { - DeviceProductInfo::ManufactureYear manufactureYear; - manufactureYear.year = date.get<Tag::manufactureYear>().modelYear.year; - info.manufactureOrModelDate = manufactureYear; - } else if (date.getTag() == Tag::manufactureWeekAndYear) { - DeviceProductInfo::ManufactureWeekAndYear weekAndYear; - weekAndYear.year = - date.get<Tag::manufactureWeekAndYear>().manufactureYear.modelYear.year; - weekAndYear.week = date.get<Tag::manufactureWeekAndYear>().week; - info.manufactureOrModelDate = weekAndYear; - } + if (const std::optional<gui::DeviceProductInfo> dpi = ginfo.deviceProductInfo) { + DeviceProductInfo info; + info.name = dpi->name; + if (dpi->manufacturerPnpId.size() > 0) { + // copid from PnpId = std::array<char, 4> in ui/DeviceProductInfo.h + constexpr int kMaxPnpIdSize = 4; + size_t count = std::max<size_t>(kMaxPnpIdSize, dpi->manufacturerPnpId.size()); + std::copy_n(dpi->manufacturerPnpId.begin(), count, info.manufacturerPnpId.begin()); + } + if (dpi->relativeAddress.size() > 0) { + std::copy(dpi->relativeAddress.begin(), dpi->relativeAddress.end(), + std::back_inserter(info.relativeAddress)); + } + info.productId = dpi->productId; + + const gui::DeviceProductInfo::ManufactureOrModelDate& date = + dpi->manufactureOrModelDate; + if (date.getTag() == Tag::modelYear) { + DeviceProductInfo::ModelYear modelYear; + modelYear.year = static_cast<uint32_t>(date.get<Tag::modelYear>().year); + info.manufactureOrModelDate = modelYear; + } else if (date.getTag() == Tag::manufactureYear) { + DeviceProductInfo::ManufactureYear manufactureYear; + manufactureYear.year = date.get<Tag::manufactureYear>().modelYear.year; + info.manufactureOrModelDate = manufactureYear; + } else if (date.getTag() == Tag::manufactureWeekAndYear) { + DeviceProductInfo::ManufactureWeekAndYear weekAndYear; + weekAndYear.year = + date.get<Tag::manufactureWeekAndYear>().manufactureYear.modelYear.year; + weekAndYear.week = date.get<Tag::manufactureWeekAndYear>().week; + info.manufactureOrModelDate = weekAndYear; + } - outInfo->deviceProductInfo = info; + outInfo->deviceProductInfo = info; + } } return statusTFromBinderStatus(status); } diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp index fe2db940f7..38a067d1b3 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -8506,33 +8506,35 @@ binder::Status SurfaceComposerAIDL::getStaticDisplayInfo(int64_t displayId, outInfo->secure = info.secure; outInfo->installOrientation = static_cast<gui::Rotation>(info.installOrientation); - gui::DeviceProductInfo dinfo; - std::optional<DeviceProductInfo> dpi = info.deviceProductInfo; - dinfo.name = std::move(dpi->name); - dinfo.manufacturerPnpId = - std::vector<uint8_t>(dpi->manufacturerPnpId.begin(), dpi->manufacturerPnpId.end()); - dinfo.productId = dpi->productId; - dinfo.relativeAddress = - std::vector<uint8_t>(dpi->relativeAddress.begin(), dpi->relativeAddress.end()); - if (const auto* model = - std::get_if<DeviceProductInfo::ModelYear>(&dpi->manufactureOrModelDate)) { - gui::DeviceProductInfo::ModelYear modelYear; - modelYear.year = model->year; - dinfo.manufactureOrModelDate.set<Tag::modelYear>(modelYear); - } else if (const auto* manufacture = std::get_if<DeviceProductInfo::ManufactureYear>( - &dpi->manufactureOrModelDate)) { - gui::DeviceProductInfo::ManufactureYear date; - date.modelYear.year = manufacture->year; - dinfo.manufactureOrModelDate.set<Tag::manufactureYear>(date); - } else if (const auto* manufacture = std::get_if<DeviceProductInfo::ManufactureWeekAndYear>( - &dpi->manufactureOrModelDate)) { - gui::DeviceProductInfo::ManufactureWeekAndYear date; - date.manufactureYear.modelYear.year = manufacture->year; - date.week = manufacture->week; - dinfo.manufactureOrModelDate.set<Tag::manufactureWeekAndYear>(date); - } - - outInfo->deviceProductInfo = dinfo; + if (const std::optional<DeviceProductInfo> dpi = info.deviceProductInfo) { + gui::DeviceProductInfo dinfo; + dinfo.name = std::move(dpi->name); + dinfo.manufacturerPnpId = std::vector<uint8_t>(dpi->manufacturerPnpId.begin(), + dpi->manufacturerPnpId.end()); + dinfo.productId = dpi->productId; + dinfo.relativeAddress = + std::vector<uint8_t>(dpi->relativeAddress.begin(), dpi->relativeAddress.end()); + if (const auto* model = + std::get_if<DeviceProductInfo::ModelYear>(&dpi->manufactureOrModelDate)) { + gui::DeviceProductInfo::ModelYear modelYear; + modelYear.year = model->year; + dinfo.manufactureOrModelDate.set<Tag::modelYear>(modelYear); + } else if (const auto* manufacture = std::get_if<DeviceProductInfo::ManufactureYear>( + &dpi->manufactureOrModelDate)) { + gui::DeviceProductInfo::ManufactureYear date; + date.modelYear.year = manufacture->year; + dinfo.manufactureOrModelDate.set<Tag::manufactureYear>(date); + } else if (const auto* manufacture = + std::get_if<DeviceProductInfo::ManufactureWeekAndYear>( + &dpi->manufactureOrModelDate)) { + gui::DeviceProductInfo::ManufactureWeekAndYear date; + date.manufactureYear.modelYear.year = manufacture->year; + date.week = manufacture->week; + dinfo.manufactureOrModelDate.set<Tag::manufactureWeekAndYear>(date); + } + + outInfo->deviceProductInfo = dinfo; + } } return binderStatusFromStatusT(status); } |