Avoid possible double free in export.c.
[gnupg.git] / scd / card-dinsig.c
index 18a67ab..5be0061 100644 (file)
@@ -5,7 +5,7 @@
  *
  * GnuPG is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
+ * the Free Software Foundation; either version 3 of the License, or
  * (at your option) any later version.
  *
  * GnuPG is distributed in the hope that it will be useful,
  * GNU General Public License for more details.
  *
  * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ * along with this program; if not, see <http://www.gnu.org/licenses/>.
  */
 
 /* The German signature law and its bylaw (SigG and SigV) is currently
    used with an interface specification described in DIN V 66291-1.
    The AID to be used is: 'D27600006601'.
 
-   The file IDs for certificates utilize the generic format: 
+   The file IDs for certificates utilize the generic format:
         Cxyz
     C being the hex digit 'C' (12).
     x being the service indicator:
          '8' .. 'D' := C.CA (certificate of a CA issue by the Root-CA).
          'E'        := C.RCA (self certified certificate of the Root-CA).
          'F'        := reserved.
-   
+
    The file IDs used by default are:
    '1F00'  EF.SSD (security service descriptor). [o,o]
    '2F02'  EF.GDO (global data objects) [m,m]
    'A000'  EF.PROT (signature log).  Cyclic file with 20 records of 53 byte.
            Read and update after user authentication. [o,o]
-   'B000'  EF.PK.RCA.DS (public keys of Root-CA).  Size is 512b or size 
+   'B000'  EF.PK.RCA.DS (public keys of Root-CA).  Size is 512b or size
            of keys. [m (unless a 'C00E' is present),m]
    'B001'  EF.PK.CA.DS (public keys of CAs).  Size is 512b or size
            of keys. [o,o]
            with n := 0 .. 7.  Size is 2k or size of cert.  Read and
            update allowed after user authentication. [m,m]
    'C00m'  EF.C.CA.DS (digital signature certificate of CA)
-           with m := 8 .. E.  Size is 1k or size of cert.  Read always 
+           with m := 8 .. E.  Size is 1k or size of cert.  Read always
            allowed, update after uder authentication. [o,o]
    'C100'  EF.C.ICC.AUT (AUT certificate of ICC) [o,m]
    'C108'  EF.C.CA.AUT (AUT certificate of CA) [o,m]
    'D000'  EF.DM (display message) [-,m]
-   
+
    The letters in brackets indicate optional or mandatory files: The
    first for card terminals under full control and the second for
    "business" card terminals.
@@ -99,8 +98,7 @@ dinsig_enum_keypairs (CARD card, int idx,
   int rc;
   unsigned char *buf;
   size_t buflen;
-  KsbaError krc;
-  KsbaCert cert;
+  ksba_cert_t cert;
 
   /* fixme: We should locate the application via the EF(DIR) and not
      assume a Netkey card */
@@ -120,21 +118,21 @@ dinsig_enum_keypairs (CARD card, int idx,
       return rc;
     }
 
-  krc = ksba_cert_init_from_mem (cert, buf, buflen); 
+  rc = ksba_cert_init_from_mem (cert, buf, buflen);
   xfree (buf);
-  if (krc)
+  if (rc)
     {
       log_error ("failed to parse the certificate at idx %d: %s\n",
-                 idx, gpg_strerror (krc));
+                 idx, gpg_strerror (rc));
       ksba_cert_release (cert);
-      return krc;
+      return rc;
     }
   if (card_help_get_keygrip (cert, keygrip))
     {
       log_error ("failed to calculate the keygrip at index %d\n", idx);
       ksba_cert_release (cert);
       return gpg_error (GPG_ERR_CARD);
-    }      
+    }
   ksba_cert_release (cert);
 
   /* return the iD */
@@ -142,13 +140,13 @@ dinsig_enum_keypairs (CARD card, int idx,
     {
       *keyid = xtrymalloc (17);
       if (!*keyid)
-        return out_of_core ();
+        return gpg_error (gpg_err_code_from_errno (errno));
       if (!idx)
         strcpy (*keyid, "DINSIG-DF01.C000");
       else
         strcpy (*keyid, "DINSIG-DF01.C200");
     }
-  
+
   return 0;
 }
 
@@ -173,7 +171,7 @@ dinsig_read_cert (CARD card, const char *certidstr,
     return gpg_error (GPG_ERR_INV_ID);
 
   rc = sc_select_file (card->scard, &path, &file);
-  if (rc) 
+  if (rc)
     {
       log_error ("sc_select_file failed: %s\n", sc_strerror (rc));
       return map_sc_err (rc);
@@ -186,7 +184,7 @@ dinsig_read_cert (CARD card, const char *certidstr,
       return gpg_error (GPG_ERR_CARD);
     }
   if (file->size < 20) /* check against a somewhat arbitrary length */
-    { 
+    {
       log_error ("certificate EF too short\n");
       sc_file_free (file);
       return gpg_error (GPG_ERR_CARD);
@@ -194,11 +192,11 @@ dinsig_read_cert (CARD card, const char *certidstr,
   buf = xtrymalloc (file->size);
   if (!buf)
     {
-      gpg_error_t tmperr = out_of_core ();
+      gpg_error_t tmperr = gpg_error (gpg_err_code_from_errno (errno));
       sc_file_free (file);
       return tmperr;
     }
-      
+
   rc = sc_read_binary (card->scard, 0, buf, file->size, 0);
   if (rc >= 0 && rc != file->size)
     {
@@ -208,7 +206,7 @@ dinsig_read_cert (CARD card, const char *certidstr,
       return gpg_error (GPG_ERR_CARD);
     }
   sc_file_free (file);
-  if (rc < 0) 
+  if (rc < 0)
     {
       log_error ("error reading certificate EF: %s\n", sc_strerror (rc));
       xfree (buf);
@@ -238,7 +236,7 @@ dinsig_read_cert (CARD card, const char *certidstr,
         }
       memmove (buf, buf+9, buflen-9);
       buflen -= 9;
-    } 
+    }
 
   *cert = buf;
   *ncert = buflen;