Fix reference counting.
[openssl.git] / crypto / asn1 / x_pubkey.c
index a309cf74a79487335ef6668afb13a8d59cee03f5..a70f53fe6fe0987996cd61134d2377b5c5cd7260 100644 (file)
@@ -61,8 +61,8 @@
 #include "asn1_mac.h"
 
 /*
- * ASN1err(ASN1_F_D2I_X509_PUBKEY,ASN1_R_LENGTH_MISMATCH);
- * ASN1err(ASN1_F_X509_PUBKEY_NEW,ASN1_R_LENGTH_MISMATCH);
+ * ASN1err(ASN1_F_D2I_X509_PUBKEY,ERR_R_ASN1_LENGTH_MISMATCH);
+ * ASN1err(ASN1_F_X509_PUBKEY_NEW,ERR_R_ASN1_LENGTH_MISMATCH);
  */
 
 int i2d_X509_PUBKEY(a,pp)
@@ -104,6 +104,7 @@ long length;
 X509_PUBKEY *X509_PUBKEY_new()
        {
        X509_PUBKEY *ret=NULL;
+       ASN1_CTX c;
 
        M_ASN1_New_Malloc(ret,X509_PUBKEY);
        M_ASN1_New(ret->algor,X509_ALGOR_new);
@@ -187,6 +188,10 @@ EVP_PKEY *pkey;
        p=s;
        i2d_PublicKey(pkey,&p);
        if (!ASN1_BIT_STRING_set(pk->public_key,s,i)) goto err;
+       /* Set number of unused bits to zero */
+       pk->public_key->flags&= ~(ASN1_STRING_FLAG_BITS_LEFT|0x07);
+       pk->public_key->flags|=ASN1_STRING_FLAG_BITS_LEFT;
+
        Free(s);
 
        CRYPTO_add(&pkey->references,1,CRYPTO_LOCK_EVP_PKEY);
@@ -217,7 +222,11 @@ X509_PUBKEY *key;
 
        if (key == NULL) goto err;
 
-       if (key->pkey != NULL) return(key->pkey);
+       if (key->pkey != NULL)
+           {
+           CRYPTO_add(&key->pkey->references,1,CRYPTO_LOCK_EVP_PKEY);
+           return(key->pkey);
+           }
 
        if (key->public_key == NULL) goto err;
 
@@ -247,6 +256,7 @@ X509_PUBKEY *key;
                }
 #endif
        key->pkey=ret;
+       CRYPTO_add(&ret->references,1,CRYPTO_LOCK_EVP_PKEY);
        return(ret);
 err:
        if (ret != NULL)