From 737d9fb181ec12a23934f7de4e3f8ded79486b1e Mon Sep 17 00:00:00 2001 From: Andy Hung Date: Tue, 16 Aug 2016 18:38:49 -0700 Subject: [PATCH] AudioSystem: Verify audio port array information Bug: 30737845 Change-Id: Id092086862bc527fccc5e9f34c8a3ab16167ae92 --- core/jni/android_media_AudioSystem.cpp | 43 ++++++++++++++++++++++++-- 1 file changed, 41 insertions(+), 2 deletions(-) diff --git a/core/jni/android_media_AudioSystem.cpp b/core/jni/android_media_AudioSystem.cpp index ef16ef5055de4..497600212095c 100644 --- a/core/jni/android_media_AudioSystem.cpp +++ b/core/jni/android_media_AudioSystem.cpp @@ -20,13 +20,14 @@ #define LOG_TAG "AudioSystem-JNI" #include +#include #include #include #include "core_jni_helpers.h" #include #include - +#include #include #include #include "android_media_AudioFormat.h" @@ -903,6 +904,12 @@ static bool hasFormat(int* formats, size_t size, int format) { return false; // not found } +// TODO: pull out to separate file +template +static constexpr size_t array_size(const T (&)[N]) { + return N; +} + static jint convertAudioPortFromNative(JNIEnv *env, jobject *jAudioPort, const struct audio_port *nAudioPort) { @@ -923,6 +930,38 @@ static jint convertAudioPortFromNative(JNIEnv *env, ALOGV("convertAudioPortFromNative id %d role %d type %d name %s", nAudioPort->id, nAudioPort->role, nAudioPort->type, nAudioPort->name); + // Verify audio port array count info. + if (nAudioPort->num_sample_rates > array_size(nAudioPort->sample_rates) + || nAudioPort->num_channel_masks > array_size(nAudioPort->channel_masks) + || nAudioPort->num_formats > array_size(nAudioPort->formats) + || nAudioPort->num_gains > array_size(nAudioPort->gains)) { + + std::stringstream ss; + ss << "convertAudioPortFromNative array count out of bounds:" + << " num_sample_rates " << nAudioPort->num_sample_rates + << " num_channel_masks " << nAudioPort->num_channel_masks + << " num_formats " << nAudioPort->num_formats + << " num_gains " << nAudioPort->num_gains + ; + std::string s = ss.str(); + + // Prefer to log through Java wtf instead of native ALOGE. + ScopedLocalRef jLogClass(env, env->FindClass("android/util/Log")); + jmethodID jWtfId = (jLogClass.get() == nullptr) + ? nullptr + : env->GetStaticMethodID(jLogClass.get(), "wtf", + "(Ljava/lang/String;Ljava/lang/String;)I"); + if (jWtfId != nullptr) { + ScopedLocalRef jMessage(env, env->NewStringUTF(s.c_str())); + ScopedLocalRef jTag(env, env->NewStringUTF(LOG_TAG)); + (void)env->CallStaticIntMethod(jLogClass.get(), jWtfId, jTag.get(), jMessage.get()); + } else { + ALOGE("%s", s.c_str()); + } + jStatus = (jint)AUDIO_JAVA_ERROR; + goto exit; + } + jSamplingRates = env->NewIntArray(nAudioPort->num_sample_rates); if (jSamplingRates == NULL) { jStatus = (jint)AUDIO_JAVA_ERROR; @@ -1066,7 +1105,7 @@ static jint convertAudioPortFromNative(JNIEnv *env, &jAudioPortConfig, &nAudioPort->active_config); if (jStatus != AUDIO_JAVA_SUCCESS) { - return jStatus; + goto exit; } env->SetObjectField(*jAudioPort, gAudioPortFields.mActiveConfig, jAudioPortConfig);