indent: Fix indentation of read_block in g10/import.c
[gnupg.git] / g10 / free-packet.c
index 670f256..e15ad3f 100644 (file)
  * 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, see <http://www.gnu.org/licenses/>.
+ * along with this program; if not, see <https://www.gnu.org/licenses/>.
  */
 
 #include <config.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
-#include <assert.h>
 
 #include "gpg.h"
-#include "util.h"
+#include "../common/util.h"
 #include "packet.h"
 #include "../common/iobuf.h"
 #include "options.h"
@@ -83,6 +82,7 @@ free_seckey_enc( PKT_signature *sig )
       xfree (sig->pka_info->uri);
       xfree (sig->pka_info);
     }
+  xfree (sig->signers_uid);
 
   xfree(sig);
 }
@@ -114,11 +114,8 @@ release_public_key_parts (PKT_public_key *pk)
       xfree (pk->prefs);
       pk->prefs = NULL;
     }
-  if (pk->user_id)
-    {
-      free_user_id (pk->user_id);
-      pk->user_id = NULL;
-    }
+  free_user_id (pk->user_id);
+  pk->user_id = NULL;
   if (pk->revkey)
     {
       xfree(pk->revkey);
@@ -130,6 +127,11 @@ release_public_key_parts (PKT_public_key *pk)
       xfree (pk->serialno);
       pk->serialno = NULL;
     }
+  if (pk->updateurl)
+    {
+      xfree (pk->updateurl);
+      pk->updateurl = NULL;
+    }
 }
 
 
@@ -222,6 +224,12 @@ copy_public_key (PKT_public_key *d, PKT_public_key *s)
     }
   else
     d->revkey = NULL;
+
+  if (s->serialno)
+    d->serialno = xstrdup (s->serialno);
+  if (s->updateurl)
+    d->updateurl = xstrdup (s->updateurl);
+
   return d;
 }
 
@@ -259,6 +267,8 @@ copy_signature( PKT_signature *d, PKT_signature *s )
     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->signers_uid)
