From: Andy Heninger Date: Mon, 19 Feb 2018 03:13:08 +0000 (+0000) Subject: ICU-13550 decNumber int overflow, switch to unsigned to avoid undefined behavior. X-Git-Tag: release-61-rc~71 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=1d9c8ee33d045b1302e8dbe462aa05557a447d45;p=icu ICU-13550 decNumber int overflow, switch to unsigned to avoid undefined behavior. X-SVN-Rev: 40950 --- diff --git a/icu4c/source/i18n/decNumber.cpp b/icu4c/source/i18n/decNumber.cpp index 149062e0921..cee2f8e9498 100644 --- a/icu4c/source/i18n/decNumber.cpp +++ b/icu4c/source/i18n/decNumber.cpp @@ -627,10 +627,12 @@ U_CAPI decNumber * U_EXPORT2 uprv_decNumberFromString(decNumber *dn, const char for (; *c=='0' && *(c+1)!='\0';) c++; /* strip insignificant zeros */ firstexp=c; /* save exponent digit place */ + uInt uexponent = 0; /* Avoid undefined behavior on signed int overflow */ for (; ;c++) { if (*c<'0' || *c>'9') break; /* not a digit */ - exponent=X10(exponent)+(Int)*c-(Int)'0'; + uexponent=X10(uexponent)+(uInt)*c-(uInt)'0'; } /* c */ + exponent = (Int)uexponent; /* if not now on a '\0', *c must not be a digit */ if (*c!='\0') break;