[svn] GnuPG - r5054 - in trunk: . common scd

svn author wk cvs at cvs.gnupg.org
Mon Jun 29 12:43:57 CEST 2009


Author: wk
Date: 2009-06-29 12:43:57 +0200 (Mon, 29 Jun 2009)
New Revision: 5054

Modified:
   trunk/ChangeLog
   trunk/README.maint
   trunk/common/ChangeLog
   trunk/common/estream.c
   trunk/configure.ac
   trunk/scd/ChangeLog
   trunk/scd/apdu.c
   trunk/scd/app-openpgp.c
Log:
Reworked the estream memory buffer allocation.
Committed already posted patches for the v2 card.


Modified: trunk/ChangeLog
===================================================================
--- trunk/ChangeLog	2009-06-29 08:54:18 UTC (rev 5053)
+++ trunk/ChangeLog	2009-06-29 10:43:57 UTC (rev 5054)
@@ -1,3 +1,12 @@
+2009-06-29  Werner Koch  <wk at g10code.com>
+
+	* configure.ac: Take care of --without-adns.  Suggested by
+	Arfrever Frehtes Taifersar Arahesis.
+
+2009-06-17  Werner Koch  <wk at g10code.com>
+
+	Released 2.0.12.
+
 2009-06-05  David Shaw  <dshaw at jabberwocky.com>
 
 	* configure.ac: Remove Camellia restriction.

Modified: trunk/common/ChangeLog
===================================================================
--- trunk/common/ChangeLog	2009-06-29 08:54:18 UTC (rev 5053)
+++ trunk/common/ChangeLog	2009-06-29 10:43:57 UTC (rev 5054)
@@ -1,5 +1,8 @@
 2009-06-29  Werner Koch  <wk at g10code.com>
 
+	* estream.c (BUFFER_ROUND_TO_BLOCK): Remove unused macro.
+	(es_func_mem_write): Rewrite reallocation part.
+
 	* estream.c (es_write_sanitized_utf8_buffer): Typo typo fix.
 
 2009-06-25  Werner Koch  <wk at g10code.com>

Modified: trunk/scd/ChangeLog
===================================================================
--- trunk/scd/ChangeLog	2009-06-29 08:54:18 UTC (rev 5053)
+++ trunk/scd/ChangeLog	2009-06-29 10:43:57 UTC (rev 5054)
@@ -1,3 +1,8 @@
+2009-06-18  Werner Koch  <wk at g10code.com>
+
+	* app-openpgp.c (verify_chv2): Remove special case for v2 cards.
+	(get_public_key): Use extended mode.
+
 2009-06-17  Werner Koch  <wk at g10code.com>
 
 	* iso7816.c (iso7816_get_data): Add arg EXTENDED_MODE.  Change all

Modified: trunk/README.maint
===================================================================
--- trunk/README.maint	2009-06-29 08:54:18 UTC (rev 5053)
+++ trunk/README.maint	2009-06-29 10:43:57 UTC (rev 5054)
@@ -25,6 +25,7 @@
   * Run "make -C po update-po".
   * Write NEWS entries and set the release date in NEWS.
   * In configure.ac set "my_issvn" to "no".
+  * Put a "Released <version>" line into the top level ChangeLog.
   * Commit all changes to the SVN.
   * Update the SVN then (to sync the release number of all files).
   * Run "./autogen.sh --force"

Modified: trunk/common/estream.c
===================================================================
--- trunk/common/estream.c	2009-06-29 08:54:18 UTC (rev 5053)
+++ trunk/common/estream.c	2009-06-29 10:43:57 UTC (rev 5054)
@@ -1,5 +1,5 @@
 /* estream.c - Extended Stream I/O Library
- * Copyright (C) 2004, 2005, 2006, 2007 g10 Code GmbH
+ * Copyright (C) 2004, 2005, 2006, 2007, 2009 g10 Code GmbH
  *
  * This file is part of Libestream.
  *
@@ -91,12 +91,6 @@
 
 
 
-/* Macros.  */
-
-#define BUFFER_ROUND_TO_BLOCK(size, block_size) \
-
-
-
 /* Locking.  */
 
 #ifdef HAVE_PTH
