On 2007-02-04 Andreas Metzler <[EMAIL PROTECTED]> wrote:
> On 2007-02-03 William Boughton <[EMAIL PROTECTED]> wrote:
> > On Sat, Feb 03, 2007 at 10:30:59AM +0100, Andreas Metzler wrote:
> [...] 
> >> What arch are you on? I do not see this on etch/ix86.

> > x86_64
> [...]
> > I have been unable to reproduce this on x86_32.  It also doesn't
> > happen in a x86_32 etch chroot on the same machine amd64(x86_64).

> Hello,
> I could reproduce this on pergolesi.debian.org's amd64 chroots with
> 1.4.4 however there is currently some stuff missing for properly
> debugging it. I have emailed debian-admin to get it installed.

I have used LD_LIBRARY_PATH as workaround.
As you have already noted the trrigger is the very last certificate in
the file

-----BEGIN CERTIFICATE-----   <---- note whitespace here!
MIIDmTCCAwKgAwIBAgIJAMyJZWWIII1aMA0GCSqGSIb3DQEBBAUAMIGQMQswCQYD
[...]

The actual crash happens in x509_b64.c:479 _gnutls_fbase64_decode()
since it somehow gets passed on the wrong data_size=1475 (instead of the
correct data_size=1313).

> It seems to be fixed in 1.6.x.
[...]

This patch in 1.6.x and later versions seems to fix the issue:

2006-06-16  Simon Josefsson <[EMAIL PROTECTED]>

        * configure.in, lib/Makefile.am, lib/gnutls_x509.c,
        libextra/gnutls_openpgp.c: Use read_binary_file from gnulib instead
        of strfile stuff, to fix problem with binary files on mingw.

I am not sure about the severity of this bug, whether we should try to
squeeze the fix into etch.

cu and- fix pulled from cvs attached -reas

cvs diff -D 'Jun 16 13:27:36 2006 UTC' -D 'Jun 16 13:33:36 2006 UTC'
-- 
`What a good friend you are to him, Dr. Maturin. His other friends are
so grateful to you.'
`I sew his ears on from time to time, sure'
Index: configure.in
===================================================================
RCS file: /cvs/gnutls/gnutls/configure.in,v
retrieving revision 2.420
retrieving revision 2.421
diff -u -r2.420 -r2.421
--- configure.in	16 Jun 2006 12:16:16 -0000	2.420
+++ configure.in	16 Jun 2006 13:29:35 -0000	2.421
@@ -183,7 +183,7 @@
 AC_CHECK_HEADERS(math.h limits.h float.h stdarg.h ctype.h)
 dnl opencdk
 AC_CHECK_HEADERS(netdb.h)
