From 7061d3895054c173227daaca578b1bfb9d6fa274 Mon Sep 17 00:00:00 2001 From: MaxNad Date: Mon, 3 Oct 2016 18:39:16 -0400 Subject: [PATCH] Issue #224 - Changed the detector and added a test case to fit the changes requested in #225. --- .../v4}/content/LocalBroadcastManager.java | 6 +++++- .../findsecbugs/android/BroadcastDetector.java | 16 +++++++++++----- .../android/BroadcastIntentActivity.java | 7 +++++-- .../android/CustomLocalBroadcastManager.java | 8 ++++++++ 4 files changed, 29 insertions(+), 8 deletions(-) rename plugin-deps/src/main/java/android/{ => support/v4}/content/LocalBroadcastManager.java (74%) create mode 100644 plugin/src/test/java/testcode/android/CustomLocalBroadcastManager.java diff --git a/plugin-deps/src/main/java/android/content/LocalBroadcastManager.java b/plugin-deps/src/main/java/android/support/v4/content/LocalBroadcastManager.java similarity index 74% rename from plugin-deps/src/main/java/android/content/LocalBroadcastManager.java rename to plugin-deps/src/main/java/android/support/v4/content/LocalBroadcastManager.java index e6d6664e7..10b6f9be0 100644 --- a/plugin-deps/src/main/java/android/content/LocalBroadcastManager.java +++ b/plugin-deps/src/main/java/android/support/v4/content/LocalBroadcastManager.java @@ -1,4 +1,8 @@ -package android.content; +package android.support.v4.content; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; public class LocalBroadcastManager { public static LocalBroadcastManager getInstance(Context context) { return new LocalBroadcastManager(); } diff --git a/plugin/src/main/java/com/h3xstream/findsecbugs/android/BroadcastDetector.java b/plugin/src/main/java/com/h3xstream/findsecbugs/android/BroadcastDetector.java index b6e0940ce..19d4a1f64 100644 --- a/plugin/src/main/java/com/h3xstream/findsecbugs/android/BroadcastDetector.java +++ b/plugin/src/main/java/com/h3xstream/findsecbugs/android/BroadcastDetector.java @@ -17,6 +17,7 @@ */ package com.h3xstream.findsecbugs.android; +import com.h3xstream.findsecbugs.common.InterfaceUtils; import edu.umd.cs.findbugs.BugInstance; import edu.umd.cs.findbugs.BugReporter; import edu.umd.cs.findbugs.Priorities; @@ -42,11 +43,16 @@ public void sawOpcode(int seen) { getNameConstantOperand().equals("sendBroadcastAsUser") || getNameConstantOperand().equals("sendOrderedBroadcast") || getNameConstantOperand().equals("sendOrderedBroadcastAsUser") - ) - && !getClassConstantOperand().endsWith("LocalBroadcastManager") // The LocalBroadcastManager object is safe. The broadcast doesn't leave the application scope. - ) { - bugReporter.reportBug(new BugInstance(this, ANDROID_BROADCAST_TYPE, Priorities.NORMAL_PRIORITY) // - .addClass(this).addMethod(this).addSourceLine(this)); + )) { + + // The LocalBroadcastManager object is safe. The broadcast doesn't leave the application scope. + // We check if the class extends android.support.v4.content.LocalBroadcastManager + // We will also check if the class is named "LocalBroadcastManager" in case the version in the namespace changes. + if (!InterfaceUtils.isSubtype(getClassConstantOperand(), "android.support.v4.content.LocalBroadcastManager") + && !getClassConstantOperand().endsWith("LocalBroadcastManager")) { + bugReporter.reportBug(new BugInstance(this, ANDROID_BROADCAST_TYPE, Priorities.NORMAL_PRIORITY) // + .addClass(this).addMethod(this).addSourceLine(this)); + } } } } diff --git a/plugin/src/test/java/testcode/android/BroadcastIntentActivity.java b/plugin/src/test/java/testcode/android/BroadcastIntentActivity.java index f320dccc5..2956a34e2 100644 --- a/plugin/src/test/java/testcode/android/BroadcastIntentActivity.java +++ b/plugin/src/test/java/testcode/android/BroadcastIntentActivity.java @@ -2,7 +2,7 @@ import android.app.Activity; import android.content.Intent; -import android.content.LocalBroadcastManager; +import android.support.v4.content.LocalBroadcastManager; import android.os.Bundle; public class BroadcastIntentActivity extends Activity { @@ -30,11 +30,14 @@ protected void onCreate(Bundle b) { sendOrderedBroadcast(i,null,null,null,0,null,null); sendOrderedBroadcastAsUser(i,null,null,null,null,0,null,null); - /* This call is safe. + /* These calls are safe. * * https://developer.android.com/reference/android/support/v4/content/LocalBroadcastManager.html * > "You know that the data you are broadcasting won't leave your app, so don't need to worry about leaking private data." */ LocalBroadcastManager.getInstance(this).sendBroadcast(i); + + // This class extends the Android LocalBroadcastManager and is used to test the InterfaceUtils.isSubtype condition. + CustomLocalBroadcastManager.getInstance(this).sendBroadcast(i); } } diff --git a/plugin/src/test/java/testcode/android/CustomLocalBroadcastManager.java b/plugin/src/test/java/testcode/android/CustomLocalBroadcastManager.java new file mode 100644 index 000000000..90c17aed5 --- /dev/null +++ b/plugin/src/test/java/testcode/android/CustomLocalBroadcastManager.java @@ -0,0 +1,8 @@ +package testcode.android; + +import android.support.v4.content.LocalBroadcastManager; + +/** + * This class is used in the BroadcastDetector to test the Interface.isSubtype([...], "LocalBroadcastManager") condition. + */ +public class CustomLocalBroadcastManager extends LocalBroadcastManager { }