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

Commit 6c09ee7f authored by Chris Forbes's avatar Chris Forbes
Browse files

gralloc: Move validation of non-blob/gpu_data_buffer down to libui

AIDL gralloc implementations may choose to support this combination.
Existing implementations of HIDL gralloc 2/3/4 do not support it,
and do not reliably reject it due to having been previously protected
by validation at the AHardwareBuffer layer.

Move the check down to the gralloc layer, and defer to the HAL only
in the AIDL case.

Bug: b/195944622
Test: build; real CTS/VTS to land soon after.
Change-Id: I7b0b9de005a9b0f564915f9c71cc8aea3ef0618a
parent a9ff7383
Loading
Loading
Loading
Loading
+0 −4
Original line number Diff line number Diff line
@@ -509,10 +509,6 @@ bool AHardwareBuffer_isValidDescription(const AHardwareBuffer_Desc* desc, bool l
            ALOGE_IF(log, "AHARDWAREBUFFER_USAGE_SENSOR_DIRECT_DATA requires AHARDWAREBUFFER_FORMAT_BLOB");
            return false;
        }
        if (desc->usage & AHARDWAREBUFFER_USAGE_GPU_DATA_BUFFER) {
            ALOGE_IF(log, "AHARDWAREBUFFER_USAGE_GPU_DATA_BUFFER requires AHARDWAREBUFFER_FORMAT_BLOB");
            return false;
        }
    }

    if ((desc->usage & (AHARDWAREBUFFER_USAGE_CPU_READ_MASK | AHARDWAREBUFFER_USAGE_CPU_WRITE_MASK)) &&
+9 −0
Original line number Diff line number Diff line
@@ -110,6 +110,15 @@ status_t Gralloc2Mapper::validateBufferDescriptorInfo(
              descriptorInfo->usage & ~validUsageBits);
        return BAD_VALUE;
    }

    // Gralloc2 implementations never understand non-BLOB with GPU_DATA_BUFFER
    // and do not reliably reject it.
    if (descriptorInfo->usage & BufferUsage::GPU_DATA_BUFFER &&
        descriptorInfo->format != hardware::graphics::common::V1_1::PixelFormat::BLOB) {
        ALOGE("gralloc2 does not support non-BLOB pixel formats with GPU_DATA_BUFFER usage");
        return BAD_VALUE;
    }

    return NO_ERROR;
}

+9 −0
Original line number Diff line number Diff line
@@ -101,6 +101,15 @@ status_t Gralloc3Mapper::validateBufferDescriptorInfo(
              descriptorInfo->usage & ~validUsageBits);
        return BAD_VALUE;
    }

    // Gralloc3 implementations never understand non-BLOB with GPU_DATA_BUFFER
    // and do not reliably reject it.
    if (descriptorInfo->usage & BufferUsage::GPU_DATA_BUFFER &&
        descriptorInfo->format != hardware::graphics::common::V1_2::PixelFormat::BLOB) {
        ALOGE("gralloc3 does not support non-BLOB pixel formats with GPU_DATA_BUFFER usage");
        return BAD_VALUE;
    }

    return NO_ERROR;
}

+11 −0
Original line number Diff line number Diff line
@@ -41,6 +41,7 @@ using aidl::android::hardware::graphics::common::StandardMetadataType;
using android::hardware::hidl_vec;
using android::hardware::graphics::allocator::V4_0::IAllocator;
using android::hardware::graphics::common::V1_2::BufferUsage;
using android::hardware::graphics::common::V1_2::PixelFormat;
using android::hardware::graphics::mapper::V4_0::BufferDescriptor;
using android::hardware::graphics::mapper::V4_0::Error;
using android::hardware::graphics::mapper::V4_0::IMapper;
@@ -120,6 +121,16 @@ static status_t validateBufferDescriptorInfo(IMapper::BufferDescriptorInfo* desc
              descriptorInfo->usage & ~validUsageBits);
        return BAD_VALUE;
    }

    // Combinations that are only allowed with gralloc 4.1.
    // Previous grallocs must be protected from this.
    if (!hasIAllocatorAidl() &&
            descriptorInfo->format != hardware::graphics::common::V1_2::PixelFormat::BLOB &&
            descriptorInfo->usage & BufferUsage::GPU_DATA_BUFFER) {
        ALOGE("non-BLOB pixel format with GPU_DATA_BUFFER usage is not supported prior to gralloc 4.1");
        return BAD_VALUE;
    }

    return NO_ERROR;
}