1 votos

Obteniendo el error "ssid bytes size out of range" en Android 10 si el WiFi está activado

Tengo el OnePlus 7 Pro que se actualizó a Android 10. Desde entonces, el teléfono se reinicia aleatoriamente. Parece que está relacionado con el WiFi ya que los reinicios aleatorios casi nunca ocurren cuando el WiFi está apagado (independientemente de si está realmente conectado a una red o no)

Logcat:

Error: AndroidRuntime

*** FATAL EXCEPTION IN SYSTEM PROCESS: ClientModeImpl
java.lang.IllegalArgumentException: ssid bytes size out of range: 64
    at com.android.server.wifi.util.NativeUtil.decodeSsid(NativeUtil.java:278)
    at com.android.server.wifi.WifiScoreCard.computeHashLong(WifiScoreCard.java:588)
    at com.android.server.wifi.WifiScoreCard.access$100(WifiScoreCard.java:63)
    at com.android.server.wifi.WifiScoreCard$PerBssid.<init>(WifiScoreCard.java:380)
    at com.android.server.wifi.WifiScoreCard.lookupBssid(WifiScoreCard.java:530)
    at com.android.server.wifi.WifiCandidates.add(WifiCandidates.java:374)
    at com.android.server.wifi.WifiCandidates.add(WifiCandidates.java:393)
    at com.android.server.wifi.WifiNetworkSelector.lambda$selectNetwork$0$WifiNetworkSelector(WifiNetworkSelector.java:911)
    at com.android.server.wifi.-$$Lambda$WifiNetworkSelector$Z7htivbXF5AzGeTh0ZNbtUXC_0Q.onConnectable(Unknown Source:15)
    at com.android.server.wifi.SavedNetworkEvaluator.evaluateNetworks(SavedNetworkEvaluator.java:279)
    at com.android.server.wifi.WifiNetworkSelector.selectNetwork(WifiNetworkSelector.java:900)
    at com.android.server.wifi.WifiConnectivityManager.handleScanResults(WifiConnectivityManager.java:342)
    at com.android.server.wifi.WifiConnectivityManager.access$900(WifiConnectivityManager.java:73)
    at com.android.server.wifi.WifiConnectivityManager$AllSingleScanListener.onResults(WifiConnectivityManager.java:425)
    at android.net.wifi.WifiScanner$ServiceHandler.handleMessage(WifiScanner.java:1429)
    at android.os.Handler.dispatchMessage(Handler.java:107)
    at android.os.Looper.loop(Looper.java:214)
    at android.os.HandlerThread.run(HandlerThread.java:67)

PID: 28683
TID: 28862

The following error message says:

FATAL EXCEPTION: main
Process: com.google.android.gms.persistent, PID: 30417
DeadSystemException: The system died; earlier logs will point to the root cause

Esto es consistente y el mismo error exacto aparece cada vez que el sistema se bloquea/reinicia.

¿Por qué y cómo solucionar este problema?

0voto

Andrew T. Puntos 2107

El mensaje de error es causado por SSIDs que contienen más de 32 bytes.

Según el Wikipedia ,

A diferencia de los identificadores de conjunto de servicios básicos, los SSID suelen ser personalizables. Estos SSID pueden tener una longitud de cero a 32 octetos (32 bytes) y, por comodidad, suelen estar en un idioma natural, como el inglés. Los estándares 802.11 anteriores a la edición de 2012 no definían ninguna codificación/representación particular para los SSID, que se esperaba que fueran tratados y manejados como una secuencia arbitraria de 0-32 octetos que no se limitan a caracteres imprimibles. La norma IEEE 802.11-2012 define una etiqueta en la que el SSID está codificado en UTF-8 y, al interpretarlo, puede contener cualquier carácter latino básico no ISO. Las pilas de redes inalámbricas deben estar preparadas para manejar valores arbitrarios en el campo SSID.

Tenga en cuenta que la limitación es de 32 bytes, no de 32 caracteres. Mientras que cada carácter en ASCII es de 1 byte, los caracteres en UTF-8 La codificación puede ocupar hasta 4 bytes. Ejemplo:

  1. Test constaba de 4 caracteres y 4 bytes .
  2. consistía en 3 personajes pero 9 bytes .

Si los SSID infractores están bajo su control, la solución más sencilla es reducir su tamaño en bytes (longitud).


La comprobación en el lado de Android que produce este mensaje de error se añadió en Abril de 2019 , que está entre Android 9 (agosto de 2018) y Android 10 (septiembre de 2019).

NativeUtil: Realiza comprobaciones de rango en el tamaño de los bytes del ssid

NativeUtil.encodeSsid/decodeSsid debe realizar comprobaciones de rango porque la salida/entrada viene de interfaces binder/hwbinder que asumen que el ssid no está malformado (es decir, dentro del rango de tamaño establecido por las especificaciones).

La mayoría de los que llaman a estos métodos ya manejan IllegalArgumentException (incluyendo la lista de redes ocultas construida en WifiCondControl). Esto debería solucionar el problema reportado de un SSID oculto añadido con un tamaño > 32 causando un fallo en wificond.

0 votos

Como se ha dicho, el problema puede ser inevitable si los SSID están fuera del control del lector. Las soluciones alternativas son dignas de una nueva respuesta.

PreguntAndroid.com

PreguntAndroid es una comunidad de usuarios de Android en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X