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

Commit 03fe3ac0 authored by Treehugger Robot's avatar Treehugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Switch Unsafe Parcel Lint Check to ERROR" into main

parents ab45344a bc12527a
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()
            )
    }