diff options
| author | 2023-05-23 22:33:58 +0000 | |
|---|---|---|
| committer | 2023-05-23 22:33:58 +0000 | |
| commit | 0748ac53910373f21e97bf58de9d88dcb39cd514 (patch) | |
| tree | b8d8d2868b13b09ffc092a3ea03658f8d2b55564 | |
| parent | 74a75503afbab23e1221af91c0b4b6cec0cbd429 (diff) | |
| parent | b037505a7f789a57decac7828337324866961dcf (diff) | |
Merge "ultrahdr: Add argument check for decoder api" into udc-dev
| -rw-r--r-- | libs/ultrahdr/include/ultrahdr/ultrahdr.h | 2 | ||||
| -rw-r--r-- | libs/ultrahdr/jpegr.cpp | 26 | ||||
| -rw-r--r-- | libs/ultrahdr/tests/jpegr_test.cpp | 39 | 
3 files changed, 65 insertions, 2 deletions
| diff --git a/libs/ultrahdr/include/ultrahdr/ultrahdr.h b/libs/ultrahdr/include/ultrahdr/ultrahdr.h index e87a025867..d6153e9890 100644 --- a/libs/ultrahdr/include/ultrahdr/ultrahdr.h +++ b/libs/ultrahdr/include/ultrahdr/ultrahdr.h @@ -39,10 +39,12 @@ typedef enum {  // Target output formats for decoder  typedef enum { +  ULTRAHDR_OUTPUT_UNSPECIFIED = -1,    ULTRAHDR_OUTPUT_SDR,          // SDR in RGBA_8888 color format    ULTRAHDR_OUTPUT_HDR_LINEAR,   // HDR in F16 color format (linear)    ULTRAHDR_OUTPUT_HDR_PQ,       // HDR in RGBA_1010102 color format (PQ transfer function)    ULTRAHDR_OUTPUT_HDR_HLG,      // HDR in RGBA_1010102 color format (HLG transfer function) +  ULTRAHDR_OUTPUT_MAX = ULTRAHDR_OUTPUT_HDR_HLG,  } ultrahdr_output_format;  /* diff --git a/libs/ultrahdr/jpegr.cpp b/libs/ultrahdr/jpegr.cpp index 78fa2af4b8..5ebca399a9 100644 --- a/libs/ultrahdr/jpegr.cpp +++ b/libs/ultrahdr/jpegr.cpp @@ -476,12 +476,34 @@ status_t JpegR::decodeJPEGR(jr_compressed_ptr compressed_jpegr_image,                              ultrahdr_output_format output_format,                              jr_uncompressed_ptr gain_map,                              ultrahdr_metadata_ptr metadata) { -  if (compressed_jpegr_image == nullptr || dest == nullptr) { +  if (compressed_jpegr_image == nullptr || compressed_jpegr_image->data == nullptr) { +    ALOGE("received nullptr for compressed jpegr image"); +    return ERROR_JPEGR_INVALID_NULL_PTR; +  } + +  if (dest == nullptr || dest->data == nullptr) { +    ALOGE("received nullptr for dest image");      return ERROR_JPEGR_INVALID_NULL_PTR;    }    if (max_display_boost < 1.0f) { -      return ERROR_JPEGR_INVALID_INPUT_TYPE; +    ALOGE("received bad value for max_display_boost %f", max_display_boost); +    return ERROR_JPEGR_INVALID_INPUT_TYPE; +  } + +  if (exif != nullptr && exif->data == nullptr) { +    ALOGE("received nullptr address for exif data"); +    return ERROR_JPEGR_INVALID_INPUT_TYPE; +  } + +  if (output_format <= ULTRAHDR_OUTPUT_UNSPECIFIED || output_format > ULTRAHDR_OUTPUT_MAX) { +    ALOGE("received bad value for output format %d", output_format); +    return ERROR_JPEGR_INVALID_INPUT_TYPE; +  } + +  if (gain_map != nullptr && gain_map->data == nullptr) { +    ALOGE("received nullptr address for gain map data"); +    return ERROR_JPEGR_INVALID_INPUT_TYPE;    }    if (output_format == ULTRAHDR_OUTPUT_SDR) { diff --git a/libs/ultrahdr/tests/jpegr_test.cpp b/libs/ultrahdr/tests/jpegr_test.cpp index ac358872b4..5f5c19684b 100644 --- a/libs/ultrahdr/tests/jpegr_test.cpp +++ b/libs/ultrahdr/tests/jpegr_test.cpp @@ -769,6 +769,45 @@ TEST_F(JpegRTest, encodeAPI4ForInvalidArgs) {    free(jpegR.data);  } +/* Test Decode API invalid arguments */ +TEST_F(JpegRTest, decodeAPIForInvalidArgs) { +  int ret; + +  // we are not really compressing anything so lets keep allocs to a minimum +  jpegr_compressed_struct jpegR; +  jpegR.maxLength = 16 * sizeof(uint8_t); +  jpegR.data = malloc(jpegR.maxLength); + +  // we are not really decoding anything so lets keep allocs to a minimum +  mRawP010Image.data = malloc(16); + +  JpegR jpegRCodec; + +  // test jpegr image +  EXPECT_NE(OK, jpegRCodec.decodeJPEGR( +        nullptr, &mRawP010Image)) << "fail, API allows nullptr for jpegr img"; + +  // test dest image +  EXPECT_NE(OK, jpegRCodec.decodeJPEGR( +        &jpegR, nullptr)) << "fail, API allows nullptr for dest"; + +  // test max display boost +  EXPECT_NE(OK, jpegRCodec.decodeJPEGR( +        &jpegR, &mRawP010Image, 0.5)) << "fail, API allows invalid max display boost"; + +  // test output format +  EXPECT_NE(OK, jpegRCodec.decodeJPEGR( +        &jpegR, &mRawP010Image, 0.5, nullptr, +        static_cast<ultrahdr_output_format>(-1))) << "fail, API allows invalid output format"; + +  EXPECT_NE(OK, jpegRCodec.decodeJPEGR( +        &jpegR, &mRawP010Image, 0.5, nullptr, +        static_cast<ultrahdr_output_format>(ULTRAHDR_OUTPUT_MAX + 1))) +        << "fail, API allows invalid output format"; + +  free(jpegR.data); +} +  TEST_F(JpegRTest, writeXmpThenRead) {    ultrahdr_metadata_struct metadata_expected;    metadata_expected.version = "1.0"; |