Signed-off-by: Jeff Smith whydoubt@gmail.com --- dlls/msvcrt/locale.c | 328 +++++++++++++++---------------------------- 1 file changed, 112 insertions(+), 216 deletions(-)
diff --git a/dlls/msvcrt/locale.c b/dlls/msvcrt/locale.c index fc41f05da2..f472432144 100644 --- a/dlls/msvcrt/locale.c +++ b/dlls/msvcrt/locale.c @@ -1048,25 +1048,19 @@ static MSVCRT_pthreadlocinfo create_locinfo(int category, locinfo->refcount = 1;
locinfo->lconv = MSVCRT_malloc(sizeof(struct MSVCRT_lconv)); - if(!locinfo->lconv) { - free_locinfo(locinfo); - return NULL; - } + if(!locinfo->lconv) + goto failed; memset(locinfo->lconv, 0, sizeof(struct MSVCRT_lconv));
locinfo->pclmap = MSVCRT_malloc(sizeof(char[256])); locinfo->pcumap = MSVCRT_malloc(sizeof(char[256])); - if(!locinfo->pclmap || !locinfo->pcumap) { - free_locinfo(locinfo); - return NULL; - } + if(!locinfo->pclmap || !locinfo->pcumap) + goto failed;
if(locale_name[MSVCRT_LC_COLLATE] && !init_category_name(locale_name[MSVCRT_LC_COLLATE], - locale_len[MSVCRT_LC_COLLATE], locinfo, MSVCRT_LC_COLLATE)) { - free_locinfo(locinfo); - return NULL; - } + locale_len[MSVCRT_LC_COLLATE], locinfo, MSVCRT_LC_COLLATE)) + goto failed;
if(!category_needs_update(MSVCRT_LC_COLLATE, category, old_locinfo, lcid[MSVCRT_LC_COLLATE], cp[MSVCRT_LC_COLLATE])) { @@ -1074,26 +1068,20 @@ static MSVCRT_pthreadlocinfo create_locinfo(int category, locinfo->lc_id[MSVCRT_LC_COLLATE].wCodePage = old_locinfo->lc_id[MSVCRT_LC_COLLATE].wCodePage; } else if(lcid[MSVCRT_LC_COLLATE] && (category==MSVCRT_LC_ALL || category==MSVCRT_LC_COLLATE)) { if(!update_threadlocinfo_category(lcid[MSVCRT_LC_COLLATE], - cp[MSVCRT_LC_COLLATE], locinfo, MSVCRT_LC_COLLATE)) { - free_locinfo(locinfo); - return NULL; - } + cp[MSVCRT_LC_COLLATE], locinfo, MSVCRT_LC_COLLATE)) + goto failed;
locinfo->lc_collate_cp = locinfo->lc_id[MSVCRT_LC_COLLATE].wCodePage;
- if(!set_lc_locale_name(locinfo, MSVCRT_LC_COLLATE)) { - free_locinfo(locinfo); - return NULL; - } + if(!set_lc_locale_name(locinfo, MSVCRT_LC_COLLATE)) + goto failed; } else locinfo->lc_category[MSVCRT_LC_COLLATE].locale = MSVCRT__strdup("C");
if(locale_name[MSVCRT_LC_CTYPE] && !init_category_name(locale_name[MSVCRT_LC_CTYPE], - locale_len[MSVCRT_LC_CTYPE], locinfo, MSVCRT_LC_CTYPE)) { - free_locinfo(locinfo); - return NULL; - } + locale_len[MSVCRT_LC_CTYPE], locinfo, MSVCRT_LC_CTYPE)) + goto failed;
if(!category_needs_update(MSVCRT_LC_CTYPE, category, old_locinfo, lcid[MSVCRT_LC_CTYPE], cp[MSVCRT_LC_CTYPE])) { @@ -1104,25 +1092,19 @@ static MSVCRT_pthreadlocinfo create_locinfo(int category, int j;
if(!update_threadlocinfo_category(lcid[MSVCRT_LC_CTYPE], - cp[MSVCRT_LC_CTYPE], locinfo, MSVCRT_LC_CTYPE)) { - free_locinfo(locinfo); - return NULL; - } + cp[MSVCRT_LC_CTYPE], locinfo, MSVCRT_LC_CTYPE)) + goto failed;
locinfo->lc_codepage = locinfo->lc_id[MSVCRT_LC_CTYPE].wCodePage; locinfo->lc_clike = 1; - if(!GetCPInfo(locinfo->lc_codepage, &cp_info)) { - free_locinfo(locinfo); - return NULL; - } + if(!GetCPInfo(locinfo->lc_codepage, &cp_info)) + goto failed; locinfo->mb_cur_max = cp_info.MaxCharSize;
locinfo->ctype1_refcount = MSVCRT_malloc(sizeof(int)); locinfo->ctype1 = MSVCRT_malloc(sizeof(short[257])); - if(!locinfo->ctype1_refcount || !locinfo->ctype1) { - free_locinfo(locinfo); - return NULL; - } + if(!locinfo->ctype1_refcount || !locinfo->ctype1) + goto failed;
*locinfo->ctype1_refcount = 1; locinfo->ctype1[0] = 0; @@ -1143,10 +1125,8 @@ static MSVCRT_pthreadlocinfo create_locinfo(int category, for(j=cp_info.LeadByte[i]; j<=cp_info.LeadByte[i+1]; j++) locinfo->ctype1[j+1] |= MSVCRT__LEADBYTE;
- if(!set_lc_locale_name(locinfo, MSVCRT_LC_CTYPE)) { - free_locinfo(locinfo); - return NULL; - } + if(!set_lc_locale_name(locinfo, MSVCRT_LC_CTYPE)) + goto failed;
for(i=0; i<256; i++) { if(locinfo->pctype[i] & MSVCRT__LEADBYTE) @@ -1180,10 +1160,8 @@ static MSVCRT_pthreadlocinfo create_locinfo(int category,
if(locale_name[MSVCRT_LC_MONETARY] && !init_category_name(locale_name[MSVCRT_LC_MONETARY], - locale_len[MSVCRT_LC_MONETARY], locinfo, MSVCRT_LC_MONETARY)) { - free_locinfo(locinfo); - return NULL; - } + locale_len[MSVCRT_LC_MONETARY], locinfo, MSVCRT_LC_MONETARY)) + goto failed;
if(!category_needs_update(MSVCRT_LC_MONETARY, category, old_locinfo, lcid[MSVCRT_LC_MONETARY], cp[MSVCRT_LC_MONETARY])) { @@ -1191,17 +1169,13 @@ static MSVCRT_pthreadlocinfo create_locinfo(int category, locinfo->lc_id[MSVCRT_LC_MONETARY].wCodePage = old_locinfo->lc_id[MSVCRT_LC_MONETARY].wCodePage; } else if(lcid[MSVCRT_LC_MONETARY] && (category==MSVCRT_LC_ALL || category==MSVCRT_LC_MONETARY)) { if(!update_threadlocinfo_category(lcid[MSVCRT_LC_MONETARY], - cp[MSVCRT_LC_MONETARY], locinfo, MSVCRT_LC_MONETARY)) { - free_locinfo(locinfo); - return NULL; - } + cp[MSVCRT_LC_MONETARY], locinfo, MSVCRT_LC_MONETARY)) + goto failed;
locinfo->lconv_intl_refcount = MSVCRT_malloc(sizeof(int)); locinfo->lconv_mon_refcount = MSVCRT_malloc(sizeof(int)); - if(!locinfo->lconv_intl_refcount || !locinfo->lconv_mon_refcount) { - free_locinfo(locinfo); - return NULL; - } + if(!locinfo->lconv_intl_refcount || !locinfo->lconv_mon_refcount) + goto failed;
*locinfo->lconv_intl_refcount = 1; *locinfo->lconv_mon_refcount = 1; @@ -1210,37 +1184,29 @@ static MSVCRT_pthreadlocinfo create_locinfo(int category, |LOCALE_NOUSEROVERRIDE, buf, 256); if(i && (locinfo->lconv->int_curr_symbol = MSVCRT_malloc(i))) memcpy(locinfo->lconv->int_curr_symbol, buf, i); - else { - free_locinfo(locinfo); - return NULL; - } + else + goto failed;
i = GetLocaleInfoA(lcid[MSVCRT_LC_MONETARY], LOCALE_SCURRENCY |LOCALE_NOUSEROVERRIDE, buf, 256); if(i && (locinfo->lconv->currency_symbol = MSVCRT_malloc(i))) memcpy(locinfo->lconv->currency_symbol, buf, i); - else { - free_locinfo(locinfo); - return NULL; - } + else + goto failed;
i = GetLocaleInfoA(lcid[MSVCRT_LC_MONETARY], LOCALE_SMONDECIMALSEP |LOCALE_NOUSEROVERRIDE, buf, 256); if(i && (locinfo->lconv->mon_decimal_point = MSVCRT_malloc(i))) memcpy(locinfo->lconv->mon_decimal_point, buf, i); - else { - free_locinfo(locinfo); - return NULL; - } + else + goto failed;
i = GetLocaleInfoA(lcid[MSVCRT_LC_MONETARY], LOCALE_SMONTHOUSANDSEP |LOCALE_NOUSEROVERRIDE, buf, 256); if(i && (locinfo->lconv->mon_thousands_sep = MSVCRT_malloc(i))) memcpy(locinfo->lconv->mon_thousands_sep, buf, i); - else { - free_locinfo(locinfo); - return NULL; - } + else + goto failed;
i = GetLocaleInfoA(lcid[MSVCRT_LC_MONETARY], LOCALE_SMONGROUPING |LOCALE_NOUSEROVERRIDE, buf, 256); @@ -1252,153 +1218,117 @@ static MSVCRT_pthreadlocinfo create_locinfo(int category, locinfo->lconv->mon_grouping[i/2] = buf[i]-'0'; if(buf[i] != '0') locinfo->lconv->mon_grouping[i/2+1] = 127; - } else { - free_locinfo(locinfo); - return NULL; - } + } else + goto failed;
i = GetLocaleInfoA(lcid[MSVCRT_LC_MONETARY], LOCALE_SPOSITIVESIGN |LOCALE_NOUSEROVERRIDE, buf, 256); if(i && (locinfo->lconv->positive_sign = MSVCRT_malloc(i))) memcpy(locinfo->lconv->positive_sign, buf, i); - else { - free_locinfo(locinfo); - return NULL; - } + else + goto failed;
i = GetLocaleInfoA(lcid[MSVCRT_LC_MONETARY], LOCALE_SNEGATIVESIGN |LOCALE_NOUSEROVERRIDE, buf, 256); if(i && (locinfo->lconv->negative_sign = MSVCRT_malloc(i))) memcpy(locinfo->lconv->negative_sign, buf, i); - else { - free_locinfo(locinfo); - return NULL; - } + else + goto failed;
if(GetLocaleInfoA(lcid[MSVCRT_LC_MONETARY], LOCALE_IINTLCURRDIGITS |LOCALE_NOUSEROVERRIDE, buf, 256)) locinfo->lconv->int_frac_digits = atoi(buf); - else { - free_locinfo(locinfo); - return NULL; - } + else + goto failed;
if(GetLocaleInfoA(lcid[MSVCRT_LC_MONETARY], LOCALE_ICURRDIGITS |LOCALE_NOUSEROVERRIDE, buf, 256)) locinfo->lconv->frac_digits = atoi(buf); - else { - free_locinfo(locinfo); - return NULL; - } + else + goto failed;
if(GetLocaleInfoA(lcid[MSVCRT_LC_MONETARY], LOCALE_IPOSSYMPRECEDES |LOCALE_NOUSEROVERRIDE, buf, 256)) locinfo->lconv->p_cs_precedes = atoi(buf); - else { - free_locinfo(locinfo); - return NULL; - } + else + goto failed;
if(GetLocaleInfoA(lcid[MSVCRT_LC_MONETARY], LOCALE_IPOSSEPBYSPACE |LOCALE_NOUSEROVERRIDE, buf, 256)) locinfo->lconv->p_sep_by_space = atoi(buf); - else { - free_locinfo(locinfo); - return NULL; - } + else + goto failed;
if(GetLocaleInfoA(lcid[MSVCRT_LC_MONETARY], LOCALE_INEGSYMPRECEDES |LOCALE_NOUSEROVERRIDE, buf, 256)) locinfo->lconv->n_cs_precedes = atoi(buf); - else { - free_locinfo(locinfo); - return NULL; - } + else + goto failed;
if(GetLocaleInfoA(lcid[MSVCRT_LC_MONETARY], LOCALE_INEGSEPBYSPACE |LOCALE_NOUSEROVERRIDE, buf, 256)) locinfo->lconv->n_sep_by_space = atoi(buf); - else { - free_locinfo(locinfo); - return NULL; - } + else + goto failed;
if(GetLocaleInfoA(lcid[MSVCRT_LC_MONETARY], LOCALE_IPOSSIGNPOSN |LOCALE_NOUSEROVERRIDE, buf, 256)) locinfo->lconv->p_sign_posn = atoi(buf); - else { - free_locinfo(locinfo); - return NULL; - } + else + goto failed;
if(GetLocaleInfoA(lcid[MSVCRT_LC_MONETARY], LOCALE_INEGSIGNPOSN |LOCALE_NOUSEROVERRIDE, buf, 256)) locinfo->lconv->n_sign_posn = atoi(buf); - else { - free_locinfo(locinfo); - return NULL; - } + else + goto failed;
#if _MSVCR_VER >= 100 i = GetLocaleInfoW(lcid[MSVCRT_LC_MONETARY], LOCALE_SINTLSYMBOL |LOCALE_NOUSEROVERRIDE, wbuf, 256); if(i && (locinfo->lconv->_W_int_curr_symbol = MSVCRT_malloc(i * sizeof(MSVCRT_wchar_t)))) memcpy(locinfo->lconv->_W_int_curr_symbol, wbuf, i * sizeof(MSVCRT_wchar_t)); - else { - free_locinfo(locinfo); - return NULL; - } + else + goto failed;
i = GetLocaleInfoW(lcid[MSVCRT_LC_MONETARY], LOCALE_SCURRENCY |LOCALE_NOUSEROVERRIDE, wbuf, 256); if(i && (locinfo->lconv->_W_currency_symbol = MSVCRT_malloc(i * sizeof(MSVCRT_wchar_t)))) memcpy(locinfo->lconv->_W_currency_symbol, wbuf, i * sizeof(MSVCRT_wchar_t)); - else { - free_locinfo(locinfo); - return NULL; - } + else + goto failed;
i = GetLocaleInfoW(lcid[MSVCRT_LC_MONETARY], LOCALE_SMONDECIMALSEP |LOCALE_NOUSEROVERRIDE, wbuf, 256); if(i && (locinfo->lconv->_W_mon_decimal_point = MSVCRT_malloc(i * sizeof(MSVCRT_wchar_t)))) memcpy(locinfo->lconv->_W_mon_decimal_point, wbuf, i * sizeof(MSVCRT_wchar_t)); - else { - free_locinfo(locinfo); - return NULL; - } + else + goto failed;
i = GetLocaleInfoW(lcid[MSVCRT_LC_MONETARY], LOCALE_SMONTHOUSANDSEP |LOCALE_NOUSEROVERRIDE, wbuf, 256); if(i && (locinfo->lconv->_W_mon_thousands_sep = MSVCRT_malloc(i * sizeof(MSVCRT_wchar_t)))) memcpy(locinfo->lconv->_W_mon_thousands_sep, wbuf, i * sizeof(MSVCRT_wchar_t)); - else { - free_locinfo(locinfo); - return NULL; - } + else + goto failed;
i = GetLocaleInfoW(lcid[MSVCRT_LC_MONETARY], LOCALE_SPOSITIVESIGN |LOCALE_NOUSEROVERRIDE, wbuf, 256); if(i && (locinfo->lconv->_W_positive_sign = MSVCRT_malloc(i * sizeof(MSVCRT_wchar_t)))) memcpy(locinfo->lconv->_W_positive_sign, wbuf, i * sizeof(MSVCRT_wchar_t)); - else { - free_locinfo(locinfo); - return NULL; - } + else + goto failed;
i = GetLocaleInfoW(lcid[MSVCRT_LC_MONETARY], LOCALE_SNEGATIVESIGN |LOCALE_NOUSEROVERRIDE, wbuf, 256); if(i && (locinfo->lconv->_W_negative_sign = MSVCRT_malloc(i * sizeof(MSVCRT_wchar_t)))) memcpy(locinfo->lconv->_W_negative_sign, wbuf, i * sizeof(MSVCRT_wchar_t)); - else { - free_locinfo(locinfo); - return NULL; - } + else + goto failed; #endif
- if(!set_lc_locale_name(locinfo, MSVCRT_LC_MONETARY)) { - free_locinfo(locinfo); - return NULL; - } + if(!set_lc_locale_name(locinfo, MSVCRT_LC_MONETARY)) + goto failed; } else { locinfo->lconv->int_curr_symbol = MSVCRT_malloc(sizeof(char)); locinfo->lconv->currency_symbol = MSVCRT_malloc(sizeof(char)); @@ -1411,10 +1341,8 @@ static MSVCRT_pthreadlocinfo create_locinfo(int category, if(!locinfo->lconv->int_curr_symbol || !locinfo->lconv->currency_symbol || !locinfo->lconv->mon_decimal_point || !locinfo->lconv->mon_thousands_sep || !locinfo->lconv->mon_grouping || !locinfo->lconv->positive_sign - || !locinfo->lconv->negative_sign) { - free_locinfo(locinfo); - return NULL; - } + || !locinfo->lconv->negative_sign) + goto failed;
locinfo->lconv->int_curr_symbol[0] = '\0'; locinfo->lconv->currency_symbol[0] = '\0'; @@ -1442,10 +1370,8 @@ static MSVCRT_pthreadlocinfo create_locinfo(int category,
if(!locinfo->lconv->_W_int_curr_symbol || !locinfo->lconv->_W_currency_symbol || !locinfo->lconv->_W_mon_decimal_point || !locinfo->lconv->_W_mon_thousands_sep - || !locinfo->lconv->positive_sign || !locinfo->lconv->negative_sign) { - free_locinfo(locinfo); - return NULL; - } + || !locinfo->lconv->positive_sign || !locinfo->lconv->negative_sign) + goto failed;
locinfo->lconv->_W_int_curr_symbol[0] = '\0'; locinfo->lconv->_W_currency_symbol[0] = '\0'; @@ -1460,10 +1386,8 @@ static MSVCRT_pthreadlocinfo create_locinfo(int category,
if(locale_name[MSVCRT_LC_NUMERIC] && !init_category_name(locale_name[MSVCRT_LC_NUMERIC], - locale_len[MSVCRT_LC_NUMERIC], locinfo, MSVCRT_LC_NUMERIC)) { - free_locinfo(locinfo); - return NULL; - } + locale_len[MSVCRT_LC_NUMERIC], locinfo, MSVCRT_LC_NUMERIC)) + goto failed;
if(!category_needs_update(MSVCRT_LC_NUMERIC, category, old_locinfo, lcid[MSVCRT_LC_NUMERIC], cp[MSVCRT_LC_NUMERIC])) { @@ -1471,18 +1395,14 @@ static MSVCRT_pthreadlocinfo create_locinfo(int category, locinfo->lc_id[MSVCRT_LC_NUMERIC].wCodePage = old_locinfo->lc_id[MSVCRT_LC_NUMERIC].wCodePage; } else if(lcid[MSVCRT_LC_NUMERIC] && (category==MSVCRT_LC_ALL || category==MSVCRT_LC_NUMERIC)) { if(!update_threadlocinfo_category(lcid[MSVCRT_LC_NUMERIC], - cp[MSVCRT_LC_NUMERIC], locinfo, MSVCRT_LC_NUMERIC)) { - free_locinfo(locinfo); - return NULL; - } + cp[MSVCRT_LC_NUMERIC], locinfo, MSVCRT_LC_NUMERIC)) + goto failed;
if(!locinfo->lconv_intl_refcount) locinfo->lconv_intl_refcount = MSVCRT_malloc(sizeof(int)); locinfo->lconv_num_refcount = MSVCRT_malloc(sizeof(int)); - if(!locinfo->lconv_intl_refcount || !locinfo->lconv_num_refcount) { - free_locinfo(locinfo); - return NULL; - } + if(!locinfo->lconv_intl_refcount || !locinfo->lconv_num_refcount) + goto failed;
*locinfo->lconv_intl_refcount = 1; *locinfo->lconv_num_refcount = 1; @@ -1491,19 +1411,15 @@ static MSVCRT_pthreadlocinfo create_locinfo(int category, |LOCALE_NOUSEROVERRIDE, buf, 256); if(i && (locinfo->lconv->decimal_point = MSVCRT_malloc(i))) memcpy(locinfo->lconv->decimal_point, buf, i); - else { - free_locinfo(locinfo); - return NULL; - } + else + goto failed;
i = GetLocaleInfoA(lcid[MSVCRT_LC_NUMERIC], LOCALE_STHOUSAND |LOCALE_NOUSEROVERRIDE, buf, 256); if(i && (locinfo->lconv->thousands_sep = MSVCRT_malloc(i))) memcpy(locinfo->lconv->thousands_sep, buf, i); - else { - free_locinfo(locinfo); - return NULL; - } + else + goto failed;
i = GetLocaleInfoA(lcid[MSVCRT_LC_NUMERIC], LOCALE_SGROUPING |LOCALE_NOUSEROVERRIDE, buf, 256); @@ -1515,44 +1431,34 @@ static MSVCRT_pthreadlocinfo create_locinfo(int category, locinfo->lconv->grouping[i/2] = buf[i]-'0'; if(buf[i] != '0') locinfo->lconv->grouping[i/2+1] = 127; - } else { - free_locinfo(locinfo); - return NULL; - } + } else + goto failed;
#if _MSVCR_VER >= 100 i = GetLocaleInfoW(lcid[MSVCRT_LC_NUMERIC], LOCALE_SDECIMAL |LOCALE_NOUSEROVERRIDE, wbuf, 256); if(i && (locinfo->lconv->_W_decimal_point = MSVCRT_malloc(i * sizeof(MSVCRT_wchar_t)))) memcpy(locinfo->lconv->_W_decimal_point, wbuf, i * sizeof(MSVCRT_wchar_t)); - else { - free_locinfo(locinfo); - return NULL; - } + else + goto failed;
i = GetLocaleInfoW(lcid[MSVCRT_LC_NUMERIC], LOCALE_STHOUSAND |LOCALE_NOUSEROVERRIDE, wbuf, 256); if(i && (locinfo->lconv->_W_thousands_sep = MSVCRT_malloc(i * sizeof(MSVCRT_wchar_t)))) memcpy(locinfo->lconv->_W_thousands_sep, wbuf, i * sizeof(MSVCRT_wchar_t)); - else { - free_locinfo(locinfo); - return NULL; - } + else + goto failed; #endif
- if(!set_lc_locale_name(locinfo, MSVCRT_LC_NUMERIC)) { - free_locinfo(locinfo); - return NULL; - } + if(!set_lc_locale_name(locinfo, MSVCRT_LC_NUMERIC)) + goto failed; } else { locinfo->lconv->decimal_point = MSVCRT_malloc(sizeof(char[2])); locinfo->lconv->thousands_sep = MSVCRT_malloc(sizeof(char)); locinfo->lconv->grouping = MSVCRT_malloc(sizeof(char)); if(!locinfo->lconv->decimal_point || !locinfo->lconv->thousands_sep - || !locinfo->lconv->grouping) { - free_locinfo(locinfo); - return NULL; - } + || !locinfo->lconv->grouping) + goto failed;
locinfo->lconv->decimal_point[0] = '.'; locinfo->lconv->decimal_point[1] = '\0'; @@ -1563,10 +1469,8 @@ static MSVCRT_pthreadlocinfo create_locinfo(int category, locinfo->lconv->_W_decimal_point = MSVCRT_malloc(sizeof(MSVCRT_wchar_t[2])); locinfo->lconv->_W_thousands_sep = MSVCRT_malloc(sizeof(MSVCRT_wchar_t));
- if(!locinfo->lconv->_W_decimal_point || !locinfo->lconv->_W_thousands_sep) { - free_locinfo(locinfo); - return NULL; - } + if(!locinfo->lconv->_W_decimal_point || !locinfo->lconv->_W_thousands_sep) + goto failed;
locinfo->lconv->_W_decimal_point[0] = '.'; locinfo->lconv->_W_decimal_point[1] = '\0'; @@ -1578,10 +1482,8 @@ static MSVCRT_pthreadlocinfo create_locinfo(int category,
if(locale_name[MSVCRT_LC_TIME] && !init_category_name(locale_name[MSVCRT_LC_TIME], - locale_len[MSVCRT_LC_TIME], locinfo, MSVCRT_LC_TIME)) { - free_locinfo(locinfo); - return NULL; - } + locale_len[MSVCRT_LC_TIME], locinfo, MSVCRT_LC_TIME)) + goto failed;
if(!category_needs_update(MSVCRT_LC_TIME, category, old_locinfo, lcid[MSVCRT_LC_TIME], cp[MSVCRT_LC_TIME])) { @@ -1592,15 +1494,11 @@ static MSVCRT_pthreadlocinfo create_locinfo(int category,
if(lcid[MSVCRT_LC_TIME] && (category==MSVCRT_LC_ALL || category==MSVCRT_LC_TIME)) { if(!update_threadlocinfo_category(lcid[MSVCRT_LC_TIME], - cp[MSVCRT_LC_TIME], locinfo, MSVCRT_LC_TIME)) { - free_locinfo(locinfo); - return NULL; - } + cp[MSVCRT_LC_TIME], locinfo, MSVCRT_LC_TIME)) + goto failed;
- if(!set_lc_locale_name(locinfo, MSVCRT_LC_TIME)) { - free_locinfo(locinfo); - return NULL; - } + if(!set_lc_locale_name(locinfo, MSVCRT_LC_TIME)) + goto failed; } else locinfo->lc_category[MSVCRT_LC_TIME].locale = MSVCRT__strdup("C");
@@ -1613,17 +1511,13 @@ static MSVCRT_pthreadlocinfo create_locinfo(int category, size += sizeof(cloc_long_date) + sizeof(cloc_long_dateW); }else { ret = GetLocaleInfoA(lcid_tmp, time_data[i]|flags, NULL, 0); - if(!ret) { - free_locinfo(locinfo); - return NULL; - } + if(!ret) + goto failed; size += ret;
ret = GetLocaleInfoW(lcid_tmp, time_data[i]|flags, NULL, 0); - if(!ret) { - free_locinfo(locinfo); - return NULL; - } + if(!ret) + goto failed; size += ret*sizeof(MSVCRT_wchar_t); } } @@ -1632,10 +1526,8 @@ static MSVCRT_pthreadlocinfo create_locinfo(int category, #endif
locinfo->lc_time_curr = MSVCRT_malloc(size); - if(!locinfo->lc_time_curr) { - free_locinfo(locinfo); - return NULL; - } + if(!locinfo->lc_time_curr) + goto failed;
ret = 0; for(i=0; i<ARRAY_SIZE(time_data); i++) { @@ -1680,6 +1572,10 @@ static MSVCRT_pthreadlocinfo create_locinfo(int category, }
return locinfo; + +failed: + free_locinfo(locinfo); + return NULL; }
/*********************************************************************