Prevent ClassCastException
Add checks for badly formed extras. Test: atest ControlsRequestReceiverTest Test: manual, using adb Bug: 205563567 Fixes: 205565492 Change-Id: Ifbd9846e7affbab50295fcffb2aaa24cd0c05e28
This commit is contained in:
@@ -28,6 +28,7 @@ import android.os.UserHandle
|
||||
import android.service.controls.Control
|
||||
import android.service.controls.ControlsProviderService
|
||||
import android.util.Log
|
||||
import java.lang.ClassCastException
|
||||
|
||||
/**
|
||||
* Proxy to launch in user 0
|
||||
@@ -59,20 +60,29 @@ class ControlsRequestReceiver : BroadcastReceiver() {
|
||||
return
|
||||
}
|
||||
|
||||
val packageName = intent.getParcelableExtra<ComponentName>(Intent.EXTRA_COMPONENT_NAME)
|
||||
?.packageName
|
||||
val targetComponent = try {
|
||||
intent.getParcelableExtra<ComponentName>(Intent.EXTRA_COMPONENT_NAME)
|
||||
} catch (e: ClassCastException) {
|
||||
Log.e(TAG, "Malformed intent extra ComponentName", e)
|
||||
return
|
||||
}
|
||||
|
||||
val control = try {
|
||||
intent.getParcelableExtra<Control>(ControlsProviderService.EXTRA_CONTROL)
|
||||
} catch (e: ClassCastException) {
|
||||
Log.e(TAG, "Malformed intent extra Control", e)
|
||||
return
|
||||
}
|
||||
|
||||
val packageName = targetComponent?.packageName
|
||||
|
||||
if (packageName == null || !isPackageInForeground(context, packageName)) {
|
||||
return
|
||||
}
|
||||
|
||||
val activityIntent = Intent(context, ControlsRequestDialog::class.java).apply {
|
||||
Intent.EXTRA_COMPONENT_NAME.let {
|
||||
putExtra(it, intent.getParcelableExtra<ComponentName>(it))
|
||||
}
|
||||
ControlsProviderService.EXTRA_CONTROL.let {
|
||||
putExtra(it, intent.getParcelableExtra<Control>(it))
|
||||
}
|
||||
putExtra(Intent.EXTRA_COMPONENT_NAME, targetComponent)
|
||||
putExtra(ControlsProviderService.EXTRA_CONTROL, control)
|
||||
addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_REORDER_TO_FRONT)
|
||||
}
|
||||
activityIntent.putExtra(Intent.EXTRA_USER_ID, context.userId)
|
||||
|
||||
@@ -154,6 +154,28 @@ class ControlsRequestReceiverTest : SysuiTestCase() {
|
||||
assertNull(wrapper.intent)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun testClassCastExceptionComponentName_noCrash() {
|
||||
val badIntent = Intent(ControlsProviderService.ACTION_ADD_CONTROL).apply {
|
||||
putExtra(Intent.EXTRA_COMPONENT_NAME, Intent())
|
||||
putExtra(ControlsProviderService.EXTRA_CONTROL, control)
|
||||
}
|
||||
receiver.onReceive(wrapper, badIntent)
|
||||
|
||||
assertNull(wrapper.intent)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun testClassCastExceptionControl_noCrash() {
|
||||
val badIntent = Intent(ControlsProviderService.ACTION_ADD_CONTROL).apply {
|
||||
putExtra(Intent.EXTRA_COMPONENT_NAME, componentName)
|
||||
putExtra(ControlsProviderService.EXTRA_CONTROL, Intent())
|
||||
}
|
||||
receiver.onReceive(wrapper, badIntent)
|
||||
|
||||
assertNull(wrapper.intent)
|
||||
}
|
||||
|
||||
class MyWrapper(context: Context) : ContextWrapper(context) {
|
||||
var intent: Intent? = null
|
||||
|
||||
|
||||
Reference in New Issue
Block a user