OSDN Git Service

fix crash on invalid base64 key
authorNick Kralevich <nnk@google.com>
Wed, 12 Nov 2014 20:47:50 +0000 (12:47 -0800)
committerNick Kralevich <nnk@google.com>
Wed, 12 Nov 2014 21:40:30 +0000 (13:40 -0800)
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

services/usb/java/com/android/server/usb/UsbDebuggingManager.java

index cc5d004..1cf00d2 100644 (file)
@@ -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));