Update of /cvsroot/perl-openssl/Crypt/OpenSSL/RSA
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv21248
Modified Files:
RSA.xs
Log Message:
improve error handling, try to not leak memory on errors
Index: RSA.xs
===================================================================
RCS file: /cvsroot/perl-openssl/Crypt/OpenSSL/RSA/RSA.xs,v
retrieving revision 1.49
retrieving revision 1.50
diff -C2 -d -r1.49 -r1.50
*** RSA.xs 18 Feb 2004 22:09:48 -0000 1.49
--- RSA.xs 19 Feb 2004 00:36:49 -0000 1.50
***************
*** 21,24 ****
--- 21,25 ----
#define PACKAGE_NAME "Crypt::OpenSSL::RSA"
+ //FIXME - there may be more than one error on the queue.
#define CHECK_OPEN_SSL(p_result) if (!(p_result)) \
croak("%s:%d: OpenSSL error: %s", \
***************
*** 277,281 ****
CODE:
CHECK_OPEN_SSL(rsa = RSA_generate_key(SvIV(bitsSV), exponent, NULL, NULL))
-
RETVAL = make_rsa_obj(proto, rsa);
OUTPUT:
--- 278,281 ----
***************
*** 299,302 ****
--- 299,304 ----
CODE:
{
+ //FIXME - do a better job of cleaning up in the event of errors
+
if (!(n && e))
{
***************
*** 313,330 ****
{
p = BN_new();
! CHECK_OPEN_SSL(BN_div(p, bn, n, q, ctx))
! if (! BN_is_zero(bn))
! {
! croak("q does not divide n");
! }
}
else if (! q)
{
q = BN_new();
! CHECK_OPEN_SSL(BN_div(q, bn, n, p, ctx))
! if (! BN_is_zero(bn))
! {
! croak("p does not divide n");
! }
}
rsa->p = p;
--- 315,324 ----
{
p = BN_new();
! CHECK_OPEN_SSL(BN_div(p, NULL, n, q, ctx))
}
else if (! q)
{
q = BN_new();
! CHECK_OPEN_SSL(BN_div(q, NULL, n, p, ctx))
}
rsa->p = p;
***************
*** 350,353 ****
--- 344,352 ----
BN_clear_free(p_minus_1);
BN_clear_free(q_minus_1);
+ if (RSA_check_key(rsa) != 1)
+ {
+ RSA_free(rsa);
+ CHECK_OPEN_SSL(0)
+ }
}
else
***************
*** 506,509 ****
--- 505,509 ----
char* digest;
int signature_length;
+ int result;
CODE:
if (! is_private(p_rsa))
***************
*** 515,525 ****
digest = get_message_digest(text_SV, p_rsa->hashMode);
! CHECK_OPEN_SSL(RSA_sign(p_rsa->hashMode,
! digest,
! get_digest_length(p_rsa->hashMode),
! signature,
! &signature_length,
! p_rsa->rsa))
Safefree(digest);
RETVAL = newSVpvn(signature, signature_length);
Safefree(signature);
--- 515,526 ----
digest = get_message_digest(text_SV, p_rsa->hashMode);
! result = RSA_sign(p_rsa->hashMode,
! digest,
! get_digest_length(p_rsa->hashMode),
! signature,
! &signature_length,
! p_rsa->rsa);
Safefree(digest);
+ CHECK_OPEN_SSL(result)
RETVAL = newSVpvn(signature, signature_length);
Safefree(signature);
|