[Pkg-openssl-devel] Bug#534685: libssl0.9.8: EX_DATA_CHECK macro gives helgrind errors

Russell Coker russell at coker.com.au
Fri Jun 26 10:43:32 UTC 2009


Package: libssl0.9.8
Version: 0.9.8g-15+lenny1
Severity: normal

==27623== Possible data race during read of size 8 at 0x55ef9d0 by thread #4
==27623==    at 0x52D12A6: def_get_class (ex_data.c:298)
==27623==    by 0x52D180A: int_new_ex_data (ex_data.c:404)
==27623==    by 0x5318BD7: RSA_new_method (rsa_lib.c:185)
==27623==    by 0x531B76C: rsa_cb (rsa_asn1.c:80)
==27623==    by 0x534CB42: asn1_item_ex_combine_new (tasn_new.c:177)
==27623==    by 0x53501E4: ASN1_item_ex_d2i (tasn_dec.c:399)
==27623==    by 0x53502B3: ASN1_item_d2i (tasn_dec.c:134)
==27623==    by 0x534863C: d2i_PublicKey (d2i_pu.c:96)
==27623==    by 0x534624F: X509_PUBKEY_get (x_pubkey.c:364)
==27623==    by 0x5346C07: d2i_PUBKEY (x_pubkey.c:390)
==27623==    by 0x40D480: SelectorInfo::Parse(char*) (dkimverify.cpp:1312)
==27623==    by 0x40E0A4: CDKIMVerify::GetSelector(std::string const&, std::string const&) (dkimverify.cpp:1369)
==27623==  This conflicts with a previous write of size 8 by thread #2
==27623==    at 0x52D140E: def_get_class (ex_data.c:268)
==27623==    by 0x52D180A: int_new_ex_data (ex_data.c:404)
==27623==    by 0x532684F: BIO_set (bio_lib.c:100)
==27623==    by 0x53268D9: BIO_new (bio_lib.c:76)
==27623==    by 0x5326E81: BIO_new_mem_buf (bss_mem.c:102)
==27623==    by 0x4065C4: dk_end (domainkeys.c:1843)
==27623==    by 0x406D22: dk_eom (domainkeys.c:1982)
==27623==    by 0x4034CC: domainkeys_verify(int, char const*, int, unsigned char**, char***) (dkim-test.cpp:218)

I'm getting the above output from valgrind/helgrind on my amd64 system.  Line
298 of ex_data.c is as follows:
        EX_DATA_CHECK(return NULL;)

Here is the definition of EX_DATA_CHECK:

static int ex_data_check(void)
        {
        int toret = 1;
        CRYPTO_w_lock(CRYPTO_LOCK_EX_DATA);
        if(!ex_data && ((ex_data = lh_new(ex_hash_cb, ex_cmp_cb)) == NULL))
                toret = 0;
        CRYPTO_w_unlock(CRYPTO_LOCK_EX_DATA);
        return toret;
        }
/* This macros helps reduce the locking from repeated checks because the
 * ex_data_check() function checks ex_data again inside a lock. */
#define EX_DATA_CHECK(iffail) if(!ex_data && !ex_data_check()) {iffail}

Line 268 of ex_data.c is the "if(!ex_data" line of ex_data_check().

Again it seems that a simple change to the macro would stop this error, the
following definition would do so:
#define EX_DATA_CHECK(iffail) if(!ex_data_check()) {iffail}





More information about the Pkg-openssl-devel mailing list