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

Commit bc12527a authored by Achim Thesmann's avatar Achim Thesmann
Browse files

Switch Unsafe Parcel Lint Check to ERROR

Instead of just warning actually fail.

Test: atest SaferParcelCheckerTest
Bug: 436677613
Flag: EXEMPT lint checks
Change-Id: I2184d327e98f92c3a2f91d65bc41e8b8ee1911d0
parent 77196e36
Loading
Loading
Loading
Loading
+47 −21
Original line number Diff line number Diff line
@@ -16,13 +16,21 @@

package com.google.android.lint.parcel

import com.android.tools.lint.detector.api.*
import com.android.tools.lint.detector.api.Category
import com.android.tools.lint.detector.api.Context
import com.android.tools.lint.detector.api.Detector
import com.android.tools.lint.detector.api.Implementation
import com.android.tools.lint.detector.api.Issue
import com.android.tools.lint.detector.api.JavaContext
import com.android.tools.lint.detector.api.Scope
import com.android.tools.lint.detector.api.Severity
import com.android.tools.lint.detector.api.SourceCodeScanner
import com.android.tools.lint.detector.api.UastLintUtils
import com.intellij.psi.PsiMethod
import com.intellij.psi.PsiSubstitutor
import com.intellij.psi.PsiType
import com.intellij.psi.PsiTypeParameter
import org.jetbrains.uast.UCallExpression
import java.util.*

