In asn1_d2i_read_bio, don't assume BIO_read will
[openssl.git] / crypto / asn1 / a_d2i_fp.c
index a80fbe9ff7f3070687981fd2259ed3ca8d4589ad..cfb56ae265a46279142ec10994c9fabba59b276d 100644 (file)
@@ -166,7 +166,7 @@ static int asn1_d2i_read_bio(BIO *in, BUF_MEM **pb)
                        {
                        want-=(len-off);
 
-                       if (!BUF_MEM_grow(b,len+want))
+                       if (!BUF_MEM_grow_clean(b,len+want))
                                {
                                ASN1err(ASN1_F_ASN1_D2I_BIO,ERR_R_MALLOC_FAILURE);
                                goto err;
@@ -221,18 +221,23 @@ static int asn1_d2i_read_bio(BIO *in, BUF_MEM **pb)
                        if (want > (len-off))
                                {
                                want-=(len-off);
-                               if (!BUF_MEM_grow(b,len+want))
+                               if (!BUF_MEM_grow_clean(b,len+want))
                                        {
                                        ASN1err(ASN1_F_ASN1_D2I_BIO,ERR_R_MALLOC_FAILURE);
                                        goto err;
                                        }
-                               i=BIO_read(in,&(b->data[len]),want);
-                               if (i <= 0)
+                               while (want > 0)
                                        {
-                                       ASN1err(ASN1_F_ASN1_D2I_BIO,ASN1_R_NOT_ENOUGH_DATA);
-                                       goto err;
+                                       i=BIO_read(in,&(b->data[len]),want);
+                                       if (i <= 0)
+                                               {
+                                               ASN1err(ASN1_F_ASN1_D2I_BIO,
+                                                   ASN1_R_NOT_ENOUGH_DATA);
+                                               goto err;
+                                               }
+                                       len+=i;
+                                       want -= i;
                                        }
-                               len+=i;
                                }
                        off+=(int)c.slen;
                        if (eos <= 0)