summaryrefslogtreecommitdiffstats
path: root/jni
diff options
context:
space:
mode:
authorAyan Ghosh <abghosh@codeaurora.org>2014-09-04 19:38:09 +0530
committerLinux Build Service Account <lnxbuild@localhost>2014-11-04 08:25:38 -0700
commit346bfa2d09406a17aa61aea2fc1e306b960ec063 (patch)
treebf87fc1b15651274c6c96db2c513f5b720f69a55 /jni
parent734cbb997ebe3c023574ccbc9199e0906db50eda (diff)
downloadandroid_packages_apps_Bluetooth-346bfa2d09406a17aa61aea2fc1e306b960ec063.tar.gz
android_packages_apps_Bluetooth-346bfa2d09406a17aa61aea2fc1e306b960ec063.tar.bz2
android_packages_apps_Bluetooth-346bfa2d09406a17aa61aea2fc1e306b960ec063.zip
Proper error handling in Avrcp Browsing
- Return proper error code based on players unavailability and feature mask support. - Free Attribute List only if it has valid content - Copy complete string while passing it to stack. CRs-Fixed: 719566 700753 Change-Id: I89fc671146b1dafd31ad3f1c629e248c285184b4
Diffstat (limited to 'jni')
-rw-r--r--jni/com_android_bluetooth_avrcp.cpp35
1 files changed, 19 insertions, 16 deletions
diff --git a/jni/com_android_bluetooth_avrcp.cpp b/jni/com_android_bluetooth_avrcp.cpp
index 4a26de087..903fd961a 100644
--- a/jni/com_android_bluetooth_avrcp.cpp
+++ b/jni/com_android_bluetooth_avrcp.cpp
@@ -1174,9 +1174,9 @@ static jboolean getFolderItemsRspNative(JNIEnv *env, jobject object, jbyte statu
}
param.p_item_list[count].u.folder.name.charset_id = BTRC_CHARSET_UTF8;
param.p_item_list[count].u.folder.name.str_len = utfStringLength;
- param.p_item_list[count].u.folder.name.p_str = new uint8_t[utfStringLength];
+ param.p_item_list[count].u.folder.name.p_str = new uint8_t[utfStringLength + 1];
strlcpy((char *)param.p_item_list[count].u.folder.name.p_str, textStr,
- utfStringLength);
+ utfStringLength + 1);
env->ReleaseStringUTFChars(text, textStr);
env->DeleteLocalRef(text);
} else if (itemTypeElements[count] == BTRC_TYPE_MEDIA_ELEMENT) {
@@ -1202,9 +1202,9 @@ static jboolean getFolderItemsRspNative(JNIEnv *env, jobject object, jbyte statu
}
param.p_item_list[count].u.media.name.charset_id = BTRC_CHARSET_UTF8;
param.p_item_list[count].u.media.name.str_len = utfStringLength;
- param.p_item_list[count].u.media.name.p_str = new uint8_t[utfStringLength];
+ param.p_item_list[count].u.media.name.p_str = new uint8_t[utfStringLength + 1];
strlcpy((char *)param.p_item_list[count].u.media.name.p_str, textStr,
- utfStringLength);
+ utfStringLength + 1);
env->ReleaseStringUTFChars(text, textStr);
env->DeleteLocalRef(text);
ALOGI("getFolderItemsRspNative: numAttr: %d", numAttElements[count]);
@@ -1236,9 +1236,9 @@ static jboolean getFolderItemsRspNative(JNIEnv *env, jobject object, jbyte statu
ALOGI("getFolderItemsRspNative: Attr Length: %d",
param.p_item_list[count].u.media.p_attr_list[num_attr].name.str_len);
param.p_item_list[count].u.media.p_attr_list[num_attr].name.p_str =
- new uint8_t[utfStringLength];
+ new uint8_t[utfStringLength + 1];
strlcpy((char *)param.p_item_list[count].u.media.p_attr_list[num_attr].
- name.p_str, textStr, utfStringLength);
+ name.p_str, textStr, utfStringLength + 1);
num_attr++;
env->ReleaseStringUTFChars(text, textStr);
env->DeleteLocalRef(text);
@@ -1253,12 +1253,15 @@ static jboolean getFolderItemsRspNative(JNIEnv *env, jobject object, jbyte statu
ALOGE("Failed get_folder_items_rsp, status: %u", status);
}
- env->ReleaseIntArrayElements(itemType, itemTypeElements, 0);
- env->ReleaseLongArrayElements(uid, uidElements, 0);
- env->ReleaseIntArrayElements(type, typeElements, 0);
- env->ReleaseByteArrayElements(playable, playableElements, 0);
- env->ReleaseByteArrayElements(numAtt, numAttElements, 0);
- env->ReleaseIntArrayElements(attIds, attIdsElements, 0);
+
+ if (numItems > 0) {
+ env->ReleaseIntArrayElements(itemType, itemTypeElements, 0);
+ env->ReleaseLongArrayElements(uid, uidElements, 0);
+ env->ReleaseIntArrayElements(type, typeElements, 0);
+ env->ReleaseByteArrayElements(playable, playableElements, 0);
+ env->ReleaseByteArrayElements(numAtt, numAttElements, 0);
+ env->ReleaseIntArrayElements(attIds, attIdsElements, 0);
+ }
return (status == BT_STATUS_SUCCESS) ? JNI_TRUE : JNI_FALSE;
}
@@ -1432,10 +1435,10 @@ static jboolean getItemAttrRspNative(JNIEnv *env, jobject object, jbyte numAttr,
pAttrs[i].attr_id = attr[i];
if (utfStringLength >= BTRC_MAX_ATTR_STR_LEN) {
ALOGE("get_item_attr_rsp: string length exceed maximum");
- strlcpy((char *)pAttrs[i].text, textStr, BTRC_MAX_ATTR_STR_LEN-1);
+ strlcpy((char *)pAttrs[i].text, textStr, BTRC_MAX_ATTR_STR_LEN);
pAttrs[i].text[BTRC_MAX_ATTR_STR_LEN-1] = 0;
} else {
- strlcpy((char *)pAttrs[i].text, textStr, utfStringLength);
+ strlcpy((char *)pAttrs[i].text, textStr, utfStringLength + 1);
}
env->ReleaseStringUTFChars(text, textStr);
env->DeleteLocalRef(text);
@@ -1504,8 +1507,8 @@ static jboolean setBrowsedPlayerRspNative(JNIEnv *env, jobject object,
}
param.p_folders[count].str_len = utfStringLength;
- param.p_folders[count].p_str = new uint8_t[utfStringLength];
- strlcpy((char *)param.p_folders[count].p_str, textStr, utfStringLength);
+ param.p_folders[count].p_str = new uint8_t[utfStringLength + 1];
+ strlcpy((char *)param.p_folders[count].p_str, textStr, utfStringLength + 1);
env->ReleaseStringUTFChars(text, textStr);
env->DeleteLocalRef(text);