This is the mail archive of the libc-hacker@sources.redhat.com mailing list for the glibc project.

Note that libc-hacker is a closed list. You may look at the archives of this list, but subscription and posting are not open.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] Fix wcsmbs with invalid charsets (take 2)


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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]