Hello,

this bug was originally reported at [0], but then closed because it isn't
libidn's fault. However, I was able to make a little modification to libidn
that fixed the problem for me.

The change simply involves replacing strlen()+malloc()+strcpy() with strdup()
(see the attached patch), and AFAICT all the tests pass. So I thought that
maybe you wanted to have a look at it and maybe merge it.

You can verify the problem (and that my patch fixes it) by running the
following command from the libidn git repository:

  $ ./libtool --mode=execute valgrind src/idn -a 'ουτοπία.δπθ.gr'

Without patch it prints something like:

==24305== Invalid read of size 4
==24305==    at 0x4E3A680: idna_to_ascii_4z (idna.c:529)
==24305==    by 0x401B51: main (idn.c:374)
==24305==  Address 0x5412c6c is 12 bytes inside a block of size 15 alloc'd
==24305==    at 0x4C28C20: malloc (in 
/usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==24305==    by 0x4E3A7D3: idna_to_ascii_4z (idna.c:543)
==24305==    by 0x401B51: main (idn.c:374)
==24305== 
==24305== Invalid read of size 4
==24305==    at 0x4E3A695: idna_to_ascii_4z (idna.c:529)
==24305==    by 0x401B51: main (idn.c:374)
==24305==  Address 0x5413028 is 24 bytes inside a block of size 25 alloc'd
==24305==    at 0x4C2AF2E: realloc (in 
/usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==24305==    by 0x4E3A6FA: idna_to_ascii_4z (idna.c:530)
==24305==    by 0x401B51: main (idn.c:374)

Cheers

[0] https://bugs.debian.org/724069
>From 825d93f98648119cab5a392d1d524fbc626b0b40 Mon Sep 17 00:00:00 2001
From: Alessandro Ghedini <alessan...@ghedini.me>
Date: Thu, 4 Jun 2015 11:42:38 +0200
Subject: [PATCH] Use strdup() to duplicate a buffer

This apparently fixes the "Invalid read of size 4" error from valgrind
that was reported at https://bugs.debian.org/724069
---
 lib/idna.c | 4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)

diff --git a/lib/idna.c b/lib/idna.c
index bf93bfe..17774d0 100644
--- a/lib/idna.c
+++ b/lib/idna.c
@@ -539,11 +539,9 @@ idna_to_ascii_4z (const uint32_t * input, char **output, int flags)
 	}
       else
 	{
-	  size_t l = strlen (buf) + 1;
-	  out = (char *) malloc (l);
+	  out = strdup (buf);
 	  if (!out)
 	    return IDNA_MALLOC_ERROR;
-	  strcpy (out, buf);
 	}
 
       start = end + 1;
-- 
2.1.4

_______________________________________________
Help-libidn mailing list
Help-libidn@gnu.org
https://lists.gnu.org/mailman/listinfo/help-libidn

Reply via email to