-AC_CHECK_FUNCS(umask vasprintf isascii mmap gmtime_r,,)
+AC_CHECK_FUNCS(umask vasprintf isascii gmtime_r,,)
 AC_FUNC_ALLOCA
 
 AC_MSG_RESULT([***
Index: lib/Makefile.am
===================================================================
RCS file: /cvs/gnutls/gnutls/lib/Makefile.am,v
retrieving revision 2.181
retrieving revision 2.182
diff -u -r2.181 -r2.182
--- lib/Makefile.am	15 Jun 2006 16:02:11 -0000	2.181
+++ lib/Makefile.am	16 Jun 2006 13:29:36 -0000	2.182
@@ -84,9 +84,9 @@
 	gnutls_extensions.h gnutls_buffer.h gnutls_auth_int.h		\
 	x509_b64.h gnutls_v2_compat.h gnutls_datum.h auth_cert.h	\
 	gnutls_mpi.h gnutls_pk.h gnutls_record.h gnutls_cert.h		\
-	gnutls_constate.h gnutls_global.h strfile.h gnutls_sig.h	\
-	gnutls_mem.h io_debug.h ext_max_record.h gnutls_session_pack.h	\
-	gnutls_str.h gnutls_state.h gnutls_x509.h ext_cert_type.h	\
+	gnutls_constate.h gnutls_global.h gnutls_sig.h gnutls_mem.h	\
+	io_debug.h ext_max_record.h gnutls_session_pack.h gnutls_str.h	\
+	gnutls_state.h gnutls_x509.h ext_cert_type.h			\
 	gnutls_rsa_export.h ext_server_name.h auth_dh_common.h		\
 	ext_srp.h gnutls_srp.h auth_srp.h auth_srp_passwd.h		\
 	gnutls_helper.h auth_psk.h auth_psk_passwd.h			\
Index: lib/gnutls_x509.c
===================================================================
RCS file: /cvs/gnutls/gnutls/lib/gnutls_x509.c,v
retrieving revision 2.174
retrieving revision 2.175
diff -u -r2.174 -r2.175
--- lib/gnutls_x509.c	18 Mar 2006 12:49:09 -0000	2.174
+++ lib/gnutls_x509.c	16 Jun 2006 13:29:36 -0000	2.175
@@ -48,6 +48,7 @@
 #include "x509/mpi.h"
 #include "x509/pkcs7.h"
 #include "x509/privkey.h"
+#include "read-file.h"
 
 /*
  * some x509 certificate parsing functions.
@@ -737,126 +738,6 @@
   return 0;
 }
 
-/* Opens a file reads its contents and stores it
- * in allocated memory, which is returned.
- */
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <errno.h>
-
-#ifdef HAVE_MMAP
-# include <unistd.h>
-# include <sys/mman.h>
-# ifndef MAP_FAILED
-#  define MAP_FAILED (void *)-1L
-# endif
-#endif
-
-#include <strfile.h>
-
-void
-_gnutls_strfile_free (strfile * x)
-{
-#ifdef HAVE_MMAP
-  if (x->mmaped)
-    {
-      munmap (x->data, x->size);
-      return;
-    }
-#endif
-
-  gnutls_free (x->data);
-  x->data = NULL;
-}
-
-strfile
-_gnutls_file_to_str (const char *file)
-{
-  int fd1 = -1;
-  struct stat stat_st;
-  size_t tot_size;
-  size_t left;
-  opaque *tmp;
-  ssize_t i = 0;
-  strfile null = { NULL, 0, 0 };
-  strfile ret = { NULL, 0, 0 };
-
-  fd1 = open (file, 0);
-  if (fd1 == -1)
-    {
-      gnutls_assert ();
-      return null;
-    }
-
-  if (fstat (fd1, &stat_st) == -1)
-    {
-      gnutls_assert ();
-      goto error;
-    }
-
-  tot_size = stat_st.st_size;
-  if (tot_size == 0)
-    {
-      gnutls_assert ();
-      goto error;
-    }
-#ifdef HAVE_MMAP
-  if ((tmp =
-       mmap (NULL, tot_size, PROT_READ, MAP_SHARED, fd1, 0)) != MAP_FAILED)
-    {
-      ret.mmaped = 1;
-      ret.data = tmp;
-      ret.size = tot_size;
-
-      close (fd1);
-      return ret;
-    }
-#endif
-
-  ret.data = gnutls_malloc (tot_size);
-  if (ret.data == NULL)
-    {
-      gnutls_assert ();
-      goto error;
-    }
-
-  left = tot_size;
-  while (left > 0)
-    {
-      i = read (fd1, &ret.data[tot_size - left], left);
-      if (i == -1)
-	{
-	  if (errno == EAGAIN || errno == EINTR)
-	    continue;
-	  else
-	    {
-	      gnutls_assert ();
-	      goto error;
-	    }
-	}
-      else if (i == 0)
-	break;
-
-      left -= i;
-    }
-
-  ret.size = tot_size - left;
-
-  ret.mmaped = 0;
-
-  close (fd1);
-
-  return ret;
-
-error:
-
-  if (!ret.mmaped)
-    gnutls_free (ret.data);
-  close (fd1);
-  return null;
-}
-
 /* Reads a certificate file
  */
 static int
@@ -864,17 +745,17 @@
 		const char *certfile, gnutls_x509_crt_fmt_t type)
 {
   int ret;
-  strfile x;
+  size_t size;
+  char *data = read_binary_file (certfile, &size);
 
-  x = _gnutls_file_to_str (certfile);
-  if (x.data == NULL)
+  if (data == NULL)
     {
       gnutls_assert ();
       return GNUTLS_E_FILE_ERROR;
     }
 
-  ret = read_cert_mem (res, x.data, x.size, type);
-  _gnutls_strfile_free (&x);
+  ret = read_cert_mem (res, data, size, type);
+  free (data);
 
   return ret;
 
@@ -890,17 +771,17 @@
 	       const char *keyfile, gnutls_x509_crt_fmt_t type)
 {
   int ret;
-  strfile x;
+  size_t size;
+  char *data = read_binary_file (keyfile, &size);
 
-  x = _gnutls_file_to_str (keyfile);
-  if (x.data == NULL)
+  if (data == NULL)
     {
       gnutls_assert ();
       return GNUTLS_E_FILE_ERROR;
     }
 
-  ret = read_key_mem (res, x.data, x.size, type);
-  _gnutls_strfile_free (&x);
+  ret = read_key_mem (res, data, size, type);
+  free (data);
 
   return ret;
 }
@@ -1482,10 +1363,10 @@
 					gnutls_x509_crt_fmt_t type)
 {
   int ret, ret2;
-  strfile x;
+  size_t size;
+  char *data = read_binary_file (cafile, &size);
 
-  x = _gnutls_file_to_str (cafile);
-  if (x.data == NULL)
+  if (data == NULL)
     {
       gnutls_assert ();
       return GNUTLS_E_FILE_ERROR;
@@ -1493,12 +1374,12 @@
 
   if (type == GNUTLS_X509_FMT_DER)
     ret = parse_der_ca_mem (&res->x509_ca_list, &res->x509_ncas,
-			    x.data, x.size);
+			    data, size);
   else
     ret = parse_pem_ca_mem (&res->x509_ca_list, &res->x509_ncas,
-			    x.data, x.size);
+			    data, size);
 
