Loading services/surfaceflinger/SurfaceFlinger.cpp +9 −2 Original line number Original line Diff line number Diff line Loading @@ -4400,6 +4400,9 @@ status_t SurfaceFlinger::captureScreenCommon(RenderArea& renderArea, int syncFd = -1; int syncFd = -1; std::optional<status_t> captureResult; std::optional<status_t> captureResult; const int uid = IPCThreadState::self()->getCallingUid(); const bool forSystem = uid == AID_GRAPHICS || uid == AID_SYSTEM; sp<LambdaMessage> message = new LambdaMessage([&]() { sp<LambdaMessage> message = new LambdaMessage([&]() { // If there is a refresh pending, bug out early and tell the binder thread to try again // If there is a refresh pending, bug out early and tell the binder thread to try again // after the refresh. // after the refresh. Loading @@ -4416,7 +4419,7 @@ status_t SurfaceFlinger::captureScreenCommon(RenderArea& renderArea, { { Mutex::Autolock _l(mStateLock); Mutex::Autolock _l(mStateLock); result = captureScreenImplLocked(renderArea, traverseLayers, (*outBuffer).get(), result = captureScreenImplLocked(renderArea, traverseLayers, (*outBuffer).get(), useIdentityTransform, &fd); useIdentityTransform, forSystem, &fd); } } { { Loading Loading @@ -4513,6 +4516,7 @@ status_t SurfaceFlinger::captureScreenImplLocked(const RenderArea& renderArea, TraverseLayersFunction traverseLayers, TraverseLayersFunction traverseLayers, ANativeWindowBuffer* buffer, ANativeWindowBuffer* buffer, bool useIdentityTransform, bool useIdentityTransform, bool forSystem, int* outSyncFd) { int* outSyncFd) { ATRACE_CALL(); ATRACE_CALL(); Loading @@ -4522,7 +4526,10 @@ status_t SurfaceFlinger::captureScreenImplLocked(const RenderArea& renderArea, secureLayerIsVisible = secureLayerIsVisible || (layer->isVisible() && layer->isSecure()); secureLayerIsVisible = secureLayerIsVisible || (layer->isVisible() && layer->isSecure()); }); }); if (secureLayerIsVisible) { // We allow the system server to take screenshots of secure layers for // use in situations like the Screen-rotation animation and place // the impetus on WindowManager to not persist them. if (secureLayerIsVisible && !forSystem) { ALOGW("FB is protected: PERMISSION_DENIED"); ALOGW("FB is protected: PERMISSION_DENIED"); return PERMISSION_DENIED; return PERMISSION_DENIED; } } Loading services/surfaceflinger/SurfaceFlinger.h +1 −1 Original line number Original line Diff line number Diff line Loading @@ -524,7 +524,7 @@ private: status_t captureScreenImplLocked(const RenderArea& renderArea, status_t captureScreenImplLocked(const RenderArea& renderArea, TraverseLayersFunction traverseLayers, TraverseLayersFunction traverseLayers, ANativeWindowBuffer* buffer, bool useIdentityTransform, ANativeWindowBuffer* buffer, bool useIdentityTransform, int* outSyncFd); bool forSystem, int* outSyncFd); void traverseLayersInDisplay(const sp<const DisplayDevice>& display, int32_t minLayerZ, void traverseLayersInDisplay(const sp<const DisplayDevice>& display, int32_t minLayerZ, int32_t maxLayerZ, const LayerVector::Visitor& visitor); int32_t maxLayerZ, const LayerVector::Visitor& visitor); Loading Loading
services/surfaceflinger/SurfaceFlinger.cpp +9 −2 Original line number Original line Diff line number Diff line Loading @@ -4400,6 +4400,9 @@ status_t SurfaceFlinger::captureScreenCommon(RenderArea& renderArea, int syncFd = -1; int syncFd = -1; std::optional<status_t> captureResult; std::optional<status_t> captureResult; const int uid = IPCThreadState::self()->getCallingUid(); const bool forSystem = uid == AID_GRAPHICS || uid == AID_SYSTEM; sp<LambdaMessage> message = new LambdaMessage([&]() { sp<LambdaMessage> message = new LambdaMessage([&]() { // If there is a refresh pending, bug out early and tell the binder thread to try again // If there is a refresh pending, bug out early and tell the binder thread to try again // after the refresh. // after the refresh. Loading @@ -4416,7 +4419,7 @@ status_t SurfaceFlinger::captureScreenCommon(RenderArea& renderArea, { { Mutex::Autolock _l(mStateLock); Mutex::Autolock _l(mStateLock); result = captureScreenImplLocked(renderArea, traverseLayers, (*outBuffer).get(), result = captureScreenImplLocked(renderArea, traverseLayers, (*outBuffer).get(), useIdentityTransform, &fd); useIdentityTransform, forSystem, &fd); } } { { Loading Loading @@ -4513,6 +4516,7 @@ status_t SurfaceFlinger::captureScreenImplLocked(const RenderArea& renderArea, TraverseLayersFunction traverseLayers, TraverseLayersFunction traverseLayers, ANativeWindowBuffer* buffer, ANativeWindowBuffer* buffer, bool useIdentityTransform, bool useIdentityTransform, bool forSystem, int* outSyncFd) { int* outSyncFd) { ATRACE_CALL(); ATRACE_CALL(); Loading @@ -4522,7 +4526,10 @@ status_t SurfaceFlinger::captureScreenImplLocked(const RenderArea& renderArea, secureLayerIsVisible = secureLayerIsVisible || (layer->isVisible() && layer->isSecure()); secureLayerIsVisible = secureLayerIsVisible || (layer->isVisible() && layer->isSecure()); }); }); if (secureLayerIsVisible) { // We allow the system server to take screenshots of secure layers for // use in situations like the Screen-rotation animation and place // the impetus on WindowManager to not persist them. if (secureLayerIsVisible && !forSystem) { ALOGW("FB is protected: PERMISSION_DENIED"); ALOGW("FB is protected: PERMISSION_DENIED"); return PERMISSION_DENIED; return PERMISSION_DENIED; } } Loading
services/surfaceflinger/SurfaceFlinger.h +1 −1 Original line number Original line Diff line number Diff line Loading @@ -524,7 +524,7 @@ private: status_t captureScreenImplLocked(const RenderArea& renderArea, status_t captureScreenImplLocked(const RenderArea& renderArea, TraverseLayersFunction traverseLayers, TraverseLayersFunction traverseLayers, ANativeWindowBuffer* buffer, bool useIdentityTransform, ANativeWindowBuffer* buffer, bool useIdentityTransform, int* outSyncFd); bool forSystem, int* outSyncFd); void traverseLayersInDisplay(const sp<const DisplayDevice>& display, int32_t minLayerZ, void traverseLayersInDisplay(const sp<const DisplayDevice>& display, int32_t minLayerZ, int32_t maxLayerZ, const LayerVector::Visitor& visitor); int32_t maxLayerZ, const LayerVector::Visitor& visitor); Loading