@@ -400,11 +394,11 @@
 {
   unsigned int modeflags;	/* Open flags.  */
   unsigned char *memory;	/* Allocated data buffer.  */
-  size_t memory_size;		/* Allocated size of memory.  */
-  size_t memory_limit;          /* Maximum allowed allocation size or
-                                   0 for no limit.  */
+  size_t memory_size;		/* Allocated size of MEMORY.  */
+  size_t memory_limit;          /* Caller supplied maximum allowed
+                                   allocation size or 0 for no limit.  */
   size_t offset;		/* Current offset in MEMORY.  */
-  size_t data_len;		/* Length of data in MEMORY.  */
+  size_t data_len;		/* Used length of data in MEMORY.  */
   size_t block_size;		/* Block size.  */
   struct {
     unsigned int grow: 1;	/* MEMORY is allowed to grow.  */
@@ -414,7 +408,11 @@
 } *estream_cookie_mem_t;
 
 
-/* Create function for memory objects.  */
+/* Create function for memory objects.  DATA is either NULL or a user
+   supplied buffer with the initial conetnt of the memory buffer.  If
+   DATA is NULL, DATA_N and DATA_LEN need to be 0 as well.  If DATA is
+   not NULL, DATA_N gives the allocated size of DATA and DATA_LEN the
+   used length in DATA.  */
 static int
 es_func_mem_create (void *ES__RESTRICT *ES__RESTRICT cookie,
 		    unsigned char *ES__RESTRICT data, size_t data_n,
@@ -427,6 +425,12 @@
   estream_cookie_mem_t mem_cookie;
   int err;
 
+  if (!data && (data_n || data_len))
+    {
+      errno = EINVAL;
+      return -1;
+    }
+
   mem_cookie = mem_alloc (sizeof (*mem_cookie));
   if (!mem_cookie)
     err = -1;
@@ -477,6 +481,7 @@
 {
   estream_cookie_mem_t mem_cookie = cookie;
   ssize_t ret;
+  size_t nleft;
 
   if (!size)
     return 0;  /* A flush is a NOP for memory objects.  */
@@ -486,38 +491,45 @@
       /* Append to data.  */
       mem_cookie->offset = mem_cookie->data_len;
     }
-	  
-  if (!mem_cookie->flags.grow)
-    {
-      /* We are not allowed to grow, thus limit the size to the left
-         space.  FIXME: Does the grow flag and its sematics make sense
-         at all? */
-      if (size > mem_cookie->memory_size - mem_cookie->offset)
-        size = mem_cookie->memory_size - mem_cookie->offset;
-    }
 
-  if (size > (mem_cookie->memory_size - mem_cookie->offset))
+  assert (mem_cookie->memory_size >= mem_cookie->offset);
+  nleft = mem_cookie->memory_size - mem_cookie->offset;
+  
+  /* If we are not allowed to grow limit the size to the left space.  */
+  if (!mem_cookie->flags.grow && size > nleft)
+    size = nleft;
+
+  /* Enlarge the memory buffer if needed.  */
+  if (size > nleft)
     {
       unsigned char *newbuf;
       size_t newsize;
-      
-      newsize = mem_cookie->memory_size + mem_cookie->block_size;
-#warning READ the code and see how it should work      
-      newsize = mem_cookie->offset + size;
+
+      if (!mem_cookie->memory_size)
+        newsize = size;  /* Not yet allocated.  */
+      else
+        newsize = mem_cookie->memory_size + (nleft - size);
       if (newsize < mem_cookie->offset)
         {
           errno = EINVAL;
           return -1;
         }
-      newsize += mem_cookie->block_size - 1;
-      if (newsize < mem_cookie->offset)
+
+      /* Round up to the next block length.  BLOCK_SIZE should always
+         be set; we check anyway.  */
+      if (mem_cookie->block_size)
         {
-          errno = EINVAL;
-          return -1;
+          newsize += mem_cookie->block_size - 1;
+          if (newsize < mem_cookie->offset)
+            {
+              errno = EINVAL;
+              return -1;
+            }
+          newsize /= mem_cookie->block_size;
+          newsize *= mem_cookie->block_size;
         }
-      newsize /= mem_cookie->block_size;
-      newsize *= mem_cookie->block_size;
-      
+
+      /* Check for a total limit.  */
       if (mem_cookie->memory_limit && newsize > mem_cookie->memory_limit)
         {
           errno = ENOSPC;
@@ -530,8 +542,11 @@
       
       mem_cookie->memory = newbuf;
       mem_cookie->memory_size = newsize;
+
+      assert (mem_cookie->memory_size >= mem_cookie->offset);
+      nleft = mem_cookie->memory_size - mem_cookie->offset;
       
-      assert (!(size > (mem_cookie->memory_size - mem_cookie->offset)));
+      assert (size <= nleft);
     }
       
   memcpy (mem_cookie->memory + mem_cookie->offset, buffer, size);
@@ -579,7 +594,6 @@
 	{
 	  errno = ENOSPC;
 	  return -1;
-
         }
 
       newsize = pos_new + mem_cookie->block_size - 1;
@@ -590,6 +604,7 @@
         }
       newsize /= mem_cookie->block_size;
       newsize *= mem_cookie->block_size;
+
       if (mem_cookie->memory_limit && newsize > mem_cookie->memory_limit)
         {
           errno = ENOSPC;

Modified: trunk/configure.ac
===================================================================
--- trunk/configure.ac	2009-06-29 08:54:18 UTC (rev 5053)
+++ trunk/configure.ac	2009-06-29 10:43:57 UTC (rev 5054)
@@ -820,11 +820,13 @@
                CPPFLAGS="${CPPFLAGS} -I$withval/include"
                LDFLAGS="${LDFLAGS} -L$withval/lib"
              fi])
-AC_CHECK_HEADERS(adns.h,
+if test "$with_adns" != "no"; then
+  AC_CHECK_HEADERS(adns.h,
                 AC_CHECK_LIB(adns, adns_init,
                              [have_adns=yes],
                              [CPPFLAGS=${_cppflags} LDFLAGS=${_ldflags}]),
                 [CPPFLAGS=${_cppflags} LDFLAGS=${_ldflags}])
+fi
 if test "$have_adns" = "yes"; then
   ADNSLIBS="-ladns" 
 fi

Modified: trunk/scd/apdu.c
===================================================================
--- trunk/scd/apdu.c	2009-06-29 08:54:18 UTC (rev 5053)
+++ trunk/scd/apdu.c	2009-06-29 10:43:57 UTC (rev 5054)
@@ -671,6 +671,9 @@
   while (nleft > 0)
     {
 #ifdef USE_GNU_PTH
+# ifdef HAVE_W32_SYSTEM
+#  error Cannot use pth_read here because it expects a system HANDLE.
+# endif
       n = pth_read (fd, buf, nleft);
 #else
       n = read (fd, buf, nleft);

Modified: trunk/scd/app-openpgp.c
===================================================================
--- trunk/scd/app-openpgp.c	2009-06-29 08:54:18 UTC (rev 5053)
+++ trunk/scd/app-openpgp.c	2009-06-29 10:43:57 UTC (rev 5054)
@@ -1118,11 +1118,25 @@
 
   if (app->card_version > 0x0100)
     {
+      int exmode, le_value;
+
       /* We may simply read the public key out of these cards.  */
+      if (app->app_local->cardcap.ext_lc_le)
+        {
+          exmode = 1;    /* Use extended length.  */
+          le_value = app->app_local->extcap.max_rsp_data;
+        }
+      else
+        {
+          exmode = 0;
+          le_value = 256; /* Use legacy value. */
+        }
+
       err = iso7816_read_public_key 
-        (app->slot, 0, (const unsigned char*)(keyno == 0? "\xB6" :
-                                              keyno == 1? "\xB8" : "\xA4"), 2,  
-         0,
+        (app->slot, exmode,
+         (const unsigned char*)(keyno == 0? "\xB6" :
+                                keyno == 1? "\xB8" : "\xA4"), 2,  
+         le_value,
          &buffer, &buflen);
       if (err)
         {
@@ -1579,43 +1593,31 @@
   char *pinvalue;
 
   if (app->did_chv2) 
-    return 0;  /* We already verified CHV2 (PW1 for v2 cards).  */
+    return 0;  /* We already verified CHV2.  */
 
-  if (app->app_local->extcap.is_v2)
+  rc = verify_a_chv (app, pincb, pincb_arg, 2, 0, &pinvalue);
+  if (rc)
+    return rc;
+  app->did_chv2 = 1;
+  
+  if (!app->did_chv1 && !app->force_chv1 && pinvalue)
     {
-      /* Version two cards don't have a CHV2 anymore.  We need to
-         verify CHV1 (now called PW1) instead.  */
-      rc = verify_a_chv (app, pincb, pincb_arg, 1, 0, &pinvalue);
+      /* For convenience we verify CHV1 here too.  We do this only if
+         the card is not configured to require a verification before
+         each CHV1 controlled operation (force_chv1) and if we are not
+         using the keypad (PINVALUE == NULL). */
+      rc = iso7816_verify (app->slot, 0x81, pinvalue, strlen (pinvalue));
+      if (gpg_err_code (rc) == GPG_ERR_BAD_PIN)
+        rc = gpg_error (GPG_ERR_PIN_NOT_SYNCED);
       if (rc)
-        return rc;
-      app->did_chv2 = 1;
-    }
-  else
-    {
-      /* Version 1 cards only.  */
-      rc = verify_a_chv (app, pincb, pincb_arg, 2, 0, &pinvalue);
-      if (rc)
-        return rc;
-      app->did_chv2 = 1;
-  
-      if (!app->did_chv1 && !app->force_chv1 && pinvalue)
         {
-          /* For convenience we verify CHV1 here too.  We do this only
-             if the card is not configured to require a verification
-             before each CHV1 controlled operation (force_chv1) and if
-             we are not using the keypad (PINVALUE == NULL). */
-          rc = iso7816_verify (app->slot, 0x81, pinvalue, strlen (pinvalue));
-          if (gpg_err_code (rc) == GPG_ERR_BAD_PIN)
-            rc = gpg_error (GPG_ERR_PIN_NOT_SYNCED);
-          if (rc)
-            {
-              log_error (_("verify CHV%d failed: %s\n"), 1, gpg_strerror (rc));
-              flush_cache_after_error (app);
-            }
-          else
-            app->did_chv1 = 1;
+          log_error (_("verify CHV%d failed: %s\n"), 1, gpg_strerror (rc));
+          flush_cache_after_error (app);
         }
+      else
+        app->did_chv1 = 1;
     }
+
   xfree (pinvalue);
 
   return rc;




More information about the Gnupg-commits mailing list