[PATCH] Fix wcsmbs with invalid charsets (take 2)
Jakub Jelinek
jakub@redhat.com
Thu Sep 5 13:31:00 GMT 2002
On Thu, Sep 05, 2002 at 10:20:50PM +0200, Jakub Jelinek wrote:
> When either malloc fails or there is no gconv module for the given charset,
> we end up with endless loop.
> This got broken when I was changing the patch to not test locale
> name against _nl_C_name (in that case was failed: in that if and the rest
> of code in else branch and so both would unlock/exit the function).
> Sorry.
Perhaps nicer variant of the patch which avoids duplicating the unlock
and return in the middle of function...
Both versions of the patch fix the testcase with invalid charset and
in both cases doing setlocale(LC_CTYPE, "cs_CZ"); wcsmbs(NULL, L'\0');
seems to DTRT too.
2002-09-05 Jakub Jelinek <jakub@redhat.com>
* wcsmbs/wcsmbsload.c (__wcsmbs_load_conv): Unlock and return in
case of failure.
--- libc/wcsmbs/wcsmbsload.c.jj 2002-09-03 15:30:40.000000000 +0200
+++ libc/wcsmbs/wcsmbsload.c 2002-09-05 22:26:20.000000000 +0200
@@ -166,10 +166,7 @@ __wcsmbs_load_conv (struct locale_data *
/* Allocate the gconv_fcts structure. */
new_fcts = malloc (sizeof *new_fcts);
if (new_fcts == NULL)
- {
- failed:
- new_category->private.ctype = &__wcsmbs_gconv_fcts_c;
- }
+ goto failed;
/* Get name of charset of the locale. */
charset_name = new_category->values[_NL_ITEM_INDEX(CODESET)].string;
@@ -201,11 +198,14 @@ __wcsmbs_load_conv (struct locale_data *
__gconv_close_transform (new_fcts->towc, new_fcts->towc_nsteps);
free (new_fcts);
- goto failed;
+ failed:
+ new_category->private.ctype = &__wcsmbs_gconv_fcts_c;
+ }
+ else
+ {
+ new_category->private.ctype = new_fcts;
+ new_category->private.cleanup = &_nl_cleanup_ctype;
}
-
- new_category->private.ctype = new_fcts;
- new_category->private.cleanup = &_nl_cleanup_ctype;
}
__libc_lock_unlock (__libc_setlocale_lock);
Jakub
More information about the Libc-hacker
mailing list