* keyserver.c (parse_keyserver_uri): If there is a path present, set the
[gnupg.git] / g10 / free-packet.c
index f8d86fe..be49bb5 100644 (file)
@@ -1,6 +1,6 @@
 /* free-packet.c - cleanup stuff for packets
- * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003
- *                                             Free Software Foundation, Inc.
+ * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003,
+ *               2005  Free Software Foundation, Inc.
  *
  * This file is part of GnuPG.
  *
@@ -16,7 +16,8 @@
  *
  * 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
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
  */
 
 #include <config.h>
@@ -36,7 +37,7 @@
 void
 free_symkey_enc( PKT_symkey_enc *enc )
 {
-    m_free(enc);
+    xfree(enc);
 }
 
 void
@@ -48,7 +49,7 @@ free_pubkey_enc( PKT_pubkey_enc *enc )
        mpi_free(enc->data[0]);
     for(i=0; i < n; i++ )
        mpi_free( enc->data[i] );
-    m_free(enc);
+    xfree(enc);
 }
 
 void
@@ -61,11 +62,18 @@ free_seckey_enc( PKT_signature *sig )
     mpi_free(sig->data[0]);
   for(i=0; i < n; i++ )
     mpi_free( sig->data[i] );
-  
-  m_free(sig->revkey);
-  m_free(sig->hashed);
-  m_free(sig->unhashed);
-  m_free(sig);
+
+  xfree(sig->revkey);
+  xfree(sig->hashed);
+  xfree(sig->unhashed);
+
+  if (sig->pka_info)
+    {
+      xfree (sig->pka_info->uri);
+      xfree (sig->pka_info);
+    }
+
+  xfree(sig);
 }
 
 
@@ -81,7 +89,7 @@ release_public_key_parts( PKT_public_key *pk )
        pk->pkey[i] = NULL;
     }
     if (pk->prefs) {
-        m_free (pk->prefs);
+        xfree (pk->prefs);
         pk->prefs = NULL;
     }
     if (pk->user_id) {
@@ -89,7 +97,7 @@ release_public_key_parts( PKT_public_key *pk )
         pk->user_id = NULL;
     }
     if (pk->revkey) {
-        m_free(pk->revkey);
+        xfree(pk->revkey);
        pk->revkey=NULL;
        pk->numrevkeys=0;
     }
@@ -100,7 +108,7 @@ void
 free_public_key( PKT_public_key *pk )
 {
     release_public_key_parts( pk );
-    m_free(pk);
+    xfree(pk);
 }
 
 
@@ -111,7 +119,7 @@ cp_subpktarea (subpktarea_t *s )
 
     if( !s )
        return NULL;
-    d = m_alloc (sizeof (*d) + s->size - 1 );
+    d = xmalloc (sizeof (*d) + s->size - 1 );
     d->size = s->size;
     d->len = s->len;
     memcpy (d->data, s->data, s->len);
@@ -132,7 +140,7 @@ copy_prefs (const prefitem_t *prefs)
     
     for (n=0; prefs[n].type; n++)
         ;
-    new = m_alloc ( sizeof (*new) * (n+1));
+    new = xmalloc ( sizeof (*new) * (n+1));
     for (n=0; prefs[n].type; n++) {
         new[n].type = prefs[n].type;
         new[n].value = prefs[n].value;
@@ -150,7 +158,7 @@ copy_public_key ( PKT_public_key *d, PKT_public_key *s)
     int n, i;
 
     if( !d )
-       d = m_alloc(sizeof *d);
+       d = xmalloc(sizeof *d);
     memcpy( d, s, sizeof *d );
     d->user_id = scopy_user_id (s->user_id);
     d->prefs = copy_prefs (s->prefs);
@@ -164,7 +172,7 @@ copy_public_key ( PKT_public_key *d, PKT_public_key *s)
     if( !s->revkey && s->numrevkeys )
         BUG();
     if( s->numrevkeys ) {
-        d->revkey = m_alloc(sizeof(struct revocation_key)*s->numrevkeys);
+        d->revkey = xmalloc(sizeof(struct revocation_key)*s->numrevkeys);
         memcpy(d->revkey,s->revkey,sizeof(struct revocation_key)*s->numrevkeys);
     }
     else
@@ -194,13 +202,28 @@ copy_public_parts_to_secret_key( PKT_public_key *pk, PKT_secret_key *sk )
     sk->keyid[1]    = pk->keyid[1];
 }
 
