[PATCH 2/5] msvcrt: Refactor failure code for create_locinfo.

Jeff Smith whydoubt at gmail.com
Mon Dec 2 11:52:01 CST 2019


Signed-off-by: Jeff Smith <whydoubt at 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;
 }
 
 /*********************************************************************
-- 
2.23.0




More information about the wine-devel mailing list