--- unac.c.orig	2010-01-30 08:58:40.000000000 +0100
+++ unac.c	2011-10-12 08:31:28.000000000 +0200
@@ -10661,7 +10661,7 @@
 	    if(errno == E2BIG)
 	      /* fall thru to the E2BIG case below */;
 	    else
-	      return -1;
+		goto err;
 	  } else {
 	    /* The offending character was replaced by a SPACE, skip it. */
 	    in += 2;
@@ -10670,7 +10670,7 @@
 	    break;
 	  }
 	} else {
-	  return -1;
+	  goto err;
 	}
       case E2BIG:
 	{
@@ -10690,7 +10690,7 @@
 		      DEBUG("realloc %d bytes failed\n", out_size+1);
 		  free(saved);
 		  *outp = 0;
-		  return -1;
+		  goto err;
 	      }
 	  }
 	  out = out_base + length;
@@ -10698,7 +10698,7 @@
 	}
 	break;
       default:
-	return -1;
+	goto err;
 	break;
       }
     }
@@ -10710,6 +10710,9 @@
   (*outp)[*out_lengthp] = '\0';
 
   return 0;
+err:
+  iconv_close(cd);
+  return -1;
 }
 
 int unacmaybefold_string(const char* charset,

