diff options
author | xin He <xinhe@google.com> | 2015-08-05 01:17:59 +0000 |
---|---|---|
committer | Android Git Automerger <android-git-automerger@android.com> | 2015-08-05 01:17:59 +0000 |
commit | 0cc09187b578a328f945cd58f0c030c4b713d37e (patch) | |
tree | d349989f1ef6d729568607c32872a45e22ee1ec3 /service/jni | |
parent | a7e4384d748dcb5d46fe6343288681c43f5d3055 (diff) | |
parent | 69a99c03a9c78a507266c18443dc044a7b3e7869 (diff) | |
download | android_frameworks_opt_net_wifi-0cc09187b578a328f945cd58f0c030c4b713d37e.tar.gz android_frameworks_opt_net_wifi-0cc09187b578a328f945cd58f0c030c4b713d37e.tar.bz2 android_frameworks_opt_net_wifi-0cc09187b578a328f945cd58f0c030c4b713d37e.zip |
am 69a99c03: Merge "Boot loop when SSID has non UTF-8 character in the name" into mnc-dev
* commit '69a99c03a9c78a507266c18443dc044a7b3e7869':
Boot loop when SSID has non UTF-8 character in the name
Diffstat (limited to 'service/jni')
-rw-r--r-- | service/jni/com_android_server_wifi_WifiNative.cpp | 45 | ||||
-rw-r--r-- | service/jni/jni_helper.cpp | 14 | ||||
-rw-r--r-- | service/jni/jni_helper.h | 3 |
3 files changed, 51 insertions, 11 deletions
diff --git a/service/jni/com_android_server_wifi_WifiNative.cpp b/service/jni/com_android_server_wifi_WifiNative.cpp index c48793622..567eac2c6 100644 --- a/service/jni/com_android_server_wifi_WifiNative.cpp +++ b/service/jni/com_android_server_wifi_WifiNative.cpp @@ -229,6 +229,28 @@ static wifi_interface_handle getIfaceHandle(JNIEnv *env, jclass cls, jint index) return (wifi_interface_handle) getStaticLongArrayField(env, cls, WifiIfaceHandleVarName, index); } +jboolean setSSIDField(JNIEnv *env, jobject obj, const char *rawSsid) { + + jmethodID methodID = env->GetStaticMethodID(mCls, "setSsid", "([BLandroid/net/wifi/ScanResult;)Z"); + if (methodID == NULL) { + ALOGE("Error in getting method ID setSsid"); + return false; + } + + int len = strlen(rawSsid); + + if (len > 0) { + jbyteArray ssidBytes = env->NewByteArray(len); + env->SetByteArrayRegion(ssidBytes, 0, len, (jbyte *) rawSsid); + jboolean ret = env->CallStaticBooleanMethod(mCls, methodID, ssidBytes, obj); + env->DeleteLocalRef(ssidBytes); + return ret; + } else { + //empty SSID or SSID start with \0 + return true; + } +} + static jobject createScanResult(JNIEnv *env, wifi_scan_result *result) { // ALOGD("creating scan result"); @@ -240,8 +262,11 @@ static jobject createScanResult(JNIEnv *env, wifi_scan_result *result) { } ALOGV("setting SSID to %s", result->ssid); - //jstring jssid = env->NewStringUTF(result->ssid); - setStringField(env, scanResult, "SSID", result->ssid); + + if(!setSSIDField(env, scanResult, result->ssid)) { + ALOGE("Error on set SSID"); + return NULL; + } char bssid[32]; sprintf(bssid, "%02x:%02x:%02x:%02x:%02x:%02x", result->bssid[0], result->bssid[1], @@ -613,8 +638,10 @@ static jobject android_net_wifi_getScanResults( return NULL; } - setStringField(env, scanResult, "SSID", results[j].ssid); - + if(!setSSIDField(env, scanResult, results[j].ssid)) { + ALOGE("Error on set SSID"); + return NULL; + } char bssid[32]; sprintf(bssid, "%02x:%02x:%02x:%02x:%02x:%02x", results[j].bssid[0], results[j].bssid[1], results[j].bssid[2], results[j].bssid[3], @@ -751,7 +778,10 @@ static void onHotlistApFound(wifi_request_id id, return; } - setStringField(env, scanResult, "SSID", results[i].ssid); + if(!setSSIDField(env, scanResult, results[i].ssid)) { + ALOGE("Can not set SSID"); + return; + } char bssid[32]; sprintf(bssid, "%02x:%02x:%02x:%02x:%02x:%02x", results[i].bssid[0], results[i].bssid[1], @@ -801,7 +831,10 @@ static void onHotlistApLost(wifi_request_id id, return; } - setStringField(env, scanResult, "SSID", results[i].ssid); + if(!setSSIDField(env, scanResult, results[i].ssid)) { + ALOGE("Error on set SSID"); + return; + } char bssid[32]; sprintf(bssid, "%02x:%02x:%02x:%02x:%02x:%02x", results[i].bssid[0], results[i].bssid[1], diff --git a/service/jni/jni_helper.cpp b/service/jni/jni_helper.cpp index 93d24146e..ef67391b5 100644 --- a/service/jni/jni_helper.cpp +++ b/service/jni/jni_helper.cpp @@ -417,17 +417,25 @@ void setObjectField(JNIEnv *env, jobject obj, const char *name, const char *type env->DeleteLocalRef(cls); } -void setStringField(JNIEnv *env, jobject obj, const char *name, const char *value) +jboolean setStringField(JNIEnv *env, jobject obj, const char *name, const char *value) { + jstring str = env->NewStringUTF(value); + if (env->ExceptionCheck()) { + env->ExceptionDescribe(); + env->ExceptionClear(); + return false; + } + if (str == NULL) { - THROW(env, "Error in accessing class"); - return; + ALOGE("Error in string allocation"); + return false; } setObjectField(env, obj, name, "Ljava/lang/String;", str); env->DeleteLocalRef(str); + return true; } void reportEvent(JNIEnv *env, jclass cls, const char *method, const char *signature, ...) diff --git a/service/jni/jni_helper.h b/service/jni/jni_helper.h index a3159f0e8..5393efec0 100644 --- a/service/jni/jni_helper.h +++ b/service/jni/jni_helper.h @@ -17,7 +17,7 @@ void setBooleanField(JNIEnv *env, jobject obj, const char *name, jboolean value) void setLongField(JNIEnv *env, jobject obj, const char *name, jlong value); void setLongArrayField(JNIEnv *env, jobject obj, const char *name, jlongArray value); void setLongArrayElement(JNIEnv *env, jobject obj, const char *name, int index, jlong value); -void setStringField(JNIEnv *env, jobject obj, const char *name, const char *value); +jboolean setStringField(JNIEnv *env, jobject obj, const char *name, const char *value); void reportEvent(JNIEnv *env, jclass cls, const char *method, const char *signature, ...); jobject createObject(JNIEnv *env, const char *className); jobjectArray createObjectArray(JNIEnv *env, const char *className, int size); @@ -32,5 +32,4 @@ jlong getStaticLongArrayField(JNIEnv *env, jclass cls, const char *name, int ind void setStaticLongArrayField(JNIEnv *env, jobject obj, const char *name, jlongArray value); void setStaticLongArrayField(JNIEnv *env, jclass obj, const char *name, jlongArray value); } - #define THROW(env, message) throwException(env, message, __LINE__) |