summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Taylor <tomtaylor@google.com>2013-12-03 10:29:16 -0800
committerThe Android Automerger <android-build@google.com>2013-12-03 15:55:26 -0800
commitd00f7cd4e92f5c4b86a0827184390a71373f268e (patch)
tree01277165408f07e3a171b61123ba99785b83bcad
parent3b8380a0840509bd7e56c7118be54e6d5cfb6189 (diff)
downloadMms-kitkat-mr1-release.tar.gz
Android denial of service attack using class 0 SMS messagesandroid-4.4.2_r1.0.1android-4.4.2_r1kitkat-mr1-release
Bug 9702645 Bug 11970403 - Change to ClassZeroActivity to singleTask Cherry pick the change from master. Making every AlertDialog immediately visible can lead to exhaustion of graphics-related resources, typically memory, resulting in a broken bufferqueue/hw renderer, and subsequent system crash. Make ClassZeroActivity a singleTask activity, and queue incoming messages if one is already being displayed. Change-Id: I0aef7b857364acc404e79581ba5e503571065483
-rw-r--r--AndroidManifest.xml2
-rw-r--r--src/com/android/mms/ui/ClassZeroActivity.java80
2 files changed, 62 insertions, 20 deletions
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index a34ff9fc..13a84d8c 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -181,6 +181,8 @@
<activity android:name=".ui.ClassZeroActivity"
android:label="@string/class_0_message_activity"
android:theme="@android:style/Theme.Translucent"
+ android:configChanges="orientation|screenSize|keyboardHidden"
+ android:launchMode="singleTask"
android:excludeFromRecents="true">
</activity>
diff --git a/src/com/android/mms/ui/ClassZeroActivity.java b/src/com/android/mms/ui/ClassZeroActivity.java
index 0abcdda1..126e7376 100644
--- a/src/com/android/mms/ui/ClassZeroActivity.java
+++ b/src/com/android/mms/ui/ClassZeroActivity.java
@@ -24,6 +24,7 @@ import android.content.ContentUris;
import android.content.ContentValues;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
+import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SqliteWrapper;
import android.net.Uri;
@@ -41,6 +42,8 @@ import android.view.Window;
import com.android.mms.R;
import com.android.mms.transaction.MessagingNotification;
+import java.util.ArrayList;
+
/**
* Display a class-zero SMS message to the user. Wait for the user to dismiss
* it.
@@ -69,6 +72,8 @@ public class ClassZeroActivity extends Activity {
private long mTimerSet = 0;
private AlertDialog mDialog = null;
+ private ArrayList<SmsMessage> mMessageQueue = null;
+
private Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
@@ -77,11 +82,35 @@ public class ClassZeroActivity extends Activity {
mRead = false;
mDialog.dismiss();
saveMessage();
- finish();
+ processNextMessage();
}
}
};
+ private boolean queueMsgFromIntent(Intent msgIntent) {
+ byte[] pdu = msgIntent.getByteArrayExtra("pdu");
+ String format = msgIntent.getStringExtra("format");
+ SmsMessage rawMessage = SmsMessage.createFromPdu(pdu, format);
+ String message = rawMessage.getMessageBody();
+ if (TextUtils.isEmpty(message)) {
+ if (mMessageQueue.size() == 0) {
+ finish();
+ }
+ return false;
+ }
+ mMessageQueue.add(rawMessage);
+ return true;
+ }
+
+ private void processNextMessage() {
+ mMessageQueue.remove(0);
+ if (mMessageQueue.size() == 0) {
+ finish();
+ } else {
+ displayZeroMessage(mMessageQueue.get(0));
+ }
+ }
+
private void saveMessage() {
Uri messageUri = null;
if (mMessage.isReplace()) {
@@ -98,35 +127,46 @@ public class ClassZeroActivity extends Activity {
}
@Override
+ protected void onNewIntent(Intent msgIntent) {
+ /* Running with another visible message, queue this one */
+ queueMsgFromIntent(msgIntent);
+ }
+
+ @Override
protected void onCreate(Bundle icicle) {
super.onCreate(icicle);
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setBackgroundDrawableResource(
R.drawable.class_zero_background);
- byte[] pdu = getIntent().getByteArrayExtra("pdu");
- String format = getIntent().getStringExtra("format");
- mMessage = SmsMessage.createFromPdu(pdu, format);
- CharSequence messageChars = mMessage.getMessageBody();
- String message = messageChars.toString();
- if (TextUtils.isEmpty(message)) {
- finish();
+ if (mMessageQueue == null) {
+ mMessageQueue = new ArrayList<SmsMessage>();
+ }
+
+ if (!queueMsgFromIntent(getIntent())) {
return;
}
- // TODO: The following line adds an emptry string before and after a message.
- // This is not the correct way to layout a message. This is more of a hack
- // to work-around a bug in AlertDialog. This needs to be fixed later when
- // Android fixes the bug in AlertDialog.
- if (message.length() < BUFFER_OFFSET) messageChars = BUFFER + message + BUFFER;
- long now = SystemClock.uptimeMillis();
- mDialog = new AlertDialog.Builder(this).setMessage(messageChars)
+
+ if (mMessageQueue.size() == 1) {
+ displayZeroMessage(mMessageQueue.get(0));
+ }
+
+ if (icicle != null) {
+ mTimerSet = icicle.getLong(TIMER_FIRE, mTimerSet);
+ }
+ }
+
+ private void displayZeroMessage(SmsMessage rawMessage) {
+ String message = rawMessage.getMessageBody();
+ /* This'll be used by the save action */
+ mMessage = rawMessage;
+
+ mDialog = new AlertDialog.Builder(this, AlertDialog.THEME_HOLO_DARK).setMessage(message)
.setPositiveButton(R.string.save, mSaveListener)
.setNegativeButton(android.R.string.cancel, mCancelListener)
.setCancelable(false).show();
+ long now = SystemClock.uptimeMillis();
mTimerSet = now + DEFAULT_TIMER;
- if (icicle != null) {
- mTimerSet = icicle.getLong(TIMER_FIRE, mTimerSet);
- }
}
@Override
@@ -168,7 +208,7 @@ public class ClassZeroActivity extends Activity {
private final OnClickListener mCancelListener = new OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
dialog.dismiss();
- finish();
+ processNextMessage();
}
};
@@ -177,7 +217,7 @@ public class ClassZeroActivity extends Activity {
mRead = true;
saveMessage();
dialog.dismiss();
- finish();
+ processNextMessage();
}
};