diff options
author | Scott Lobdell <slobdell@google.com> | 2021-04-08 04:26:21 +0000 |
---|---|---|
committer | Scott Lobdell <slobdell@google.com> | 2021-04-08 04:26:21 +0000 |
commit | 95a4eaee873adf20b90a1d3d74c650c96a9271f2 (patch) | |
tree | 47c85878a2730bd38bffb1ee4c138764e4a57479 /audio/effect/all-versions/default/util/EffectUtils.cpp | |
parent | 0c2e5fb06bd4257044c4761e89705268421c77b3 (diff) | |
parent | aa0540c86a939e6c0f63e17d13d2aed3d9b53777 (diff) |
Merge SP1A.210407.002
Change-Id: I59c8a9fe4c458698011cf3ced77bcd2c4818a138
Diffstat (limited to 'audio/effect/all-versions/default/util/EffectUtils.cpp')
-rw-r--r-- | audio/effect/all-versions/default/util/EffectUtils.cpp | 54 |
1 files changed, 30 insertions, 24 deletions
diff --git a/audio/effect/all-versions/default/util/EffectUtils.cpp b/audio/effect/all-versions/default/util/EffectUtils.cpp index b4382dc2d6..1156d211a1 100644 --- a/audio/effect/all-versions/default/util/EffectUtils.cpp +++ b/audio/effect/all-versions/default/util/EffectUtils.cpp @@ -25,8 +25,6 @@ #include "util/EffectUtils.h" -#define ARRAY_SIZE(a) (sizeof(a) / sizeof(*(a))) - using ::android::hardware::audio::common::CPP_VERSION::implementation::HidlUtils; using ::android::hardware::audio::common::CPP_VERSION::implementation::UuidUtils; using ::android::hardware::audio::common::utils::EnumBitfield; @@ -154,6 +152,29 @@ status_t EffectUtils::effectConfigToHal(const EffectConfig& config, effect_confi return result; } +template <std::size_t N> +inline hidl_string charBufferFromHal(const char (&halBuf)[N]) { + // Even if the original field contains a non-terminated string, hidl_string + // adds a NUL terminator. + return hidl_string(halBuf, strnlen(halBuf, N)); +} + +template <std::size_t N> +inline status_t charBufferToHal(const hidl_string& str, char (&halBuf)[N], const char* fieldName) { + static_assert(N > 0); + const size_t halBufChars = N - 1; // Reserve one character for terminating NUL. + status_t result = NO_ERROR; + size_t strSize = str.size(); + if (strSize > halBufChars) { + ALOGE("%s is too long: %zu (%zu max)", fieldName, strSize, halBufChars); + strSize = halBufChars; + result = BAD_VALUE; + } + strncpy(halBuf, str.c_str(), strSize); + halBuf[strSize] = '\0'; + return result; +} + status_t EffectUtils::effectDescriptorFromHal(const effect_descriptor_t& halDescriptor, EffectDescriptor* descriptor) { UuidUtils::uuidFromHal(halDescriptor.type, &descriptor->type); @@ -166,9 +187,8 @@ status_t EffectUtils::effectDescriptorFromHal(const effect_descriptor_t& halDesc memcpy(descriptor->implementor.data(), halDescriptor.implementor, descriptor->implementor.size()); #else - descriptor->name = hidl_string(halDescriptor.name, ARRAY_SIZE(halDescriptor.name)); - descriptor->implementor = - hidl_string(halDescriptor.implementor, ARRAY_SIZE(halDescriptor.implementor)); + descriptor->name = charBufferFromHal(halDescriptor.name); + descriptor->implementor = charBufferFromHal(halDescriptor.implementor); #endif return NO_ERROR; } @@ -186,25 +206,11 @@ status_t EffectUtils::effectDescriptorToHal(const EffectDescriptor& descriptor, memcpy(halDescriptor->implementor, descriptor.implementor.data(), descriptor.implementor.size()); #else - // According to 'dumpEffectDescriptor' 'name' and 'implementor' must be NUL-terminated. - size_t nameSize = descriptor.name.size(); - if (nameSize >= ARRAY_SIZE(halDescriptor->name)) { - ALOGE("effect name is too long: %zu (%zu max)", nameSize, - ARRAY_SIZE(halDescriptor->name) - 1); - nameSize = ARRAY_SIZE(halDescriptor->name) - 1; - result = BAD_VALUE; - } - strncpy(halDescriptor->name, descriptor.name.c_str(), nameSize); - halDescriptor->name[nameSize] = '\0'; - size_t implementorSize = descriptor.implementor.size(); - if (implementorSize >= ARRAY_SIZE(halDescriptor->implementor)) { - ALOGE("effect implementor is too long: %zu (%zu max)", implementorSize, - ARRAY_SIZE(halDescriptor->implementor) - 1); - implementorSize = ARRAY_SIZE(halDescriptor->implementor) - 1; - result = BAD_VALUE; - } - strncpy(halDescriptor->implementor, descriptor.implementor.c_str(), implementorSize); - halDescriptor->implementor[implementorSize] = '\0'; + // According to 'dumpEffectDescriptor', 'name' and 'implementor' must be NUL-terminated. + CONVERT_CHECKED(charBufferToHal(descriptor.name, halDescriptor->name, "effect name"), result); + CONVERT_CHECKED(charBufferToHal(descriptor.implementor, halDescriptor->implementor, + "effect implementor"), + result); #endif return result; } |