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 | |
| 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
| -rw-r--r-- | service/java/com/android/server/wifi/WifiNative.java | 51 | ||||
| -rw-r--r-- | service/java/com/android/server/wifi/WifiScanningServiceImpl.java | 7 | ||||
| -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 |
5 files changed, 100 insertions, 20 deletions
diff --git a/service/java/com/android/server/wifi/WifiNative.java b/service/java/com/android/server/wifi/WifiNative.java index 46d21c56d..e952d8ddc 100644 --- a/service/java/com/android/server/wifi/WifiNative.java +++ b/service/java/com/android/server/wifi/WifiNative.java @@ -40,11 +40,16 @@ import com.android.server.connectivity.KeepalivePacketData; import java.io.ByteArrayOutputStream; import java.io.IOException; +import java.nio.ByteBuffer; +import java.nio.CharBuffer; +import java.nio.charset.CharacterCodingException; +import java.nio.charset.CharsetDecoder; +import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.List; import java.util.Locale; import java.util.zip.Deflater; - +import libcore.util.HexEncoding; /** * Native calls for bring up/shut down of the supplicant daemon and for * sending requests to the supplicant daemon @@ -1403,6 +1408,46 @@ public class WifiNative { } } + public static WifiSsid createWifiSsid (byte[] rawSsid) { + String ssidHexString = String.valueOf(HexEncoding.encode(rawSsid)); + + if (ssidHexString == null) { + return null; + } + + WifiSsid wifiSsid = WifiSsid.createFromHex(ssidHexString); + + return wifiSsid; + } + + public static String ssidConvert(byte[] rawSsid) { + String ssid; + + CharsetDecoder decoder = StandardCharsets.UTF_8.newDecoder(); + try { + CharBuffer decoded = decoder.decode(ByteBuffer.wrap(rawSsid)); + ssid = decoded.toString(); + } catch (CharacterCodingException cce) { + ssid = null; + } + + if (ssid == null) { + ssid = new String(rawSsid, StandardCharsets.ISO_8859_1); + } + + return ssid; + } + + public static boolean setSsid(byte[] rawSsid, ScanResult result) { + if (rawSsid == null || rawSsid.length == 0 || result == null) { + return false; + } + + result.SSID = ssidConvert(rawSsid); + result.wifiSsid = createWifiSsid(rawSsid); + return true; + } + static void populateScanResult(ScanResult result, byte bytes[], String dbg) { int num = 0; if (bytes == null) return; @@ -1829,10 +1874,10 @@ public class WifiNative { if (cancelRangeRequestNative(sWlan0Index, sRttCmdId, params)) { sRttEventHandler = null; - Log.v(TAG, "Xin: RTT cancel Request Successfully"); + Log.v(TAG, "RTT cancel Request Successfully"); return true; } else { - Log.e(TAG, "Xin:RTT cancel Request failed"); + Log.e(TAG, "RTT cancel Request failed"); return false; } } else { diff --git a/service/java/com/android/server/wifi/WifiScanningServiceImpl.java b/service/java/com/android/server/wifi/WifiScanningServiceImpl.java index 25ffdd151..e7d3d3ac7 100644 --- a/service/java/com/android/server/wifi/WifiScanningServiceImpl.java +++ b/service/java/com/android/server/wifi/WifiScanningServiceImpl.java @@ -752,12 +752,7 @@ public class WifiScanningServiceImpl extends IWifiScanner.Stub { } for (ChannelSpec channelSpec : desiredChannels) { if (channelSpec.frequency == result.frequency) { - WifiSsid wifiSsid = WifiSsid.createFromAsciiEncoded(result.SSID); - ScanResult newResult = new ScanResult(wifiSsid, result.BSSID, "", - result.level, result.frequency, result.timestamp, - ScanResult.UNSPECIFIED, ScanResult.UNSPECIFIED,result.channelWidth, - result.centerFreq0, result.centerFreq1, - result.is80211mcResponder()); + ScanResult newResult = new ScanResult(result); if (DBG) localLog("sending it to " + handler); newResult.informationElements = result.informationElements.clone(); mChannel.sendMessage( 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__) |
