]> sourceware.org Git - glibc.git/commitdiff
[BZ #5043]
authorUlrich Drepper <drepper@redhat.com>
Sun, 23 Sep 2007 16:01:04 +0000 (16:01 +0000)
committerUlrich Drepper <drepper@redhat.com>
Sun, 23 Sep 2007 16:01:04 +0000 (16:01 +0000)
2007-09-23  Ulrich Drepper  <drepper@redhat.com>
[BZ #5043]
* iconv/iconv_open.c (iconv_open): For large codeset names use malloc.

ChangeLog
iconv/iconv_open.c

index d0dcf629f959441a798a828ea12e5083aca311a6..eff373a9db30ad85c8f49e2ea55dc8834875d07d 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2007-09-23  Ulrich Drepper  <drepper@redhat.com>
+
+       [BZ #5043]
+       * iconv/iconv_open.c (iconv_open): For large codeset names use malloc.
+
 2007-09-21  Ulrich Drepper  <drepper@redhat.com>
 
        * sysdeps/x86_64/cacheinfo.c (__x86_64_data_cache_size_half): Renamed
index fc94fa5fe0f136f5d02a00ada4fe5a75abbfb5a4..e4fed93ecb8eb0facdcd43101240a0fccc594037 100644 (file)
    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
    02111-1307 USA.  */
 
+#include <alloca.h>
 #include <errno.h>
 #include <iconv.h>
+#include <stdbool.h>
 #include <stdlib.h>
 #include <string.h>
 
 iconv_t
 iconv_open (const char *tocode, const char *fromcode)
 {
-  char *tocode_conv;
-  char *fromcode_conv;
-  size_t tocode_len;
-  size_t fromcode_len;
-  __gconv_t cd;
-  int res;
-
   /* Normalize the name.  We remove all characters beside alpha-numeric,
      '_', '-', '/', '.', and ':'.  */
-  tocode_len = strlen (tocode);
-  tocode_conv = (char *) alloca (tocode_len + 3);
+  size_t tocode_len = strlen (tocode) + 3;
+  char *tocode_conv;
+  bool tocode_usealloca = __libc_use_alloca (tocode_len);
+  if (tocode_usealloca)
+    tocode_conv = (char *) alloca (tocode_len);
+  else
+    {
+      tocode_conv = (char *) malloc (tocode_len);
+      if (tocode_conv == NULL)
+       return (iconv_t) -1;
+    }
   strip (tocode_conv, tocode);
   tocode = (tocode_conv[2] == '\0' && tocode[0] != '\0'
            ? upstr (tocode_conv, tocode) : tocode_conv);
 
-  fromcode_len = strlen (fromcode);
-  fromcode_conv = (char *) alloca (fromcode_len + 3);
+  size_t fromcode_len = strlen (fromcode) + 3;
+  char *fromcode_conv;
+  bool fromcode_usealloca = __libc_use_alloca (fromcode_len);
+  if (fromcode_usealloca)
+    fromcode_conv = (char *) alloca (fromcode_len);
+  else
+    {
+      fromcode_conv = (char *) malloc (fromcode_len);
+      if (fromcode_conv == NULL)
+       {
+         if (! tocode_usealloca)
+           free (tocode_conv);
+         return (iconv_t) -1;
+       }
+    }
   strip (fromcode_conv, fromcode);
   fromcode = (fromcode_conv[2] == '\0' && fromcode[0] != '\0'
              ? upstr (fromcode_conv, fromcode) : fromcode_conv);
 
-  res = __gconv_open (tocode, fromcode, &cd, 0);
+  __gconv_t cd;
+  int res = __gconv_open (tocode, fromcode, &cd, 0);
+
+  if (! fromcode_usealloca)
+    free (fromcode_conv);
+  if (! tocode_usealloca)
+    free (tocode_conv);
 
   if (__builtin_expect (res, __GCONV_OK) != __GCONV_OK)
     {
@@ -59,7 +82,7 @@ iconv_open (const char *tocode, const char *fromcode)
       if (res == __GCONV_NOCONV || res == __GCONV_NODB)
        __set_errno (EINVAL);
 
-      return (iconv_t) -1;
+      cd = (iconv_t) -1;
     }
 
   return (iconv_t) cd;
This page took 0.052586 seconds and 5 git commands to generate.