bug-gnulib
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

striconveha module: bug fixes


From: Bruno Haible
Subject: striconveha module: bug fixes
Date: Wed, 24 Jan 2007 01:45:07 +0100 (MET)
User-agent: KMail/1.5.4

This fixes two bugs in the new striconveha module.

2007-01-23  Bruno Haible  <address@hidden>

        * lib/striconveha.c (mem_iconveha): Fix endless recursion. Try all
        encodings without forgiving before trying any encoding with handler.
        (str_iconveha): Try all encodings without forgiving before trying any
        encoding with handler.

*** lib/striconveha.c   23 Jan 2007 01:09:41 -0000      1.2
--- lib/striconveha.c   24 Jan 2007 00:43:54 -0000
***************
*** 163,175 ****
        for (alias = autodetect_list; alias != NULL; alias = alias->next)
        if (strcmp (from_codeset, alias->name) == 0)
          {
!           const char * const *encodings = alias->encodings_to_try;
  
            do
              {
                retval = mem_iconveha (src, srclen,
!                                      from_codeset, to_codeset, handler,
!                                      offsets, resultp, lengthp);
                if (!(retval < 0 && errno == EILSEQ))
                  return retval;
                encodings++;
--- 163,194 ----
        for (alias = autodetect_list; alias != NULL; alias = alias->next)
        if (strcmp (from_codeset, alias->name) == 0)
          {
!           const char * const *encodings;
  
+           if (handler != iconveh_error)
+             {
+               /* First try all encodings without any forgiving.  */
+               encodings = alias->encodings_to_try;
+               do
+                 {
+                   retval = mem_iconveha (src, srclen,
+                                          *encodings, to_codeset,
+                                          iconveh_error, offsets,
+                                          resultp, lengthp);
+                   if (!(retval < 0 && errno == EILSEQ))
+                     return retval;
+                   encodings++;
+                 }
+               while (*encodings != NULL);
+             }
+ 
+           encodings = alias->encodings_to_try;
            do
              {
                retval = mem_iconveha (src, srclen,
!                                      *encodings, to_codeset,
!                                      handler, offsets,
!                                      resultp, lengthp);
                if (!(retval < 0 && errno == EILSEQ))
                  return retval;
                encodings++;
***************
*** 204,214 ****
        for (alias = autodetect_list; alias != NULL; alias = alias->next)
        if (strcmp (from_codeset, alias->name) == 0)
          {
!           const char * const *encodings = alias->encodings_to_try;
  
            do
              {
!               result = str_iconveha (src, *encodings, to_codeset, handler);
                if (!(result == NULL && errno == EILSEQ))
                  return result;
                encodings++;
--- 223,252 ----
        for (alias = autodetect_list; alias != NULL; alias = alias->next)
        if (strcmp (from_codeset, alias->name) == 0)
          {
!           const char * const *encodings;
! 
!           if (handler != iconveh_error)
!             {
!               /* First try all encodings without any forgiving.  */
!               encodings = alias->encodings_to_try;
!               do
!                 {
!                   result = str_iconveha (src,
!                                          *encodings, to_codeset,
!                                          iconveh_error);
!                   if (!(result == NULL && errno == EILSEQ))
!                     return result;
!                   encodings++;
!                 }
!               while (*encodings != NULL);
!             }
  
+           encodings = alias->encodings_to_try;
            do
              {
!               result = str_iconveha (src,
!                                      *encodings, to_codeset,
!                                      handler);
                if (!(result == NULL && errno == EILSEQ))
                  return result;
                encodings++;





reply via email to

[Prev in Thread] Current Thread [Next in Thread]