bug-gnulib
[Top][All Lists]
Advanced

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

striconveh: fix bug with empty return values


From: Bruno Haible
Subject: striconveh: fix bug with empty return values
Date: Sun, 30 Mar 2008 17:48:32 +0100
User-agent: KMail/1.5.4

On OSF/1 (and possibly other platforms whose malloc(0) can be NULL), the
mem_cd_iconveh function could return a NULL string rather than a "freshly
allocated memory block".

It showed up as a unit test failure on OSF/1.

2008-03-30  Bruno Haible  <address@hidden>

        Avoid failure when attempting to return empty iconv results on some
        platforms.
        * lib/striconveh.c (mem_cd_iconveh_internal): In the final memory
        allocation, don't report ENOMEM when the resulting string is empty.

*** lib/striconveh.c.orig       2008-03-30 18:38:20.000000000 +0200
--- lib/striconveh.c    2008-03-30 18:37:46.000000000 +0200
***************
*** 1,5 ****
  /* Character set conversion with error handling.
!    Copyright (C) 2001-2007 Free Software Foundation, Inc.
     Written by Bruno Haible and Simon Josefsson.
  
     This program is free software: you can redistribute it and/or modify
--- 1,5 ----
  /* Character set conversion with error handling.
!    Copyright (C) 2001-2008 Free Software Foundation, Inc.
     Written by Bruno Haible and Simon Josefsson.
  
     This program is free software: you can redistribute it and/or modify
***************
*** 870,878 ****
    /* Now the final memory allocation.  */
    if (result == tmpbuf)
      {
        char *memory;
  
!       memory = (char *) malloc (length + extra_alloc);
        if (memory != NULL)
        {
          memcpy (memory, tmpbuf, length);
--- 870,879 ----
    /* Now the final memory allocation.  */
    if (result == tmpbuf)
      {
+       size_t memsize = length + extra_alloc;
        char *memory;
  
!       memory = (char *) malloc (memsize > 0 ? memsize : 1);
        if (memory != NULL)
        {
          memcpy (memory, tmpbuf, length);
***************
*** 887,895 ****
    else if (result != *resultp && length + extra_alloc < allocated)
      {
        /* Shrink the allocated memory if possible.  */
        char *memory;
  
!       memory = (char *) realloc (result, length + extra_alloc);
        if (memory != NULL)
        result = memory;
      }
--- 888,897 ----
    else if (result != *resultp && length + extra_alloc < allocated)
      {
        /* Shrink the allocated memory if possible.  */
+       size_t memsize = length + extra_alloc;
        char *memory;
  
!       memory = (char *) realloc (result, memsize > 0 ? memsize : 1);
        if (memory != NULL)
        result = memory;
      }





reply via email to

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