crypto: skcipher - Fix corner case in crypto_lookup_skcipher
authorHerbert Xu <herbert@gondor.apana.org.au>
Thu, 23 Apr 2015 08:34:47 +0000 (16:34 +0800)
committerHerbert Xu <herbert@gondor.apana.org.au>
Sun, 26 Apr 2015 06:33:15 +0000 (14:33 +0800)
When the user explicitly states that they don't care whether the
algorithm has been tested (type = CRYPTO_ALG_TESTED and mask = 0),
there is a corner case where we may erroneously return ENOENT.

This patch fixes it by correcting the logic in the test.

Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
crypto/ablkcipher.c

index db201bca1581934f4b43bdffda642cec27ff816a..b3dded4558c138e49aebb35a4475e2ac0d7d0214 100644 (file)
@@ -636,7 +636,7 @@ struct crypto_alg *crypto_lookup_skcipher(const char *name, u32 type, u32 mask)
 
        if ((alg->cra_flags & CRYPTO_ALG_TYPE_MASK) ==
            CRYPTO_ALG_TYPE_GIVCIPHER) {
-               if ((alg->cra_flags ^ type ^ ~mask) & CRYPTO_ALG_TESTED) {
+               if (~alg->cra_flags & (type ^ ~mask) & CRYPTO_ALG_TESTED) {
                        crypto_mod_put(alg);
                        alg = ERR_PTR(-ENOENT);
                }