aboutsummaryrefslogtreecommitdiffstats
path: root/g10/free-packet.c
diff options
context:
space:
mode:
Diffstat (limited to 'g10/free-packet.c')
-rw-r--r--g10/free-packet.c81
1 files changed, 56 insertions, 25 deletions
diff --git a/g10/free-packet.c b/g10/free-packet.c
index de3568825..de5b421b6 100644
--- a/g10/free-packet.c
+++ b/g10/free-packet.c
@@ -77,10 +77,18 @@ release_public_key_parts( PKT_public_key *pk )
mpi_free( pk->pkey[i] );
pk->pkey[i] = NULL;
}
+ if (pk->prefs) {
+ m_free (pk->prefs);
+ pk->prefs = NULL;
+ }
if( pk->namehash ) {
m_free(pk->namehash);
pk->namehash = NULL;
}
+ if (pk->user_id) {
+ free_user_id (pk->user_id);
+ pk->user_id = NULL;
+ }
}
@@ -106,24 +114,42 @@ cp_subpktarea (subpktarea_t *s )
return d;
}
+/*
+ * Return a copy of the preferences
+ */
+prefitem_t *
+copy_prefs (const prefitem_t *prefs)
+{
+ size_t n;
+ prefitem_t *new;
+
+ if (!prefs)
+ return NULL;
+
+ for (n=0; prefs[n].type; n++)
+ ;
+ new = m_alloc ( sizeof (*new) * (n+1));
+ for (n=0; prefs[n].type; n++) {
+ new[n].type = prefs[n].type;
+ new[n].value = prefs[n].value;
+ }
+ new[n].type = PREFTYPE_NONE;
+ new[n].value = 0;
+
+ return new;
+}
+
PKT_public_key *
-copy_public_key_new_namehash( PKT_public_key *d, PKT_public_key *s,
- const byte *namehash )
+copy_public_key ( PKT_public_key *d, PKT_public_key *s)
{
int n, i;
if( !d )
d = m_alloc(sizeof *d);
memcpy( d, s, sizeof *d );
- if( namehash ) {
- d->namehash = m_alloc( 20 );
- memcpy(d->namehash, namehash, 20 );
- }
- else if( s->namehash ) {
- d->namehash = m_alloc( 20 );
- memcpy(d->namehash, s->namehash, 20 );
- }
+ d->user_id = scopy_user_id (s->user_id);
+ d->prefs = copy_prefs (s->prefs);
n = pubkey_get_npkey( s->pubkey_algo );
if( !n )
d->pkey[0] = mpi_copy(s->pkey[0]);
@@ -134,12 +160,6 @@ copy_public_key_new_namehash( PKT_public_key *d, PKT_public_key *s,
return d;
}
-PKT_public_key *
-copy_public_key( PKT_public_key *d, PKT_public_key *s )
-{
- return copy_public_key_new_namehash( d, s, NULL );
-}
-
/****************
* Replace all common parts of a sk by the one from the public key.
* This is a hack and a better solution will be to just store the real secret
@@ -183,13 +203,15 @@ copy_signature( PKT_signature *d, PKT_signature *s )
}
+/*
+ * shallow copy of the user ID
+ */
PKT_user_id *
-copy_user_id( PKT_user_id *d, PKT_user_id *s )
+scopy_user_id (PKT_user_id *s)
{
- if( !d )
- d = m_alloc(sizeof *d + s->len - 1 );
- memcpy( d, s, sizeof *d + s->len - 1 );
- return d;
+ if (s)
+ s->ref++;
+ return s;
}
@@ -240,11 +262,17 @@ free_comment( PKT_comment *rem )
}
void
-free_user_id( PKT_user_id *uid )
+free_user_id (PKT_user_id *uid)
{
- if( uid->photo )
- m_free( uid->photo );
- m_free(uid);
+ assert (uid->ref > 0);
+ if (--uid->ref)
+ return;
+
+ if (uid->photo)
+ m_free (uid->photo);
+ if (uid->prefs)
+ m_free (uid->prefs);
+ m_free (uid);
}
void
@@ -466,6 +494,9 @@ cmp_user_ids( PKT_user_id *a, PKT_user_id *b )
{
int res;
+ if ( a == b )
+ return 0;
+
res = a->len - b->len;
if( !res )
res = memcmp( a->name, b->name, a->len );