diff options
author | Eino-Ville Talvala <etalvala@google.com> | 2017-05-05 11:03:56 -0700 |
---|---|---|
committer | Eino-Ville Talvala <etalvala@google.com> | 2017-05-05 11:29:28 -0700 |
commit | 0b47c6ef73b7ca796b506c9b3feb50343863ce9c (patch) | |
tree | f8acff7ca9f030dc16283b51e62756ff64feb009 | |
parent | 49bc03cfdc9f748c53bd989a3aaf4cd7ec4f4692 (diff) | |
download | android_system_media-0b47c6ef73b7ca796b506c9b3feb50343863ce9c.tar.gz android_system_media-0b47c6ef73b7ca796b506c9b3feb50343863ce9c.tar.bz2 android_system_media-0b47c6ef73b7ca796b506c9b3feb50343863ce9c.zip |
Camera metadata: Fix validation alignment check, add more unit tests
- Add unit test to ensure validate_camera_metadata_structure correctly
reports VALIDATION_SHIFTED for all shifts
- Fix alignment validation bug found by unit test - need to offset
pointer on both sides of align check.
Test: New unit test passes, no camera CTS regression
Bug: 37980415
Change-Id: I08379bf3792b57c4eae129acc7aa4f22ab960657
-rw-r--r-- | camera/src/camera_metadata.c | 7 | ||||
-rw-r--r-- | camera/tests/camera_metadata_tests.cpp | 34 |
2 files changed, 38 insertions, 3 deletions
diff --git a/camera/src/camera_metadata.c b/camera/src/camera_metadata.c index c79f61c0..dc800860 100644 --- a/camera/src/camera_metadata.c +++ b/camera/src/camera_metadata.c @@ -420,13 +420,14 @@ int validate_camera_metadata_structure(const camera_metadata_t *metadata, }; for (size_t i = 0; i < sizeof(alignments)/sizeof(alignments[0]); ++i) { - uintptr_t aligned_ptr = ALIGN_TO(metadata, alignments[i].alignment); + uintptr_t aligned_ptr = ALIGN_TO((uintptr_t) metadata + alignmentOffset, + alignments[i].alignment); if ((uintptr_t)metadata + alignmentOffset != aligned_ptr) { ALOGE("%s: Metadata pointer is not aligned (actual %p, " - "expected %p) to type %s", + "expected %p, offset %" PRIuPTR ") to type %s", __FUNCTION__, metadata, - (void*)aligned_ptr, alignments[i].name); + (void*)aligned_ptr, alignmentOffset, alignments[i].name); return CAMERA_METADATA_VALIDATION_ERROR; } } diff --git a/camera/tests/camera_metadata_tests.cpp b/camera/tests/camera_metadata_tests.cpp index 121ce19a..bcebf2e1 100644 --- a/camera/tests/camera_metadata_tests.cpp +++ b/camera/tests/camera_metadata_tests.cpp @@ -1870,3 +1870,37 @@ TEST(camera_metadata, data_alignment) { } } } + +TEST(camera_metadata, buffer_alignment) { + // Verify that misaligned metadata buffers only fail VALIDATION_SHIFTED, nothing else + const size_t entry_capacity = 50; + const size_t data_capacity = 450; + const size_t offsetRange = 16; + const uint32_t validAlignment = 8; + + camera_metadata_t *m = NULL; + m = allocate_camera_metadata(entry_capacity, data_capacity); + + add_test_metadata(m, 15); + + size_t m_size = get_camera_metadata_size(m); + size_t dst_size = m_size + offsetRange; + uint8_t *dst = new uint8_t[dst_size]; + + for (size_t i = 0; i < offsetRange; i++) { + memset(dst, 0, dst_size); + memcpy(dst + i, m, m_size); + camera_metadata_t *m_shifted = (camera_metadata_t*)(dst + i); + + int err = validate_camera_metadata_structure(m_shifted, &m_size); + if (i % validAlignment == 0) { + ASSERT_EQ(OK, err) << "For alignment shift " << i << ", expected OK" ; + } else { + ASSERT_EQ(CAMERA_METADATA_VALIDATION_SHIFTED, err) << + "For alignment shift " << i << ", expected VALIDATION_SHIFTED" ; + } + } + + delete[] dst; + FINISH_USING_CAMERA_METADATA(m); +} |