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

Commit 700342fb authored by Galia Peycheva's avatar Galia Peycheva
Browse files

Add permission check for blurs in SurfaceFlinger

This CL checks that original calling package for background blur and
blur regions has the Manifest.permission.USE_BACKGROUND_BLUR permission.

Bug: 177336952
Test: manual
Change-Id: I70d1e17158d83cc87f73be6f3a2f39d173c01149
parent 7b632a57
Loading
Loading
Loading
Loading
+17 −6
Original line number Diff line number Diff line
@@ -276,6 +276,7 @@ const String16 sHardwareTest("android.permission.HARDWARE_TEST");
const String16 sAccessSurfaceFlinger("android.permission.ACCESS_SURFACE_FLINGER");
const String16 sRotateSurfaceFlinger("android.permission.ROTATE_SURFACE_FLINGER");
const String16 sReadFramebuffer("android.permission.READ_FRAME_BUFFER");
const String16 sUseBackgroundBlur("android.permission.USE_BACKGROUND_BLUR");
const String16 sDump("android.permission.DUMP");
const char* KERNEL_IDLE_TIMER_PROP = "graphics.display.kernel_idle_timer.enabled";

@@ -333,6 +334,10 @@ bool callingThreadHasRotateSurfaceFlingerAccess() {
            PermissionCache::checkPermission(sRotateSurfaceFlinger, pid, uid);
}

bool originalCallerCanUseBlurs(int originPid, int originUid) {
    return PermissionCache::checkPermission(sUseBackgroundBlur, originPid, originUid);
}

SurfaceFlingerBE::SurfaceFlingerBE() : mHwcServiceName(getHwcServiceName()) {}

SurfaceFlinger::SurfaceFlinger(Factory& factory, SkipInitializationTag)
@@ -3436,9 +3441,10 @@ void SurfaceFlinger::applyTransactionState(
    std::unordered_set<ListenerCallbacks, ListenerCallbacksHash> listenerCallbacksWithSurfaces;
    uint32_t clientStateFlags = 0;
    for (const ComposerState& state : states) {
        clientStateFlags |= setClientStateLocked(frameTimelineVsyncId, state, desiredPresentTime,
        clientStateFlags |=
                setClientStateLocked(frameTimelineVsyncId, state, desiredPresentTime,
                                     isAutoTimestamp, postTime, privileged,
                                                 listenerCallbacksWithSurfaces);
                                     listenerCallbacksWithSurfaces, originPid, originUid);
        if ((flags & eAnimation) && state.state.surface) {
            if (const auto layer = fromHandleLocked(state.state.surface).promote(); layer) {
                mScheduler->recordLayerHistory(layer.get(),
@@ -3618,7 +3624,8 @@ bool SurfaceFlinger::callingThreadHasUnscopedSurfaceFlingerAccess(bool usePermis
uint32_t SurfaceFlinger::setClientStateLocked(
        int64_t frameTimelineVsyncId, const ComposerState& composerState,
        int64_t desiredPresentTime, bool isAutoTimestamp, int64_t postTime, bool privileged,
        std::unordered_set<ListenerCallbacks, ListenerCallbacksHash>& listenerCallbacks) {
        std::unordered_set<ListenerCallbacks, ListenerCallbacksHash>& listenerCallbacks,
        int originPid, int originUid) {
    const layer_state_t& s = composerState.state;

    for (auto& listener : s.listeners) {
@@ -3762,10 +3769,14 @@ uint32_t SurfaceFlinger::setClientStateLocked(
        if (layer->setCornerRadius(s.cornerRadius))
            flags |= eTraversalNeeded;
    }
    if (what & layer_state_t::eBackgroundBlurRadiusChanged && !mDisableBlurs && mSupportsBlur) {

    if (what & layer_state_t::eBackgroundBlurRadiusChanged && !mDisableBlurs && mSupportsBlur &&
        originalCallerCanUseBlurs(originPid, originUid)) {
        if (layer->setBackgroundBlurRadius(s.backgroundBlurRadius)) flags |= eTraversalNeeded;
    }
    if (what & layer_state_t::eBlurRegionsChanged) {

    if (what & layer_state_t::eBlurRegionsChanged &&
        originalCallerCanUseBlurs(originPid, originUid)) {
        if (layer->setBlurRegions(s.blurRegions)) flags |= eTraversalNeeded;
    }
    if (what & layer_state_t::eLayerStackChanged) {
+2 −2
Original line number Diff line number Diff line
@@ -342,8 +342,8 @@ protected:
    virtual uint32_t setClientStateLocked(
            int64_t frameTimelineVsyncId, const ComposerState& composerState,
            int64_t desiredPresentTime, bool isAutoTimestamp, int64_t postTime, bool privileged,
            std::unordered_set<ListenerCallbacks, ListenerCallbacksHash>& listenerCallbacks)
            REQUIRES(mStateLock);
            std::unordered_set<ListenerCallbacks, ListenerCallbacksHash>& listenerCallbacks,
            int originPid, int originUid) REQUIRES(mStateLock);
    virtual void commitTransactionLocked();

    // Used internally by computeLayerBounds() to gets the clip rectangle to use for the