From db48cbd1594e9b45c084b5dc4a7baacb08099f67 Mon Sep 17 00:00:00 2001 From: Peter Edberg Date: Thu, 5 Mar 2015 06:24:11 +0000 Subject: [PATCH] ICU-11553 Better checking of result,resultLength params in udat functions X-SVN-Rev: 37145 --- icu4c/source/i18n/udat.cpp | 70 ++++++++++++++++++++++++++++++-------- 1 file changed, 56 insertions(+), 14 deletions(-) diff --git a/icu4c/source/i18n/udat.cpp b/icu4c/source/i18n/udat.cpp index 96890cfabb1..ef82796a86c 100644 --- a/icu4c/source/i18n/udat.cpp +++ b/icu4c/source/i18n/udat.cpp @@ -214,10 +214,16 @@ udat_format( const UDateFormat* format, UFieldPosition* position, UErrorCode* status) { - if(U_FAILURE(*status)) return -1; + if(U_FAILURE(*status)) { + return -1; + } + if (result == NULL ? resultLength != 0 : resultLength < 0) { + *status = U_ILLEGAL_ARGUMENT_ERROR; + return -1; + } UnicodeString res; - if(!(result==NULL && resultLength==0)) { + if (result != NULL) { // NULL destination for pure preflighting: empty dummy string // otherwise, alias the destination buffer res.setTo(result, 0, resultLength); @@ -246,10 +252,16 @@ udat_formatCalendar(const UDateFormat* format, UFieldPosition* position, UErrorCode* status) { - if(U_FAILURE(*status)) return -1; + if(U_FAILURE(*status)) { + return -1; + } + if (result == NULL ? resultLength != 0 : resultLength < 0) { + *status = U_ILLEGAL_ARGUMENT_ERROR; + return -1; + } UnicodeString res; - if(!(result==NULL && resultLength==0)) { + if (result != NULL) { // NULL destination for pure preflighting: empty dummy string // otherwise, alias the destination buffer res.setTo(result, 0, resultLength); @@ -278,10 +290,16 @@ udat_formatForFields( const UDateFormat* format, UFieldPositionIterator* fpositer, UErrorCode* status) { - if(U_FAILURE(*status)) return -1; + if(U_FAILURE(*status)) { + return -1; + } + if (result == NULL ? resultLength != 0 : resultLength < 0) { + *status = U_ILLEGAL_ARGUMENT_ERROR; + return -1; + } UnicodeString res; - if(!(result==NULL && resultLength==0)) { + if (result != NULL) { // NULL destination for pure preflighting: empty dummy string // otherwise, alias the destination buffer res.setTo(result, 0, resultLength); @@ -300,10 +318,16 @@ udat_formatCalendarForFields(const UDateFormat* format, UFieldPositionIterator* fpositer, UErrorCode* status) { - if(U_FAILURE(*status)) return -1; + if(U_FAILURE(*status)) { + return -1; + } + if (result == NULL ? resultLength != 0 : resultLength < 0) { + *status = U_ILLEGAL_ARGUMENT_ERROR; + return -1; + } UnicodeString res; - if(!(result==NULL && resultLength==0)) { + if (result != NULL) { // NULL destination for pure preflighting: empty dummy string // otherwise, alias the destination buffer res.setTo(result, 0, resultLength); @@ -504,10 +528,16 @@ udat_toPattern( const UDateFormat *fmt, int32_t resultLength, UErrorCode *status) { - if(U_FAILURE(*status)) return -1; + if(U_FAILURE(*status)) { + return -1; + } + if (result == NULL ? resultLength != 0 : resultLength < 0) { + *status = U_ILLEGAL_ARGUMENT_ERROR; + return -1; + } UnicodeString res; - if(!(result==NULL && resultLength==0)) { + if (result != NULL) { // NULL destination for pure preflighting: empty dummy string // otherwise, alias the destination buffer res.setTo(result, 0, resultLength); @@ -1223,10 +1253,16 @@ udat_toPatternRelativeDate(const UDateFormat *fmt, UErrorCode *status) { verifyIsRelativeDateFormat(fmt, status); - if(U_FAILURE(*status)) return -1; + if(U_FAILURE(*status)) { + return -1; + } + if (result == NULL ? resultLength != 0 : resultLength < 0) { + *status = U_ILLEGAL_ARGUMENT_ERROR; + return -1; + } UnicodeString datePattern; - if(!(result==NULL && resultLength==0)) { + if (result != NULL) { // NULL destination for pure preflighting: empty dummy string // otherwise, alias the destination buffer datePattern.setTo(result, 0, resultLength); @@ -1242,10 +1278,16 @@ udat_toPatternRelativeTime(const UDateFormat *fmt, UErrorCode *status) { verifyIsRelativeDateFormat(fmt, status); - if(U_FAILURE(*status)) return -1; + if(U_FAILURE(*status)) { + return -1; + } + if (result == NULL ? resultLength != 0 : resultLength < 0) { + *status = U_ILLEGAL_ARGUMENT_ERROR; + return -1; + } UnicodeString timePattern; - if(!(result==NULL && resultLength==0)) { + if (result != NULL) { // NULL destination for pure preflighting: empty dummy string // otherwise, alias the destination buffer timePattern.setTo(result, 0, resultLength);