crypto: api - Fix use-after-free and race in crypto_spawn_alg
authorHerbert Xu <herbert@gondor.apana.org.au>
Fri, 10 Apr 2020 06:09:42 +0000 (16:09 +1000)
committerHerbert Xu <herbert@gondor.apana.org.au>
Thu, 16 Apr 2020 06:49:22 +0000 (16:49 +1000)
commit6603523bf5e432c7c8490fb500793bb15d4e5f61
treea55f489fb787cdc482819bcf29a1a0327549637e
parenteebac678556d6927f09a992872f4464cf3aecc76
crypto: api - Fix use-after-free and race in crypto_spawn_alg

There are two problems in crypto_spawn_alg.  First of all it may
return spawn->alg even if spawn->dead is set.  This results in a
double-free as detected by syzbot.

Secondly the setting of the DYING flag is racy because we hold
the read-lock instead of the write-lock.  We should instead call
crypto_shoot_alg in a safe manner by gaining a refcount, dropping
the lock, and then releasing the refcount.

This patch fixes both problems.

Reported-by: syzbot+fc0674cde00b66844470@syzkaller.appspotmail.com
Fixes: 4f87ee118d16 ("crypto: api - Do not zap spawn->alg")
Fixes: 73669cc55646 ("crypto: api - Fix race condition in...")
Cc: <stable@vger.kernel.org>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
crypto/algapi.c
crypto/api.c
crypto/internal.h