Fix crash on unset recurrence type
Recurring event rule parser uses -1 for an unset recurrence type. Check
for invalid recurrence type to prevent crash.
Bug:14490734
Change-Id: I68de74d16cd4489d4235a9a3aea9c8ed0c4429dc
diff --git a/src/com/android/exchange/utility/CalendarUtilities.java b/src/com/android/exchange/utility/CalendarUtilities.java
index 7a4af68..50edea2 100644
--- a/src/com/android/exchange/utility/CalendarUtilities.java
+++ b/src/com/android/exchange/utility/CalendarUtilities.java
@@ -1349,7 +1349,15 @@
*/
static public String rruleFromRecurrence(int type, int occurrences, int interval, int dow,
int dom, int wom, int moy, String until) {
- StringBuilder rrule = new StringBuilder("FREQ=" + sTypeToFreq[type]);
+ if (type < 0 || type >= sTypeToFreq.length) {
+ return null;
+ }
+ final String typeStr = sTypeToFreq[type];
+ // Type array is sparse (eg, no type 4), so catch invalid (empty) types
+ if (TextUtils.isEmpty(typeStr)) {
+ return null;
+ }
+ StringBuilder rrule = new StringBuilder("FREQ=" + typeStr);
// INTERVAL and COUNT
if (occurrences > 0) {
rrule.append(";COUNT=" + occurrences);
diff --git a/tests/src/com/android/exchange/utility/CalendarUtilitiesTests.java b/tests/src/com/android/exchange/utility/CalendarUtilitiesTests.java
index 68e57e0..bf80f1b 100644
--- a/tests/src/com/android/exchange/utility/CalendarUtilitiesTests.java
+++ b/tests/src/com/android/exchange/utility/CalendarUtilitiesTests.java
@@ -720,6 +720,14 @@
rrule = CalendarUtilities.rruleFromRecurrence(
6 /*Yearly/Month/DayOfWeek*/, 0, 0, 4 /*Tue*/, 0, 1 /*1st*/, 6 /*June*/, null);
assertEquals("FREQ=YEARLY;BYDAY=1TU;BYMONTH=6", rrule);
+ // Missing type
+ rrule = CalendarUtilities.rruleFromRecurrence(
+ -1 /* missing */, 0, 0, 4 /*Tue*/, 0, 1 /*1st*/, 6 /*June*/, null);
+ assertNull(rrule);
+ // Invalid type
+ rrule = CalendarUtilities.rruleFromRecurrence(
+ 4 /* invalid */, 0, 0, 4 /*Tue*/, 0, 1 /*1st*/, 6 /*June*/, null);
+ assertNull(rrule);
}
/**