From: <iro...@us...> - 2004-02-19 00:46:50
|
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); |