+      d->signers_uid = xstrdup (s->signers_uid);
     if(s->numrevkeys)
       {
        d->revkey=NULL;
@@ -291,6 +301,9 @@ free_comment( PKT_comment *rem )
 void
 free_attributes(PKT_user_id *uid)
 {
+  if (!uid)
+    return;
+
   xfree(uid->attribs);
   xfree(uid->attrib_data);
 
@@ -302,122 +315,177 @@ free_attributes(PKT_user_id *uid)
 void
 free_user_id (PKT_user_id *uid)
 {
-    assert (uid->ref > 0);
-    if (--uid->ref)
-        return;
-
-    free_attributes(uid);
-    xfree (uid->prefs);
-    xfree (uid->namehash);
-    xfree (uid);
+  if (!uid)
+    return;
+
+  log_assert (uid->ref > 0);
+  if (--uid->ref)
+    return;
+
+  free_attributes(uid);
+  xfree (uid->prefs);
+  xfree (uid->namehash);
+  xfree (uid->updateurl);
+  xfree (uid->mbox);
+  xfree (uid);
 }
 
 void
 free_compressed( PKT_compressed *zd )
 {
-    if( zd->buf ) { /* have to skip some bytes */
-       /* don't have any information about the length, so
-        * we assume this is the last packet */
-       while( iobuf_read( zd->buf, NULL, 1<<30 ) != -1 )
-           ;
+  if (!zd)
+    return;
+
+  if (zd->buf)
+    {
+      /* We need to skip some bytes.  Because don't have any
+       * information about the length, so we assume this is the last
+       * packet */
+      while (iobuf_read( zd->buf, NULL, 1<<30 ) != -1)
+        ;
     }
-    xfree(zd);
+  xfree(zd);
 }
 
 void
 free_encrypted( PKT_encrypted *ed )
 {
-    if( ed->buf ) { /* have to skip some bytes */
-       if( ed->is_partial ) {
-           while( iobuf_read( ed->buf, NULL, 1<<30 ) != -1 )
-               ;
+  if (!ed)
+    return;
+
+  if (ed->buf)
+    {
+      /* We need to skip some bytes. */
+      if (ed->is_partial)
+        {
+          while (iobuf_read( ed->buf, NULL, 1<<30 ) != -1)
+            ;
        }
-       else {
-          while( ed->len ) { /* skip the packet */
-              int n = iobuf_read( ed->buf, NULL, ed->len );
-              if( n == -1 )
-                  ed->len = 0;
-              else
-                  ed->len -= n;
-          }
+      else
+        {
+          while (ed->len)
+            {
+              /* Skip the packet. */
+              int n = iobuf_read( ed->buf, NULL, ed->len );
+              if (n == -1)
+                ed->len = 0;
+              else
+                ed->len -= n;
+            }
        }
     }
-    xfree(ed);
+  xfree (ed);
 }
 
 
 void
 free_plaintext( PKT_plaintext *pt )
 {
-    if( pt->buf ) { /* have to skip some bytes */
-       if( pt->is_partial ) {
-           while( iobuf_read( pt->buf, NULL, 1<<30 ) != -1 )
-               ;
-       }
-       else {
-          while( pt->len ) { /* skip the packet */
-              int n = iobuf_read( pt->buf, NULL, pt->len );
-              if( n == -1 )
-                  pt->len = 0;
-              else
-                  pt->len -= n;
-          }
+  if (!pt)
+    return;
+
+  if (pt->buf)
+    { /* We need to skip some bytes.  */
+      if (pt->is_partial)
+        {
+          while (iobuf_read( pt->buf, NULL, 1<<30 ) != -1)
+            ;
+        }
+      else
+        {
+          while( pt->len )
+            { /* Skip the packet.  */
+              int n = iobuf_read( pt->buf, NULL, pt->len );
+              if (n == -1)
+                pt->len = 0;
+              else
+                pt->len -= n;
+            }
        }
     }
-    xfree(pt);
+  xfree (pt);
 }
 
+
 /****************
- * Free the packet in pkt.
+ * Free the packet in PKT.
  */
 void
-free_packet( PACKET *pkt )
+free_packet (PACKET *pkt, parse_packet_ctx_t parsectx)
 {
-    if( !pkt || !pkt->pkt.generic )
-       return;
-
-    if( DBG_MEMORY )
-       log_debug("free_packet() type=%d\n", pkt->pkttype );
-
-    switch( pkt->pkttype ) {
-      case PKT_SIGNATURE:
-       free_seckey_enc( pkt->pkt.signature );
-       break;
-      case PKT_PUBKEY_ENC:
-       free_pubkey_enc( pkt->pkt.pubkey_enc );
-       break;
-      case PKT_SYMKEY_ENC:
-       free_symkey_enc( pkt->pkt.symkey_enc );
-       break;
-      case PKT_PUBLIC_KEY:
-      case PKT_PUBLIC_SUBKEY:
-      case PKT_SECRET_KEY:
-      case PKT_SECRET_SUBKEY:
-       free_public_key (pkt->pkt.public_key);
-       break;
-      case PKT_COMMENT:
-       free_comment( pkt->pkt.comment );
-       break;
-      case PKT_USER_ID:
-       free_user_id( pkt->pkt.user_id );
-       break;
-      case PKT_COMPRESSED:
-       free_compressed( pkt->pkt.compressed);
-       break;
-      case PKT_ENCRYPTED:
-      case PKT_ENCRYPTED_MDC:
-       free_encrypted( pkt->pkt.encrypted );
-       break;
-      case PKT_PLAINTEXT:
-       free_plaintext( pkt->pkt.plaintext );
-       break;
-      default:
-       xfree( pkt->pkt.generic );
-       break;
+  if (!pkt || !pkt->pkt.generic)
+    {
+      if (parsectx && parsectx->last_pkt.pkt.generic)
+        {
+          if (parsectx->free_last_pkt)
+            {
+              free_packet (&parsectx->last_pkt, NULL);
+              parsectx->free_last_pkt = 0;
+            }
+          parsectx->last_pkt.pkttype = 0;
+          parsectx->last_pkt.pkt.generic = NULL;
+        }
+      return;
+    }
+
+  if (DBG_MEMORY)
+    log_debug ("free_packet() type=%d\n", pkt->pkttype);
+
+  /* If we have a parser context holding PKT then do not free the
+   * packet but set a flag that the packet in the parser context is
+   * now a deep copy.  */
+  if (parsectx && !parsectx->free_last_pkt
+      && parsectx->last_pkt.pkttype == pkt->pkttype
+      && parsectx->last_pkt.pkt.generic == pkt->pkt.generic)
+    {
+      parsectx->last_pkt = *pkt;
+      parsectx->free_last_pkt = 1;
+      pkt->pkt.generic = NULL;
+      return;
+    }
+
+  switch (pkt->pkttype)
+    {
+    case PKT_SIGNATURE:
+      free_seckey_enc (pkt->pkt.signature);
+      break;
+    case PKT_PUBKEY_ENC:
+      free_pubkey_enc (pkt->pkt.pubkey_enc);
+      break;
+    case PKT_SYMKEY_ENC:
+      free_symkey_enc (pkt->pkt.symkey_enc);
+      break;
+    case PKT_PUBLIC_KEY:
+    case PKT_PUBLIC_SUBKEY:
+    case PKT_SECRET_KEY:
+    case PKT_SECRET_SUBKEY:
+      free_public_key (pkt->pkt.public_key);
+      break;
+    case PKT_COMMENT:
+      free_comment (pkt->pkt.comment);
+      break;
+    case PKT_USER_ID:
+      free_user_id (pkt->pkt.user_id);
+      break;
+    case PKT_COMPRESSED:
+      free_compressed (pkt->pkt.compressed);
+      break;
+    case PKT_ENCRYPTED:
+    case PKT_ENCRYPTED_MDC:
+      free_encrypted (pkt->pkt.encrypted);
+      break;
+    case PKT_PLAINTEXT:
+      free_plaintext (pkt->pkt.plaintext);
+      break;
+    default:
+      xfree (pkt->pkt.generic);
+      break;
     }
-    pkt->pkt.generic = NULL;
+
+  pkt->pkt.generic = NULL;
 }
 
+
 /****************
  * returns 0 if they match.
  */