@Suppress("UnstableApiUsage")
class SaferParcelChecker : Detector(), SourceCodeScanner {
@@ -67,7 +75,7 @@ class SaferParcelChecker : Detector(), SourceCodeScanner {
                    """,
                category = Category.SECURITY,
                priority = 8,
                severity = Severity.WARNING,
                severity = Severity.ERROR,

                implementation = Implementation(
                        SaferParcelChecker::class.java,
@@ -76,30 +84,48 @@ class SaferParcelChecker : Detector(), SourceCodeScanner {
        )

        // Parcel
        private val PARCEL_METHOD_READ_SERIALIZABLE = Method("android.os.Parcel", "readSerializable", listOf())
        private val PARCEL_METHOD_READ_ARRAY_LIST = Method("android.os.Parcel", "readArrayList", listOf("java.lang.ClassLoader"))
        private val PARCEL_METHOD_READ_LIST = Method("android.os.Parcel", "readList", listOf("java.util.List", "java.lang.ClassLoader"))
        private val PARCEL_METHOD_READ_PARCELABLE = Method(listOf("T"), "android.os.Parcel", "readParcelable", listOf("java.lang.ClassLoader"))
        private val PARCEL_METHOD_READ_PARCELABLE_LIST = Method(listOf("T"), "android.os.Parcel", "readParcelableList", listOf("java.util.List<T>", "java.lang.ClassLoader"))
        private val PARCEL_METHOD_READ_SPARSE_ARRAY = Method(listOf("T"), "android.os.Parcel", "readSparseArray", listOf("java.lang.ClassLoader"))
        private val PARCEL_METHOD_READ_ARRAY = Method("android.os.Parcel", "readArray", listOf("java.lang.ClassLoader"))
        private val PARCEL_METHOD_READ_PARCELABLE_ARRAY = Method("android.os.Parcel", "readParcelableArray", listOf("java.lang.ClassLoader"))
        private val PARCEL_METHOD_READ_SERIALIZABLE =
            Method("android.os.Parcel", "readSerializable", listOf())
        private val PARCEL_METHOD_READ_ARRAY_LIST =
            Method("android.os.Parcel", "readArrayList", listOf("java.lang.ClassLoader"))
        private val PARCEL_METHOD_READ_LIST =
            Method("android.os.Parcel", "readList", listOf("java.util.List", "java.lang.ClassLoader"))
        private val PARCEL_METHOD_READ_PARCELABLE =
            Method(listOf("T"), "android.os.Parcel", "readParcelable", listOf("java.lang.ClassLoader"))
        private val PARCEL_METHOD_READ_PARCELABLE_LIST =
            Method(listOf("T"), "android.os.Parcel", "readParcelableList", listOf("java.util.List<T>", "java.lang.ClassLoader"))
        private val PARCEL_METHOD_READ_SPARSE_ARRAY =
            Method(listOf("T"), "android.os.Parcel", "readSparseArray", listOf("java.lang.ClassLoader"))
        private val PARCEL_METHOD_READ_ARRAY =
            Method("android.os.Parcel", "readArray", listOf("java.lang.ClassLoader"))
        private val PARCEL_METHOD_READ_PARCELABLE_ARRAY =
            Method("android.os.Parcel", "readParcelableArray", listOf("java.lang.ClassLoader"))

        // Bundle
        private val BUNDLE_METHOD_GET_SERIALIZABLE = Method("android.os.Bundle", "getSerializable", listOf("java.lang.String"))
        private val BUNDLE_METHOD_GET_PARCELABLE = Method(listOf("T"), "android.os.Bundle", "getParcelable", listOf("java.lang.String"))
        private val BUNDLE_METHOD_GET_PARCELABLE_ARRAY_LIST = Method(listOf("T"), "android.os.Bundle", "getParcelableArrayList", listOf("java.lang.String"))
        private val BUNDLE_METHOD_GET_PARCELABLE_ARRAY = Method("android.os.Bundle", "getParcelableArray", listOf("java.lang.String"))
        private val BUNDLE_METHOD_GET_SPARSE_PARCELABLE_ARRAY = Method(listOf("T"), "android.os.Bundle", "getSparseParcelableArray", listOf("java.lang.String"))
        private val BUNDLE_METHOD_GET_SERIALIZABLE =
            Method("android.os.Bundle", "getSerializable", listOf("java.lang.String"))
        private val BUNDLE_METHOD_GET_PARCELABLE =
            Method(listOf("T"), "android.os.Bundle", "getParcelable", listOf("java.lang.String"))
        private val BUNDLE_METHOD_GET_PARCELABLE_ARRAY_LIST =
            Method(listOf("T"), "android.os.Bundle", "getParcelableArrayList", listOf("java.lang.String"))
        private val BUNDLE_METHOD_GET_PARCELABLE_ARRAY =
            Method("android.os.Bundle", "getParcelableArray", listOf("java.lang.String"))
        private val BUNDLE_METHOD_GET_SPARSE_PARCELABLE_ARRAY =
            Method(listOf("T"), "android.os.Bundle", "getSparseParcelableArray", listOf("java.lang.String"))

        // Intent
        private val INTENT_METHOD_GET_SERIALIZABLE_EXTRA = Method("android.content.Intent", "getSerializableExtra", listOf("java.lang.String"))
        private val INTENT_METHOD_GET_PARCELABLE_EXTRA = Method(listOf("T"), "android.content.Intent", "getParcelableExtra", listOf("java.lang.String"))
        private val INTENT_METHOD_GET_PARCELABLE_ARRAY_EXTRA = Method("android.content.Intent", "getParcelableArrayExtra", listOf("java.lang.String"))
        private val INTENT_METHOD_GET_PARCELABLE_ARRAY_LIST_EXTRA = Method(listOf("T"), "android.content.Intent", "getParcelableArrayListExtra", listOf("java.lang.String"))
        private val INTENT_METHOD_GET_SERIALIZABLE_EXTRA =
            Method("android.content.Intent", "getSerializableExtra", listOf("java.lang.String"))
        private val INTENT_METHOD_GET_PARCELABLE_EXTRA =
            Method(listOf("T"), "android.content.Intent", "getParcelableExtra", listOf("java.lang.String"))
        private val INTENT_METHOD_GET_PARCELABLE_ARRAY_EXTRA =
            Method("android.content.Intent", "getParcelableArrayExtra", listOf("java.lang.String"))
        private val INTENT_METHOD_GET_PARCELABLE_ARRAY_LIST_EXTRA =
            Method(listOf("T"), "android.content.Intent", "getParcelableArrayListExtra", listOf("java.lang.String"))

        // TODO: Write migrators for methods below
        private val PARCEL_METHOD_READ_PARCELABLE_CREATOR = Method("android.os.Parcel", "readParcelableCreator", listOf("java.lang.ClassLoader"))
        private val PARCEL_METHOD_READ_PARCELABLE_CREATOR =
            Method("android.os.Parcel", "readParcelableCreator", listOf("java.lang.ClassLoader"))

        private val MIGRATORS = listOf(
            ReturnMigrator(PARCEL_METHOD_READ_PARCELABLE, setOf("android.os.Parcelable")),
+26 −26
Original line number Diff line number Diff line
@@ -60,11 +60,11 @@ class SaferParcelCheckerTest : LintDetectorTest() {
            .run()
            .expect(
                """
                        src/test/pkg/TestClass.java:7: Warning: Unsafe Parcel.readSerializable() \
                        src/test/pkg/TestClass.java:7: Error: Unsafe Parcel.readSerializable() \
                        API usage [UnsafeParcelApi]
                                Serializable ans = p.readSerializable();
                                                   ~~~~~~~~~~~~~~~~~~~~
                        0 errors, 1 warnings
                        1 errors, 0 warnings
                        """.addLineContinuation()
            )
    }
@@ -111,11 +111,11 @@ class SaferParcelCheckerTest : LintDetectorTest() {
            .run()
            .expect(
                """
                        src/test/pkg/TestClass.java:6: Warning: Unsafe Parcel.readArrayList() API \
                        src/test/pkg/TestClass.java:6: Error: Unsafe Parcel.readArrayList() API \
                        usage [UnsafeParcelApi]
                                ArrayList ans = p.readArrayList(null);
                                                ~~~~~~~~~~~~~~~~~~~~~
                        0 errors, 1 warnings
                        1 errors, 0 warnings
                        """.addLineContinuation()
            )
    }
@@ -165,11 +165,11 @@ class SaferParcelCheckerTest : LintDetectorTest() {
            .run()
            .expect(
                """
                        src/test/pkg/TestClass.java:9: Warning: Unsafe Parcel.readList() API usage \
                        src/test/pkg/TestClass.java:9: Error: Unsafe Parcel.readList() API usage \
                        [UnsafeParcelApi]
                                p.readList(list, null);
                                ~~~~~~~~~~~~~~~~~~~~~~
                        0 errors, 1 warnings
                        1 errors, 0 warnings
                        """.addLineContinuation()
            )
    }
@@ -219,11 +219,11 @@ class SaferParcelCheckerTest : LintDetectorTest() {
            .run()
            .expect(
                """
                        src/test/pkg/TestClass.java:7: Warning: Unsafe Parcel.readParcelable() API \
                        src/test/pkg/TestClass.java:7: Error: Unsafe Parcel.readParcelable() API \
                        usage [UnsafeParcelApi]
                                Intent ans = p.readParcelable(null);
                                             ~~~~~~~~~~~~~~~~~~~~~~
                        0 errors, 1 warnings
                        1 errors, 0 warnings
                        """.addLineContinuation()
            )
    }
@@ -273,11 +273,11 @@ class SaferParcelCheckerTest : LintDetectorTest() {
            .run()
            .expect(
                """
                        src/test/pkg/TestClass.java:9: Warning: Unsafe Parcel.readParcelableList() \
                        src/test/pkg/TestClass.java:9: Error: Unsafe Parcel.readParcelableList() \
                        API usage [UnsafeParcelApi]
                                List<Intent> ans = p.readParcelableList(list, null);
                                                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                        0 errors, 1 warnings
                        1 errors, 0 warnings
                        """.addLineContinuation()
            )
    }
@@ -329,11 +329,11 @@ class SaferParcelCheckerTest : LintDetectorTest() {
            .run()
            .expect(
                """
                        src/test/pkg/TestClass.java:8: Warning: Unsafe Parcel.readSparseArray() API\
                        src/test/pkg/TestClass.java:8: Error: Unsafe Parcel.readSparseArray() API\
                         usage [UnsafeParcelApi]
                                SparseArray<Intent> ans = p.readSparseArray(null);
                                                          ~~~~~~~~~~~~~~~~~~~~~~~
                        0 errors, 1 warnings
                        1 errors, 0 warnings
                        """.addLineContinuation()
            )
    }
@@ -383,11 +383,11 @@ class SaferParcelCheckerTest : LintDetectorTest() {
            .run()
            .expect(
                """
                        src/test/pkg/TestClass.java:7: Warning: Unsafe Parcel.readArray() API\
                        src/test/pkg/TestClass.java:7: Error: Unsafe Parcel.readArray() API\
                         usage [UnsafeParcelApi]
                                Intent[] ans = p.readArray(null);
                                               ~~~~~~~~~~~~~~~~~
                        0 errors, 1 warnings
                        1 errors, 0 warnings
                        """.addLineContinuation()
            )
    }
@@ -435,11 +435,11 @@ class SaferParcelCheckerTest : LintDetectorTest() {
            .run()
            .expect(
                """
                        src/test/pkg/TestClass.java:7: Warning: Unsafe Parcel.readParcelableArray() API\
                        src/test/pkg/TestClass.java:7: Error: Unsafe Parcel.readParcelableArray() API\
                         usage [UnsafeParcelApi]
                                Intent[] ans = p.readParcelableArray(null);
                                               ~~~~~~~~~~~~~~~~~~~~~~~~~~~
                        0 errors, 1 warnings
                        1 errors, 0 warnings
                        """.addLineContinuation()
            )
    }
@@ -489,10 +489,10 @@ class SaferParcelCheckerTest : LintDetectorTest() {
            .run()
            .expect(
                """
                    src/test/pkg/TestClass.java:7: Warning: Unsafe Bundle.getParcelable() API usage [UnsafeParcelApi]
                    src/test/pkg/TestClass.java:7: Error: Unsafe Bundle.getParcelable() API usage [UnsafeParcelApi]
                            Intent ans = b.getParcelable("key");
                                         ~~~~~~~~~~~~~~~~~~~~~~
                    0 errors, 1 warnings
                    1 errors, 0 warnings
                        """.addLineContinuation()
            )
    }
@@ -540,10 +540,10 @@ class SaferParcelCheckerTest : LintDetectorTest() {
            .run()
            .expect(
                """
                    src/test/pkg/TestClass.java:7: Warning: Unsafe Bundle.getParcelableArrayList() API usage [UnsafeParcelApi]
                    src/test/pkg/TestClass.java:7: Error: Unsafe Bundle.getParcelableArrayList() API usage [UnsafeParcelApi]
                            ArrayList<Intent> ans = b.getParcelableArrayList("key");
                                                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                    0 errors, 1 warnings
                    1 errors, 0 warnings
                        """.addLineContinuation()
            )
    }
@@ -591,10 +591,10 @@ class SaferParcelCheckerTest : LintDetectorTest() {
            .run()
            .expect(
                """
                    src/test/pkg/TestClass.java:7: Warning: Unsafe Bundle.getParcelableArray() API usage [UnsafeParcelApi]
                    src/test/pkg/TestClass.java:7: Error: Unsafe Bundle.getParcelableArray() API usage [UnsafeParcelApi]
                            Intent[] ans = b.getParcelableArray("key");
                                           ~~~~~~~~~~~~~~~~~~~~~~~~~~~
                    0 errors, 1 warnings
                    1 errors, 0 warnings
                        """.addLineContinuation()
            )
    }
@@ -642,10 +642,10 @@ class SaferParcelCheckerTest : LintDetectorTest() {
            .run()
            .expect(
                """
                    src/test/pkg/TestClass.java:7: Warning: Unsafe Bundle.getSparseParcelableArray() API usage [UnsafeParcelApi]
                    src/test/pkg/TestClass.java:7: Error: Unsafe Bundle.getSparseParcelableArray() API usage [UnsafeParcelApi]
                            SparseArray<Intent> ans = b.getSparseParcelableArray("key");
                                                      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                    0 errors, 1 warnings
                    1 errors, 0 warnings
                        """.addLineContinuation()
            )
    }
@@ -694,10 +694,10 @@ class SaferParcelCheckerTest : LintDetectorTest() {
            .run()
            .expect(
                """
                    src/test/pkg/TestClass.java:6: Warning: Unsafe Intent.getParcelableExtra() API usage [UnsafeParcelApi]
                    src/test/pkg/TestClass.java:6: Error: Unsafe Intent.getParcelableExtra() API usage [UnsafeParcelApi]
                            Intent ans = i.getParcelableExtra("name");
                                         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                    0 errors, 1 warnings
                    1 errors, 0 warnings
                        """.addLineContinuation()
            )
    }