From f0f54d8b7c6d1fbfb202cfa84a0ff21ac0fa47c1 Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Wed, 10 Feb 2016 16:01:58 +0100 Subject: GetStringUTFChars() may fail GetStringUTFChars() can fail, returning NULL. Make sure we do not trip over it. Change-Id: I2d6b9c72c353c2423042fd035087f0d57fdc08ca Signed-off-by: Robert Varga --- vpp-japi/japi/vppjni.c | 66 +++++++++++++++++++++++++++++++------------------- 1 file changed, 41 insertions(+), 25 deletions(-) diff --git a/vpp-japi/japi/vppjni.c b/vpp-japi/japi/vppjni.c index 3c80ff9240c..af0d64cd15c 100644 --- a/vpp-japi/japi/vppjni.c +++ b/vpp-japi/japi/vppjni.c @@ -265,8 +265,10 @@ JNIEXPORT jstring JNICALL Java_org_openvpp_vppjapi_vppConn_getInterfaceDescripti vppjni_main_t * jm = &vppjni_main; u32 sw_if_index = ~0; uword * p; - const char *if_name_str = (*env)->GetStringUTFChars (env, ifName, 0); jstring ifDesc = NULL; + const char *if_name_str = (*env)->GetStringUTFChars (env, ifName, 0); + if (!if_name_str) + return NULL; vppjni_lock (jm, 24); p = hash_get_mem (jm->sw_if_index_by_interface_name, if_name_str); @@ -310,14 +312,16 @@ JNIEXPORT jint JNICALL Java_org_openvpp_vppjapi_vppConn_clientConnect if (jm->is_connected) return -2; + client_name = (*env)->GetStringUTFChars(env, clientName, 0); + if (!client_name) + return -3; + if (jm->heap == 0) clib_mem_init (0, 128<<20); heap = clib_mem_get_per_cpu_heap(); h = mheap_header (heap); - client_name = (*env)->GetStringUTFChars (env, clientName, 0); - clib_time_init (&jm->clib_time); rv = connect_to_vpe ((char *) client_name); @@ -471,9 +475,11 @@ JNIEXPORT jstring JNICALL Java_org_openvpp_vppjapi_vppConn_getInterfaceList0 hash_pair_t * p; name_sort_t * nses = 0, * ns; const char *this_name; - const char * nf = (*env)->GetStringUTFChars (env, name_filter, NULL); u8 * s = 0; char *strcasestr (const char *, const char *); + const char * nf = (*env)->GetStringUTFChars (env, name_filter, NULL); + if (!nf) + return NULL; vppjni_lock (jm, 4); @@ -512,18 +518,20 @@ JNIEXPORT jint JNICALL Java_org_openvpp_vppjapi_vppConn_swIfIndexFromName0 vppjni_main_t * jm = &vppjni_main; jint rv = -1; const char * if_name = (*env)->GetStringUTFChars (env, interfaceName, NULL); - uword * p; + if (if_name) { + uword * p; - vppjni_lock (jm, 5); + vppjni_lock (jm, 5); - p = hash_get_mem (jm->sw_if_index_by_interface_name, if_name); + p = hash_get_mem (jm->sw_if_index_by_interface_name, if_name); - if (p != 0) - rv = (jint) p[0]; + if (p != 0) + rv = (jint) p[0]; - vppjni_unlock (jm); + vppjni_unlock (jm); - (*env)->ReleaseStringUTFChars (env, interfaceName, if_name); + (*env)->ReleaseStringUTFChars (env, interfaceName, if_name); + } return rv; } @@ -717,18 +725,20 @@ JNIEXPORT jint JNICALL Java_org_openvpp_vppjapi_vppConn_findOrAddBridgeDomainId0 (JNIEnv * env, jobject obj, jstring bridgeDomain) { vppjni_main_t * jm = &vppjni_main; - static u8 * bd_name = 0; jint rv = -1; const char * bdName = (*env)->GetStringUTFChars (env, bridgeDomain, NULL); + if (bdName) { + static u8 * bd_name = 0; - vec_validate_init_c_string (bd_name, bdName, strlen(bdName)); - (*env)->ReleaseStringUTFChars (env, bridgeDomain, bdName); + vec_validate_init_c_string (bd_name, bdName, strlen(bdName)); + (*env)->ReleaseStringUTFChars (env, bridgeDomain, bdName); - vppjni_lock (jm, 6); - rv = (jint)vjbd_find_or_add_bd (&jm->vjbd_main, bd_name); - vppjni_unlock (jm); + vppjni_lock (jm, 6); + rv = (jint)vjbd_find_or_add_bd (&jm->vjbd_main, bd_name); + vppjni_unlock (jm); - _vec_len(bd_name) = 0; + _vec_len(bd_name) = 0; + } return rv; } @@ -736,18 +746,20 @@ JNIEXPORT jint JNICALL Java_org_openvpp_vppjapi_vppConn_bridgeDomainIdFromName0 (JNIEnv * env, jobject obj, jstring bridgeDomain) { vppjni_main_t * jm = &vppjni_main; - static u8 * bd_name = 0; jint rv = -1; const char * bdName = (*env)->GetStringUTFChars (env, bridgeDomain, NULL); + if (bdName) { + static u8 * bd_name = 0; - vec_validate_init_c_string (bd_name, bdName, strlen(bdName)); - (*env)->ReleaseStringUTFChars (env, bridgeDomain, bdName); + vec_validate_init_c_string (bd_name, bdName, strlen(bdName)); + (*env)->ReleaseStringUTFChars (env, bridgeDomain, bdName); - vppjni_lock (jm, 20); - rv = (jint)vjbd_id_from_name(&jm->vjbd_main, (u8 *)bd_name); - vppjni_unlock (jm); + vppjni_lock (jm, 20); + rv = (jint)vjbd_id_from_name(&jm->vjbd_main, (u8 *)bd_name); + vppjni_unlock (jm); - _vec_len(bd_name) = 0; + _vec_len(bd_name) = 0; + } return rv; } @@ -1278,6 +1290,10 @@ static int ipAddressDump } if_name = (*env)->GetStringUTFChars (env, interfaceName, NULL); + if (!if_name) { + return -1; + } + p = hash_get_mem (jm->sw_if_index_by_interface_name, if_name); (*env)->ReleaseStringUTFChars (env, interfaceName, if_name); if (p == 0) { -- cgit 1.2.3-korg