summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEino-Ville Talvala <etalvala@google.com>2017-05-05 11:03:56 -0700
committerEino-Ville Talvala <etalvala@google.com>2017-05-05 11:29:28 -0700
commit0b47c6ef73b7ca796b506c9b3feb50343863ce9c (patch)
treef8acff7ca9f030dc16283b51e62756ff64feb009
parent49bc03cfdc9f748c53bd989a3aaf4cd7ec4f4692 (diff)
downloadandroid_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.c7
-rw-r--r--camera/tests/camera_metadata_tests.cpp34
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);
+}