diff --git a/dom/html/HTMLInputElement.cpp b/dom/html/HTMLInputElement.cpp index 617c764e2..a83712ee0 100644 --- a/dom/html/HTMLInputElement.cpp +++ b/dom/html/HTMLInputElement.cpp @@ -608,6 +608,34 @@ HTMLInputElement::InitTimePicker(bool aNoMatterWhat) return NS_ERROR_FAILURE; } +static bool +IsDateInRightFormat(const nsAutoString& aDate) +{ + // Avoid exposing web-defined date strings to OS X, since I have + // no idea what crap lurks in there. Instead, ensure the string + // is in nnnn-nn-nn format, and assume that OS X can handle days + // and months that are out of range and reject those as long as + // the basic format is acceptable. + if (aDate.Length() != 10) + return false; + + const char16_t *cur = aDate.BeginReading(); + const char16_t *end = aDate.EndReading(); + size_t nchar = 0; + for (; cur < end; ++cur) { + nchar++; + if (nchar == 5 || nchar == 8) { + if (char16_t('-') == *cur) + continue; + return false; + } + if (char16_t('0') > *cur || char16_t('9') < *cur) + return false; + } + + return true; +} + nsresult HTMLInputElement::InitDatePicker(bool aNoMatterWhat) { @@ -637,20 +665,27 @@ HTMLInputElement::InitDatePicker(bool aNoMatterWhat) GetValueInternal(initialValue); nsresult rv = datePicker->Init(win, EmptyString()); // title NYI NS_ENSURE_SUCCESS(rv, rv); - rv = datePicker->SetDefaultDate(initialValue); - NS_ENSURE_SUCCESS(rv, rv); + if (IsDateInRightFormat(initialValue)) { + // Sanitized, therefore safe to give to the Cocoa date formatter. + rv = datePicker->SetDefaultDate(initialValue); + NS_ENSURE_SUCCESS(rv, rv); + } if (HasAttr(kNameSpaceID_None, nsGkAtoms::min)) { nsAutoString minStr; GetAttr(kNameSpaceID_None, nsGkAtoms::min, minStr); - rv = datePicker->SetMinDate(minStr); - NS_ENSURE_SUCCESS(rv, rv); + if (IsDateInRightFormat(minStr)) { + rv = datePicker->SetMinDate(minStr); + NS_ENSURE_SUCCESS(rv, rv); + } } if (HasAttr(kNameSpaceID_None, nsGkAtoms::max)) { nsAutoString maxStr; GetAttr(kNameSpaceID_None, nsGkAtoms::max, maxStr); - rv = datePicker->SetMaxDate(maxStr); - NS_ENSURE_SUCCESS(rv, rv); + if (IsDateInRightFormat(maxStr)) { + rv = datePicker->SetMaxDate(maxStr); + NS_ENSURE_SUCCESS(rv, rv); + } } nsCOMPtr callback =