struct crypto_skcipher *ctfm;
        const char *cipher_str;
        int keysize;
-       u8 raw_key[FS_MAX_KEY_SIZE];
+       u8 *raw_key = NULL;
        int res;
 
        res = fscrypt_initialize();
        if (res)
                goto out;
 
+       /*
+        * This cannot be a stack buffer because it is passed to the scatterlist
+        * crypto API as part of key derivation.
+        */
+       res = -ENOMEM;
+       raw_key = kmalloc(FS_MAX_KEY_SIZE, GFP_NOFS);
+       if (!raw_key)
+               goto out;
+
        if (fscrypt_dummy_context_enabled(inode)) {
                memset(raw_key, 0x42, FS_AES_256_XTS_KEY_SIZE);
                goto got_key;
        if (res)
                goto out;
 
-       memzero_explicit(raw_key, sizeof(raw_key));
+       kzfree(raw_key);
+       raw_key = NULL;
        if (cmpxchg(&inode->i_crypt_info, NULL, crypt_info) != NULL) {
                put_crypt_info(crypt_info);
                goto retry;
        if (res == -ENOKEY)
                res = 0;
        put_crypt_info(crypt_info);
-       memzero_explicit(raw_key, sizeof(raw_key));
+       kzfree(raw_key);
        return res;
 }