treat 'out' like i2d functions do; cf. asn1_item_flags_i2d (crypto/asn/tasn_enc.c)
authorBodo Möller <bodo@openssl.org>
Fri, 21 Feb 2003 16:06:39 +0000 (16:06 +0000)
committerBodo Möller <bodo@openssl.org>
Fri, 21 Feb 2003 16:06:39 +0000 (16:06 +0000)
crypto/ec/ec_asn1.c

index 927a3716cff251e439e5154d96acfc3ccf9fb5bd..f31ac45d99a1d65753e5b62264a3a874dee88a19 100644 (file)
@@ -1437,7 +1437,8 @@ EC_KEY *o2i_ECPublicKey(EC_KEY **a, const unsigned char **in, long len)
 
 int i2o_ECPublicKey(EC_KEY *a, unsigned char **out)
        {
 
 int i2o_ECPublicKey(EC_KEY *a, unsigned char **out)
        {
-        size_t  buf_len=0;
+        size_t buf_len=0;
+       int new_buffer = 0;
 
         if (a == NULL) 
                {
 
         if (a == NULL) 
                {
@@ -1453,11 +1454,14 @@ int i2o_ECPublicKey(EC_KEY *a, unsigned char **out)
                return buf_len;
 
        if (*out == NULL)
                return buf_len;
 
        if (*out == NULL)
+               {
                if ((*out = OPENSSL_malloc(buf_len)) == NULL)
                        {
                        ECerr(EC_F_I2O_ECPUBLICKEY, ERR_R_MALLOC_FAILURE);
                        return 0;
                        }
                if ((*out = OPENSSL_malloc(buf_len)) == NULL)
                        {
                        ECerr(EC_F_I2O_ECPUBLICKEY, ERR_R_MALLOC_FAILURE);
                        return 0;
                        }
+               new_buffer = 1;
+               }
         if (!EC_POINT_point2oct(a->group, a->pub_key, a->conv_form,
                                *out, buf_len, NULL))
                {
         if (!EC_POINT_point2oct(a->group, a->pub_key, a->conv_form,
                                *out, buf_len, NULL))
                {
@@ -1466,6 +1470,7 @@ int i2o_ECPublicKey(EC_KEY *a, unsigned char **out)
                *out = NULL;
                return 0;
                }
                *out = NULL;
                return 0;
                }
-       *out += buf_len;
+       if (!new_buffer)
+               *out += buf_len;
        return buf_len;
        }
        return buf_len;
        }