+
+static pka_info_t *
+cp_pka_info (const pka_info_t *s)
+{
+  pka_info_t *d = xmalloc (sizeof *s + strlen (s->email));
+  
+  d->valid = s->valid;
+  d->checked = s->checked;
+  d->uri = s->uri? xstrdup (s->uri):NULL;
+  memcpy (d->fpr, s->fpr, sizeof s->fpr);
+  strcpy (d->email, s->email);
+  return d;
+}
+
+
 PKT_signature *
 copy_signature( PKT_signature *d, PKT_signature *s )
 {
     int n, i;
 
     if( !d )
-       d = m_alloc(sizeof *d);
+       d = xmalloc(sizeof *d);
     memcpy( d, s, sizeof *d );
     n = pubkey_get_nsig( s->pubkey_algo );
     if( !n )
@@ -209,6 +232,7 @@ copy_signature( PKT_signature *d, PKT_signature *s )
        for(i=0; i < n; i++ )
            d->data[i] = mpi_copy( s->data[i] );
     }
+    d->pka_info = s->pka_info? cp_pka_info (s->pka_info) : NULL;
     d->hashed = cp_subpktarea (s->hashed);
     d->unhashed = cp_subpktarea (s->unhashed);
     if(s->numrevkeys)
@@ -252,7 +276,7 @@ void
 free_secret_key( PKT_secret_key *sk )
 {
     release_secret_key_parts( sk );
-    m_free(sk);
+    xfree(sk);
 }
 
 PKT_secret_key *
@@ -261,37 +285,32 @@ copy_secret_key( PKT_secret_key *d, PKT_secret_key *s )
     int n, i;
 
     if( !d )
-       d = m_alloc(sizeof *d);
+       d = xmalloc_secure(sizeof *d);
+    else
+        release_secret_key_parts (d);
     memcpy( d, s, sizeof *d );
     n = pubkey_get_nskey( s->pubkey_algo );
     if( !n )
-      {
-        if (d->skey[0])
-          mpi_free (d->skey[0]);
-       d->skey[0] = mpi_copy(s->skey[0]);
-      }
+       d->skey[0] = mpi_copy(s->skey[0]);
     else {
        for(i=0; i < n; i++ )
-          {
-            if (d->skey[i])
-              mpi_free (d->skey[i]);
-           d->skey[i] = mpi_copy( s->skey[i] );
-          }
+           d->skey[i] = mpi_copy( s->skey[i] );
     }
+
     return d;
 }
 
 void
 free_comment( PKT_comment *rem )
 {
-    m_free(rem);
+    xfree(rem);
 }
 
 void
 free_attributes(PKT_user_id *uid)
 {
-  m_free(uid->attribs);
-  m_free(uid->attrib_data);
+  xfree(uid->attribs);
+  xfree(uid->attrib_data);
 
   uid->attribs=NULL;
   uid->attrib_data=NULL;
@@ -306,9 +325,9 @@ free_user_id (PKT_user_id *uid)
         return;
 
     free_attributes(uid);
-    m_free (uid->prefs);
-    m_free (uid->namehash);
-    m_free (uid);
+    xfree (uid->prefs);
+    xfree (uid->namehash);
+    xfree (uid);
 }
 
 void
@@ -320,7 +339,7 @@ free_compressed( PKT_compressed *zd )
        while( iobuf_read( zd->buf, NULL, 1<<30 ) != -1 )
            ;
     }
-    m_free(zd);
+    xfree(zd);
 }
 
 void
@@ -341,7 +360,7 @@ free_encrypted( PKT_encrypted *ed )
           }
        }
     }
-    m_free(ed);
+    xfree(ed);
 }
 
 
@@ -363,7 +382,7 @@ free_plaintext( PKT_plaintext *pt )
           }
        }
     }
-    m_free(pt);
+    xfree(pt);
 }
 
 /****************
@@ -413,7 +432,7 @@ free_packet( PACKET *pkt )
        free_plaintext( pkt->pkt.plaintext );
        break;
       default:
-       m_free( pkt->pkt.generic );
+       xfree( pkt->pkt.generic );
        break;
     }
     pkt->pkt.generic = NULL;