-  _gnutls_strfile_free (&x);
+  free (data);
 
   if (ret < 0)
     {
@@ -1776,10 +1657,10 @@
 				      gnutls_x509_crt_fmt_t type)
 {
   int ret;
-  strfile x;
+  size_t size;
+  char *data = read_binary_file (crlfile, &size);
 
-  x = _gnutls_file_to_str (crlfile);
-  if (x.data == NULL)
+  if (data == NULL)
     {
       gnutls_assert ();
       return GNUTLS_E_FILE_ERROR;
@@ -1787,12 +1668,12 @@
 
   if (type == GNUTLS_X509_FMT_DER)
     ret = parse_der_crl_mem (&res->x509_crl_list, &res->x509_ncrls,
-			     x.data, x.size);
+			     data, size);
   else
     ret = parse_pem_crl_mem (&res->x509_crl_list, &res->x509_ncrls,
-			     x.data, x.size);
+			     data, size);
 
-  _gnutls_strfile_free (&x);
+  free (data);
 
   if (ret < 0)
     {
@@ -2000,7 +1881,6 @@
   gnutls_x509_crt_t cert = NULL;
   gnutls_x509_crl_t crl = NULL;
   int ret;
-  strfile x;
 
   ret = gnutls_pkcs12_init (&p12);
   if (ret < 0)
@@ -2009,19 +1889,16 @@
       return ret;
     }
 
-  x = _gnutls_file_to_str (pkcs12file);
-  if (x.data == NULL)
+  p12blob.data = read_binary_file (pkcs12file, &p12blob.size);
+  if (p12blob.data == NULL)
     {
       gnutls_assert ();
       gnutls_pkcs12_deinit (p12);
       return GNUTLS_E_FILE_ERROR;
     }
 
-  p12blob.data = x.data;
-  p12blob.size = x.size;
-
   ret = gnutls_pkcs12_import (p12, &p12blob, type, 0);
-  _gnutls_strfile_free (&x);
+  free (p12blob.data);
   if (ret < 0)
     {
       gnutls_assert ();
Index: lib/strfile.h
===================================================================
RCS file: lib/strfile.h
diff -N lib/strfile.h
--- lib/strfile.h	7 Nov 2005 23:27:59 -0000	2.6
+++ /dev/null	1 Jan 1970 00:00:00 -0000
@@ -1,33 +0,0 @@
-/*
- * Copyright (C) 2000, 2001, 2003, 2004, 2005 Free Software Foundation
- *
- * Author: Nikos Mavroyanopoulos
- *
- * This file is part of GNUTLS.
- *
- * The GNUTLS library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public License
- * as published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
- * USA
- *
- */
-
-typedef struct
-{
-  opaque *data;
-  size_t size;
-  int mmaped;
-} strfile;
-
-void _gnutls_strfile_free (strfile * x);
-strfile _gnutls_file_to_str (const char *file);
Index: libextra/gnutls_openpgp.c
===================================================================
RCS file: /cvs/gnutls/gnutls/libextra/gnutls_openpgp.c,v
retrieving revision 1.103
retrieving revision 1.104
diff -u -r1.103 -r1.104
--- libextra/gnutls_openpgp.c	9 Dec 2005 11:22:14 -0000	1.103
+++ libextra/gnutls_openpgp.c	16 Jun 2006 13:29:36 -0000	1.104
@@ -29,7 +29,7 @@
 #include "gnutls_datum.h"
 #include "gnutls_global.h"
 #include <openpgp/gnutls_openpgp.h>
-#include <strfile.h>
+#include "read-file.h"
 #include <gnutls_str.h>
 #include <stdio.h>
 #include <gcrypt.h>
@@ -723,7 +723,6 @@
   struct stat statbuf;
   int rc = 0;
   gnutls_datum_t key, cert;
-  strfile xcert, xkey;
 
   if (!res || !keyfile || !certfile)
     {
@@ -737,31 +736,25 @@
       return GNUTLS_E_FILE_ERROR;
     }
 
-  xcert = _gnutls_file_to_str (certfile);
-  if (xcert.data == NULL)
+  cert.data = read_binary_file (certfile, &cert.size);
+  if (cert.data == NULL)
     {
       gnutls_assert ();
       return GNUTLS_E_FILE_ERROR;
     }
 
-  xkey = _gnutls_file_to_str (keyfile);
-  if (xkey.data == NULL)
+  key.data = read_binary_file (keyfile, &key.size);
+  if (key.data == NULL)
     {
       gnutls_assert ();
-      _gnutls_strfile_free (&xcert);
+      free (cert.data);
       return GNUTLS_E_FILE_ERROR;
     }
 
-  key.data = xkey.data;
-  key.size = xkey.size;
-
-  cert.data = xcert.data;
-  cert.size = xcert.size;
-
   rc = gnutls_certificate_set_openpgp_key_mem (res, &cert, &key);
 
-  _gnutls_strfile_free (&xcert);
-  _gnutls_strfile_free (&xkey);
+  free (cert.data);
+  free (key.data);
 
   if (rc < 0)
     {

Reply via email to