zswap: potential NULL dereference on error in init_zswap()
authorDan Carpenter <dan.carpenter@oracle.com>
Fri, 31 Jan 2020 06:15:07 +0000 (22:15 -0800)
committerLinus Torvalds <torvalds@linux-foundation.org>
Fri, 31 Jan 2020 18:30:39 +0000 (10:30 -0800)
The "pool" pointer can be NULL at the end of the init_zswap().  (We
would allocate a new pool later in that situation)

So in the error handling then we need to make sure pool is a valid
pointer before calling "zswap_pool_destroy(pool);" because that function
dereferences the argument.

Link: http://lkml.kernel.org/r/20200114050902.og32fkllkod5ycf5@kili.mountain
Fixes: 93d4dfa9fbd0 ("mm/zswap.c: add allocation hysteresis if pool limit is hit")
Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
Cc: Vitaly Wool <vitaly.wool@konsulko.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
mm/zswap.c

index 7ec8bd912d13223a398d5142c33e6e63a1e4f03b..55094e63b72d9468e57facb616907de5247f71a2 100644 (file)
@@ -1359,7 +1359,8 @@ static int __init init_zswap(void)
        return 0;
 
 fallback_fail:
-       zswap_pool_destroy(pool);
+       if (pool)
+               zswap_pool_destroy(pool);
 hp_fail:
        cpuhp_remove_state(CPUHP_MM_ZSWP_MEM_PREPARE);
 dstmem_fail: