Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8d675649 authored by Snild Dolkow's avatar Snild Dolkow Committed by Dominik Laskowski
Browse files

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
parent b7a9610d
Loading
Loading
Loading
Loading
+34 −31
Original line number Diff line number Diff line
@@ -2509,9 +2509,8 @@ status_t SurfaceComposerClient::getStaticDisplayInfo(int64_t displayId,
        outInfo->secure = ginfo.secure;
        outInfo->installOrientation = static_cast<ui::Rotation>(ginfo.installOrientation);

        if (const std::optional<gui::DeviceProductInfo> dpi = ginfo.deviceProductInfo) {
            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
@@ -2524,6 +2523,9 @@ status_t SurfaceComposerClient::getStaticDisplayInfo(int64_t displayId,
                          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);
@@ -2542,6 +2544,7 @@ status_t SurfaceComposerClient::getStaticDisplayInfo(int64_t displayId,

            outInfo->deviceProductInfo = info;
        }
    }
    return statusTFromBinderStatus(status);
}

+29 −27
Original line number Diff line number Diff line
@@ -8484,11 +8484,11 @@ binder::Status SurfaceComposerAIDL::getStaticDisplayInfo(int64_t displayId,
        outInfo->secure = info.secure;
        outInfo->installOrientation = static_cast<gui::Rotation>(info.installOrientation);

        if (const std::optional<DeviceProductInfo> dpi = info.deviceProductInfo) {
            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.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());
@@ -8502,7 +8502,8 @@ binder::Status SurfaceComposerAIDL::getStaticDisplayInfo(int64_t displayId,
                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>(
            } else if (const auto* manufacture =
                               std::get_if<DeviceProductInfo::ManufactureWeekAndYear>(
                                       &dpi->manufactureOrModelDate)) {
                gui::DeviceProductInfo::ManufactureWeekAndYear date;
                date.manufactureYear.modelYear.year = manufacture->year;
@@ -8512,6 +8513,7 @@ binder::Status SurfaceComposerAIDL::getStaticDisplayInfo(int64_t displayId,

            outInfo->deviceProductInfo = dinfo;
        }
    }
    return binderStatusFromStatusT(status);
}