@@ -143,11 +143,19 @@ ossl_PKCS7_SIGNER_INFO_dup(PKCS7_SIGNER_INFO *si)
143
143
}
144
144
145
145
static PKCS7_RECIP_INFO *
146
- ossl_PKCS7_RECIP_INFO_dup (PKCS7_RECIP_INFO * si )
146
+ ossl_PKCS7_RECIP_INFO_dup (PKCS7_RECIP_INFO * ri )
147
147
{
148
- return ASN1_dup ((i2d_of_void * )i2d_PKCS7_RECIP_INFO ,
149
- (d2i_of_void * )d2i_PKCS7_RECIP_INFO ,
150
- si );
148
+ PKCS7_RECIP_INFO * ri_new = ASN1_dup ((i2d_of_void * )i2d_PKCS7_RECIP_INFO ,
149
+ (d2i_of_void * )d2i_PKCS7_RECIP_INFO ,
150
+ ri );
151
+ if (ri_new && ri -> cert ) {
152
+ if (!X509_up_ref (ri -> cert )) {
153
+ PKCS7_RECIP_INFO_free (ri_new );
154
+ return NULL ;
155
+ }
156
+ ri_new -> cert = ri -> cert ;
157
+ }
158
+ return ri_new ;
151
159
}
152
160
153
161
static VALUE
@@ -840,30 +848,38 @@ ossl_pkcs7_add_data(VALUE self, VALUE data)
840
848
PKCS7 * pkcs7 ;
841
849
BIO * out , * in ;
842
850
char buf [4096 ];
843
- int len ;
851
+ int len , ret ;
844
852
845
853
GetPKCS7 (self , pkcs7 );
846
- if (PKCS7_type_is_signed (pkcs7 )){
847
- if (!PKCS7_content_new (pkcs7 , NID_pkcs7_data ))
848
- ossl_raise (ePKCS7Error , NULL );
854
+ if (PKCS7_type_is_signed (pkcs7 )) {
855
+ if (!PKCS7_content_new (pkcs7 , NID_pkcs7_data ))
856
+ ossl_raise (ePKCS7Error , "PKCS7_content_new" );
849
857
}
850
858
in = ossl_obj2bio (& data );
851
- if (!(out = PKCS7_dataInit (pkcs7 , NULL ))) goto err ;
852
- for (;;){
853
- if ((len = BIO_read (in , buf , sizeof (buf ))) <= 0 )
854
- break ;
855
- if (BIO_write (out , buf , len ) != len )
856
- goto err ;
859
+ if (!(out = PKCS7_dataInit (pkcs7 , NULL ))) {
860
+ BIO_free (in );
861
+ ossl_raise (ePKCS7Error , "PKCS7_dataInit" );
857
862
}
858
- if (!PKCS7_dataFinal (pkcs7 , out )) goto err ;
859
- ossl_pkcs7_set_data (self , Qnil );
860
-
861
- err :
863
+ for (;;) {
864
+ if ((len = BIO_read (in , buf , sizeof (buf ))) <= 0 )
865
+ break ;
866
+ if (BIO_write (out , buf , len ) != len ) {
867
+ BIO_free_all (out );
868
+ BIO_free (in );
869
+ ossl_raise (ePKCS7Error , "BIO_write" );
870
+ }
871
+ }
872
+ if (BIO_flush (out ) <= 0 ) {
873
+ BIO_free_all (out );
874
+ BIO_free (in );
875
+ ossl_raise (ePKCS7Error , "BIO_flush" );
876
+ }
877
+ ret = PKCS7_dataFinal (pkcs7 , out );
862
878
BIO_free_all (out );
863
879
BIO_free (in );
864
- if ( ERR_peek_error ()){
865
- ossl_raise (ePKCS7Error , NULL );
866
- }
880
+ if (! ret )
881
+ ossl_raise (ePKCS7Error , "PKCS7_dataFinal" );
882
+ ossl_pkcs7_set_data ( self , Qnil );
867
883
868
884
return data ;
869
885
}
0 commit comments