2007-08-07 07:52:21

by Ico

[permalink] [raw]
Subject: OCF triggering kernel BUG()


I've been trying to use OCF in one of my projects, but I run into a nasty
problem I can't seem to solve. I setup a session and call the crypto_dispatch()
function, after which a kernel BUG() occurs in one of the linux crypto.h
functions. There's problably something I forgot or did not properly initialize,
I hope anybody can give me a hint on how to debug and solve this.

The following is an extract of my code involving the crypto library:

zut = kmalloc(sizeof *zut, GFP_ATOMIC);
memset(zut, 0, sizeof(*zut));

memset(&ci, 0, sizeof(ci));
ci.cri_alg = CRYPTO_ARC4;
ci.cri_klen = sizeof(zut->key);
ci.cri_key = zut->key;
r = crypto_newsession(&sid, &ci, 0);
printk("crypto_newsession r=%d sid=%llu\n", r, sid);
if(r != 0) {
printk("crypto_newsession failed %d\n", r);

co = crypto_getreq(1);
printk("co=%p\n", co);
co->crp_sid = sid;
co->crp_ilen = sizeof(zut->text);
co->crp_olen = sizeof(zut->text);
co->crp_callback = hop_done;
co->crp_flags = 0;
co->crp_buf = zut->text;
co->crp_opaque = (void *)zut;

co->crp_desc->crd_skip = 0;
co->crp_desc->crd_len = 32;
co->crp_desc->crd_inject = zut->iv;
co->crp_desc->crd_flags = CRD_F_ENCRYPT;
co->crp_desc->crd_alg = CRYPTO_ARC4;

r = crypto_dispatch(co);
printk("dispatching to %llu, r=%d\n", co->crp_sid, r);

The call to crypto_dispatch results in a kernel BUG message:

kernel BUG at include/linux/crypto.h:364!
[<c00e2bcc>] (__bug+0x0/0x58) from [<bf21d350>] (swcr_process+0xb18/0xc84 [cryptosoft])
[<bf21c838>] (swcr_process+0x0/0xc84 [cryptosoft]) from [<bf118170>] (crypto_invoke+0x17c/0x1a8 [ocf])
[<bf117ff4>] (crypto_invoke+0x0/0x1a8 [ocf]) from [<bf11776c>] (crypto_dispatch+0x154/0x2c8 [ocf])
[<bf117618>] (crypto_dispatch+0x0/0x2c8 [ocf]) from [<bf11f604>] (ebt_crypt_target+0x3a0/0x434 [ebt_crypt])

The snippet from crypto.h:

358: static inline int crypto_cipher_encrypt_iv(struct crypto_tfm *tfm,
359: struct scatterlist *dst,
360: struct scatterlist *src,
361: unsigned int nbytes, u8 *iv)
362: {
363: BUG_ON(crypto_tfm_alg_type(tfm) != CRYPTO_ALG_TYPE_CIPHER);
364: BUG_ON(tfm->crt_cipher.cit_mode == CRYPTO_TFM_MODE_ECB);
365: return tfm->crt_cipher.cit_encrypt_iv(tfm, dst, src, nbytes, iv);
366: }

Any hints ?

Thank you very much for your time,