Merge "Fix a crash where user data was not validated."

This commit is contained in:
Jean Chalard
2014-02-19 03:18:31 +00:00
committed by Android (Google) Code Review
2 changed files with 22 additions and 3 deletions

View File

@@ -29,6 +29,7 @@ import java.lang.reflect.Array;
*/ */
public class SpannableStringBuilder implements CharSequence, GetChars, Spannable, Editable, public class SpannableStringBuilder implements CharSequence, GetChars, Spannable, Editable,
Appendable, GraphicsOperations { Appendable, GraphicsOperations {
private final static String TAG = "SpannableStringBuilder";
/** /**
* Create a new SpannableStringBuilder with empty contents * Create a new SpannableStringBuilder with empty contents
*/ */
@@ -436,10 +437,26 @@ public class SpannableStringBuilder implements CharSequence, GetChars, Spannable
} }
// Documentation from interface // Documentation from interface
public SpannableStringBuilder replace(final int start, final int end, public SpannableStringBuilder replace(int start, int end,
CharSequence tb, int tbstart, int tbend) { CharSequence tb, int tbstart, int tbend) {
checkRange("replace", start, end); checkRange("replace", start, end);
// Sanity check
if (start > end) {
Log.w(TAG, "Bad arguments to #replace : "
+ "start = " + start + ", end = " + end);
final int tmp = start;
start = end;
end = tmp;
}
if (tbstart > tbend) {
Log.w(TAG, "Bad arguments to #replace : "
+ "tbstart = " + tbstart + ", tbend = " + tbend);
final int tmp = tbstart;
tbstart = tbend;
tbend = tmp;
}
int filtercount = mFilters.length; int filtercount = mFilters.length;
for (int i = 0; i < filtercount; i++) { for (int i = 0; i < filtercount; i++) {
CharSequence repl = mFilters[i].filter(tb, tbstart, tbend, this, start, end); CharSequence repl = mFilters[i].filter(tb, tbstart, tbend, this, start, end);
@@ -613,8 +630,9 @@ public class SpannableStringBuilder implements CharSequence, GetChars, Spannable
// 0-length Spanned.SPAN_EXCLUSIVE_EXCLUSIVE // 0-length Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
if (flagsStart == POINT && flagsEnd == MARK && start == end) { if (flagsStart == POINT && flagsEnd == MARK && start == end) {
if (send) Log.e("SpannableStringBuilder", if (send) {
"SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length"); Log.e(TAG, "SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length");
}
// Silently ignore invalid spans when they are created from this class. // Silently ignore invalid spans when they are created from this class.
// This avoids the duplication of the above test code before all the // This avoids the duplication of the above test code before all the
// calls to setSpan that are done in this class // calls to setSpan that are done in this class

View File

@@ -5809,6 +5809,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
int end = text.partialEndOffset; int end = text.partialEndOffset;
if (end > N) end = N; if (end > N) end = N;
removeParcelableSpans(content, start, end); removeParcelableSpans(content, start, end);
// If start > end, content.replace will swap them before using them.
content.replace(start, end, text.text); content.replace(start, end, text.text);
} }
} }