Hello,

I executed the following command on an X86 64bit Windows2003 Server (see full 
specifications at the bottom):

$ ./openssl.exe  rsa -in ../test/openssl/crypto/url/test_data/certchainfull.der 
-text -noout -inform DER

and got an application error in rsa_lib.c, function RSA_free():

        if (r->meth->finish)
                r->meth->finish(r);


Analyzing the code I find out that r->meth was set to zero. This should never 
be the
case so I tried to find out where the memory of &r->meth has been overwritten.

The problem lies in the fact, that the type 'long' has a size of 4 bytes on 
x84/64bit, but
a pointer 8 bytes (as expected). In the file rsa.h you have the following 
struct:

struct rsa_st
        {
        /* The first parameter is used to pickup errors where
         * this is passed instead of aEVP_PKEY, it is set to 0 */
        int pad;
        long version;
        const RSA_METHOD *meth;
        /* functional reference if 'meth' is ENGINE-provided */
        ENGINE *engine;
        .
        .
        .
        }
        
        
When reading the inputfile the function asn1_template_ex_d2i() (file 
tasn_dec.c) is called:
static int asn1_template_ex_d2i(ASN1_VALUE **val,
                                const unsigned char **in, long inlen,
                                const ASN1_TEMPLATE *tt, char opt,
                                                        ASN1_TLC *ctx);
                                                        
In our case *val is the address if the field 'version' in the 'struct rsa_st' 
above.
If an error occurs, at the end of the function '*val' is set to NULL:
        *val = NULL;

but this will write 8 bytes into the pointer so that the field 'meth' (which 
just
follows 'version'), will be set to 0x0000 as well.

You may temporally solve the problem by putting a dummy-long between the field 
'version'
and the field 'meth', but you still may have problem on other structs.


I personally thing, the setting of
        *val = NULL;
is not necessary, because this should have be done in the 
ASN1_template_free()-function.


Please let me know if and how you will fix the bug.

With kind regards
        Paolo
        
OpenSSL version: output of 'openssl version -a'
        OpenSSL 0.9.8i 15 Sep 2008
        built on: Thu Mar 12 11:31:33 2009
        platform: VC-WIN64A
        options:  bn(64,64) md2(int) rc4(ptr,int) des(idx,cisc,4,long) 
idea(int) blowfish(idx)
        compiler: cl -DDEBUG  /MD /Ox /W3 /Gs0 /GF /Gy /nologo 
-DWIN32_LEAN_AND_MEAN -DL_ENDIAN -DDSO_WIN32 -DOPENSSL_SYSNAME_WIN32 
-DOPENSSL_SYSNAME_WINNT -DUNICODE -D_UNICODE -D_CRT_SECURE_NO_DEPRECATE 
-D_CRT_NONSTDC_NO_DEPRECATE -DOPENSSL_USE_APPLINK -I. /Fdout32dll 
-DOPENSSL_NO_CAMELLIA -DOPENSSL_NO_SEED -DOPENSSL_NO_RC5 -DOPENSSL_NO_MDC2 
-DOPENSSL_NO_TLSEXT -DOPENSSL_NO_CMS -DOPENSSL_NO_CAPIENG -DOPENSSL_NO_KRB5 
-DOPENSSL_NO_DYNAMIC_ENGINE
        OPENSSLDIR: "/usr/local/ssl"

OS Name, Version, Hardware platform:
        Microsoft Windows Server 2003
        Enterprise X64 Edition
        Service Pack 2
        
Compiler Details (name, version):
        Visual C++ 6.0 with SDK X64 Debug Build Environment


--
 AdNovum Informatik AG
 Paolo Ganci, Senior Software Engineer
 Dipl. El.-Ing. ETH

 Roentgenstrasse 22, CH-8005 Zurich
 mailto:paolo.ga...@adnovum.ch
 phone: +41 44 272 6111, fax: +41 44 272 6312
 http://www.adnovum.ch

 AdNovum Locations: Bern, Budapest, San Mateo, Zurich (HQ)



______________________________________________________________________
OpenSSL Project                                 http://www.openssl.org
Development Mailing List                       openssl-dev@openssl.org
Automated List Manager                           majord...@openssl.org

Reply via email to