Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c18a153f authored by Fabian Kozynski's avatar Fabian Kozynski
Browse files

Prevent ClassCastException

Add checks for badly formed extras.

Test: atest ControlsRequestReceiverTest
Test: manual, using adb
Bug: 205563567
Fixes: 205565492
Change-Id: Ifbd9846e7affbab50295fcffb2aaa24cd0c05e28
parent ef61167c
Loading
Loading
Loading
Loading
+18 −8
Original line number Diff line number Diff line
@@ -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)
+22 −0
Original line number Diff line number Diff line
@@ -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