summaryrefslogtreecommitdiffstats
path: root/service/jni
diff options
context:
space:
mode:
authorxin He <xinhe@google.com>2015-08-05 01:17:59 +0000
committerAndroid Git Automerger <android-git-automerger@android.com>2015-08-05 01:17:59 +0000
commit0cc09187b578a328f945cd58f0c030c4b713d37e (patch)
treed349989f1ef6d729568607c32872a45e22ee1ec3 /service/jni
parenta7e4384d748dcb5d46fe6343288681c43f5d3055 (diff)
parent69a99c03a9c78a507266c18443dc044a7b3e7869 (diff)
downloadandroid_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.cpp45
-rw-r--r--service/jni/jni_helper.cpp14
-rw-r--r--service/jni/jni_helper.h3
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__)