summaryrefslogtreecommitdiffstats
path: root/service/jni
diff options
context:
space:
mode:
authorxinhe <xinhe@google.com>2015-07-28 16:34:37 -0700
committerxinhe <xinhe@google.com>2015-08-04 15:54:22 -0700
commit5cfd8d8b9f241dcad874125a1b5538ee0d6860fe (patch)
tree18e4f8704cae4ded7ba132cb6815cb6b6bddcb3a /service/jni
parenta142187a4cd133a193675caf419ea25423eeab85 (diff)
downloadandroid_frameworks_opt_net_wifi-5cfd8d8b9f241dcad874125a1b5538ee0d6860fe.tar.gz
android_frameworks_opt_net_wifi-5cfd8d8b9f241dcad874125a1b5538ee0d6860fe.tar.bz2
android_frameworks_opt_net_wifi-5cfd8d8b9f241dcad874125a1b5538ee0d6860fe.zip
Boot loop when SSID has non UTF-8 character in the name
b/22773761 Change-Id: I24e1579ff1aafde703d2090f93399fd5f299a75a
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 f7d3ca009..4291fd1a3 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__)