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

Commit 30aa4375 authored by Huihong Luo's avatar Huihong Luo
Browse files

Fix data type error in AIDL

utf8InCpp string should not be used to pass arbitrary data, as it drops
invalid chars during utf8-utf16 conversion.
byte[] is the correct type to use.

Bug: 250401609
Test: atest libgui_test libsurfaceflinger_unittest SurfaceFlinger_test
Change-Id: Ia1bf7e2cdc134a392d7b4edace9b2799a4c0d23b
parent a84abc85
Loading
Loading
Loading
Loading
+1 −1
Original line number Original line Diff line number Diff line
@@ -2542,7 +2542,7 @@ status_t SurfaceComposerClient::onPullAtom(const int32_t atomId, std::string* ou
    gui::PullAtomData pad;
    gui::PullAtomData pad;
    binder::Status status = ComposerServiceAIDL::getComposerService()->onPullAtom(atomId, &pad);
    binder::Status status = ComposerServiceAIDL::getComposerService()->onPullAtom(atomId, &pad);
    if (status.isOk()) {
    if (status.isOk()) {
        outData->assign((const char*)pad.data.data(), pad.data.size());
        outData->assign(pad.data.begin(), pad.data.end());
        *success = pad.success;
        *success = pad.success;
    }
    }
    return statusTFromBinderStatus(status);
    return statusTFromBinderStatus(status);
+1 −1
Original line number Original line Diff line number Diff line
@@ -18,6 +18,6 @@ package android.gui;


/** @hide */
/** @hide */
parcelable PullAtomData {
parcelable PullAtomData {
    @utf8InCpp String data;
    byte[] data;
    boolean success;
    boolean success;
}
}
+2 −1
Original line number Original line Diff line number Diff line
@@ -1558,7 +1558,8 @@ status_t SurfaceFlinger::overrideHdrTypes(const sp<IBinder>& displayToken,
    return NO_ERROR;
    return NO_ERROR;
}
}


status_t SurfaceFlinger::onPullAtom(const int32_t atomId, std::string* pulledData, bool* success) {
status_t SurfaceFlinger::onPullAtom(const int32_t atomId, std::vector<uint8_t>* pulledData,
                                    bool* success) {
    *success = mTimeStats->onPullAtom(atomId, pulledData);
    *success = mTimeStats->onPullAtom(atomId, pulledData);
    return NO_ERROR;
    return NO_ERROR;
}
}
+1 −1
Original line number Original line Diff line number Diff line
@@ -527,7 +527,7 @@ private:
    void setPowerMode(const sp<IBinder>& displayToken, int mode);
    void setPowerMode(const sp<IBinder>& displayToken, int mode);
    status_t overrideHdrTypes(const sp<IBinder>& displayToken,
    status_t overrideHdrTypes(const sp<IBinder>& displayToken,
                              const std::vector<ui::Hdr>& hdrTypes);
                              const std::vector<ui::Hdr>& hdrTypes);
    status_t onPullAtom(const int32_t atomId, std::string* pulledData, bool* success);
    status_t onPullAtom(const int32_t atomId, std::vector<uint8_t>* pulledData, bool* success);
    status_t getLayerDebugInfo(std::vector<gui::LayerDebugInfo>* outLayers);
    status_t getLayerDebugInfo(std::vector<gui::LayerDebugInfo>* outLayers);
    status_t getColorManagement(bool* outGetColorManagement) const;
    status_t getColorManagement(bool* outGetColorManagement) const;
    status_t getCompositionPreference(ui::Dataspace* outDataspace, ui::PixelFormat* outPixelFormat,
    status_t getCompositionPreference(ui::Dataspace* outDataspace, ui::PixelFormat* outPixelFormat,
+7 −5
Original line number Original line Diff line number Diff line
@@ -90,7 +90,7 @@ SurfaceflingerStatsLayerInfo_SetFrameRateVote frameRateVoteToProto(
}
}
} // namespace
} // namespace


bool TimeStats::populateGlobalAtom(std::string* pulledData) {
bool TimeStats::populateGlobalAtom(std::vector<uint8_t>* pulledData) {
    std::lock_guard<std::mutex> lock(mMutex);
    std::lock_guard<std::mutex> lock(mMutex);


    if (mTimeStats.statsStartLegacy == 0) {
    if (mTimeStats.statsStartLegacy == 0) {
@@ -138,10 +138,11 @@ bool TimeStats::populateGlobalAtom(std::string* pulledData) {
    // Always clear data.
    // Always clear data.
    clearGlobalLocked();
    clearGlobalLocked();


    return atomList.SerializeToString(pulledData);
    pulledData->resize(atomList.ByteSizeLong());
    return atomList.SerializeToArray(pulledData->data(), atomList.ByteSizeLong());
}
}


bool TimeStats::populateLayerAtom(std::string* pulledData) {
bool TimeStats::populateLayerAtom(std::vector<uint8_t>* pulledData) {
    std::lock_guard<std::mutex> lock(mMutex);
    std::lock_guard<std::mutex> lock(mMutex);


    std::vector<TimeStatsHelper::TimeStatsLayer*> dumpStats;
    std::vector<TimeStatsHelper::TimeStatsLayer*> dumpStats;
@@ -229,7 +230,8 @@ bool TimeStats::populateLayerAtom(std::string* pulledData) {
    // Always clear data.
    // Always clear data.
    clearLayersLocked();
    clearLayersLocked();


    return atomList.SerializeToString(pulledData);
    pulledData->resize(atomList.ByteSizeLong());
    return atomList.SerializeToArray(pulledData->data(), atomList.ByteSizeLong());
}
}


TimeStats::TimeStats() : TimeStats(std::nullopt, std::nullopt) {}
TimeStats::TimeStats() : TimeStats(std::nullopt, std::nullopt) {}
@@ -245,7 +247,7 @@ TimeStats::TimeStats(std::optional<size_t> maxPulledLayers,
    }
    }
}
}


bool TimeStats::onPullAtom(const int atomId, std::string* pulledData) {
bool TimeStats::onPullAtom(const int atomId, std::vector<uint8_t>* pulledData) {
    bool success = false;
    bool success = false;
    if (atomId == 10062) { // SURFACEFLINGER_STATS_GLOBAL_INFO
    if (atomId == 10062) { // SURFACEFLINGER_STATS_GLOBAL_INFO
        success = populateGlobalAtom(pulledData);
        success = populateGlobalAtom(pulledData);
Loading