summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Robert Wu <robertwu@google.com> 2023-12-06 22:53:05 +0000
committer Robert Wu <robertwu@google.com> 2023-12-07 00:08:49 +0000
commitd0d1e688e1849c6e684a110f2e875cbd39af1dfb (patch)
tree32acad18567e15f38fe9ba789dde86f870f99e27
parent0edd84716a9090da9a35837353ccb7344d5b8608 (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.java57
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;