From 451a6f8f9a5e629a94b3cb75eb2d8576caea5471 Mon Sep 17 00:00:00 2001 From: Nick Kralevich Date: Wed, 12 Nov 2014 12:47:50 -0800 Subject: [PATCH] fix crash on invalid base64 key An invalid adb public key can cause a system server crash. AndroidRuntime: *** FATAL EXCEPTION IN SYSTEM PROCESS: android.fg AndroidRuntime: java.lang.IllegalArgumentException: bad base-64 AndroidRuntime: at android.util.Base64.decode(Base64.java:161) AndroidRuntime: at android.util.Base64.decode(Base64.java:136) AndroidRuntime: at com.android.server.usb.UsbDebuggingManager.getFingerprints(UsbDebuggingManager.java:235) AndroidRuntime: at com.android.server.usb.UsbDebuggingManager.access$500(UsbDebuggingManager.java:49) AndroidRuntime: at com.android.server.usb.UsbDebuggingManager$UsbDebuggingHandler.handleMessage(UsbDebuggingManager.java:210) AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:102) AndroidRuntime: at android.os.Looper.loop(Looper.java:135) AndroidRuntime: at android.os.HandlerThread.run(HandlerThread.java:61) AndroidRuntime: at com.android.server.ServiceThread.run(ServiceThread.java:46) Process : Sending signal. PID: 824 SIG: 9 Bug: 17389885 Change-Id: Id20d7c0ee35229b14c800fd9e07716239179989c --- .../server/usb/UsbDebuggingManager.java | 22 +++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/services/usb/java/com/android/server/usb/UsbDebuggingManager.java b/services/usb/java/com/android/server/usb/UsbDebuggingManager.java index cc5d004a494ec..1cf00d24cfd29 100644 --- a/services/usb/java/com/android/server/usb/UsbDebuggingManager.java +++ b/services/usb/java/com/android/server/usb/UsbDebuggingManager.java @@ -207,7 +207,12 @@ public class UsbDebuggingManager implements Runnable { case MESSAGE_ADB_CONFIRM: { String key = (String)msg.obj; - mFingerprints = getFingerprints(key); + String fingerprints = getFingerprints(key); + if ("".equals(fingerprints)) { + sendResponse("NO"); + break; + } + mFingerprints = fingerprints; startConfirmation(key, mFingerprints); break; } @@ -224,16 +229,25 @@ public class UsbDebuggingManager implements Runnable { StringBuilder sb = new StringBuilder(); MessageDigest digester; + if (key == null) { + return ""; + } + try { digester = MessageDigest.getInstance("MD5"); } catch (Exception ex) { - Slog.e(TAG, "Error getting digester: " + ex); + Slog.e(TAG, "Error getting digester", ex); return ""; } byte[] base64_data = key.split("\\s+")[0].getBytes(); - byte[] digest = digester.digest(Base64.decode(base64_data, Base64.DEFAULT)); - + byte[] digest; + try { + digest = digester.digest(Base64.decode(base64_data, Base64.DEFAULT)); + } catch (IllegalArgumentException e) { + Slog.e(TAG, "error doing base64 decoding", e); + return ""; + } for (int i = 0; i < digest.length; i++) { sb.append(hex.charAt((digest[i] >> 4) & 0xf)); sb.append(hex.charAt(digest[i] & 0xf));