diff options
author | 2023-12-06 22:53:05 +0000 | |
---|---|---|
committer | 2023-12-07 00:08:49 +0000 | |
commit | d0d1e688e1849c6e684a110f2e875cbd39af1dfb (patch) | |
tree | 32acad18567e15f38fe9ba789dde86f870f99e27 | |
parent | 0edd84716a9090da9a35837353ccb7344d5b8608 (diff) |
MIDI: Check MIDI permission before parsing XML
MidiService is parsing the XML of installed packages.
This is relatively expensive.
This CL changes it so permissions and flags are checked first.
This CL also adds additional null checks.
Bug: 315203699
Test: atest MidiEchoTest
Change-Id: I57e332f2afdcc54cc67986b8a8b2941ee1899c26
-rw-r--r-- | services/midi/java/com/android/server/midi/MidiService.java | 57 |
1 files changed, 40 insertions, 17 deletions
diff --git a/services/midi/java/com/android/server/midi/MidiService.java b/services/midi/java/com/android/server/midi/MidiService.java index 39aaab25d7be..a212812b0768 100644 --- a/services/midi/java/com/android/server/midi/MidiService.java +++ b/services/midi/java/com/android/server/midi/MidiService.java @@ -31,6 +31,7 @@ import android.content.ServiceConnection; import android.content.pm.ApplicationInfo; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; +import android.content.pm.PackageManager.Property; import android.content.pm.ResolveInfo; import android.content.pm.ServiceInfo; import android.content.res.Resources; @@ -1396,16 +1397,20 @@ public class MidiService extends IMidiManager.Stub { XmlResourceParser parser = null; try { - parser = serviceInfo.loadXmlMetaData(mPackageManager, - MidiDeviceService.SERVICE_INTERFACE); - if (parser == null) return; + if (serviceInfo == null) { + Log.w(TAG, "Skipping null service info"); + return; + } // ignore virtual device servers that do not require the correct permission if (!android.Manifest.permission.BIND_MIDI_DEVICE_SERVICE.equals( serviceInfo.permission)) { - Log.w(TAG, "Skipping MIDI device service " + serviceInfo.packageName - + ": it does not require the permission " - + android.Manifest.permission.BIND_MIDI_DEVICE_SERVICE); + return; + } + parser = serviceInfo.loadXmlMetaData(mPackageManager, + MidiDeviceService.SERVICE_INTERFACE); + if (parser == null) { + Log.w(TAG, "loading xml metadata failed"); return; } @@ -1533,21 +1538,14 @@ public class MidiService extends IMidiManager.Stub { XmlResourceParser parser = null; try { - ComponentName componentName = new ComponentName(serviceInfo.packageName, - serviceInfo.name); - int resId = mPackageManager.getProperty(MidiUmpDeviceService.SERVICE_INTERFACE, - componentName).getResourceId(); - Resources resources = mPackageManager.getResourcesForApplication( - serviceInfo.packageName); - parser = resources.getXml(resId); - if (parser == null) return; + if (serviceInfo == null) { + Log.w(TAG, "Skipping null service info"); + return; + } // ignore virtual device servers that do not require the correct permission if (!android.Manifest.permission.BIND_MIDI_DEVICE_SERVICE.equals( serviceInfo.permission)) { - Log.w(TAG, "Skipping MIDI device service " + serviceInfo.packageName - + ": it does not require the permission " - + android.Manifest.permission.BIND_MIDI_DEVICE_SERVICE); return; } @@ -1557,6 +1555,31 @@ public class MidiService extends IMidiManager.Stub { return; } + ComponentName componentName = new ComponentName(serviceInfo.packageName, + serviceInfo.name); + Property property = mPackageManager.getProperty(MidiUmpDeviceService.SERVICE_INTERFACE, + componentName); + if (property == null) { + Log.w(TAG, "Getting MidiUmpDeviceService property failed"); + return; + } + int resId = property.getResourceId(); + if (resId == 0) { + Log.w(TAG, "Getting MidiUmpDeviceService resourceId failed"); + return; + } + Resources resources = mPackageManager.getResourcesForApplication( + serviceInfo.packageName); + if (resources == null) { + Log.w(TAG, "Getting resource failed " + serviceInfo.packageName); + return; + } + parser = resources.getXml(resId); + if (parser == null) { + Log.w(TAG, "Getting XML failed " + resId); + return; + } + Bundle properties = null; int numPorts = 0; boolean isPrivate = false; |