USB: wusbcore: crypto: Remove VLA usage
authorGustavo A. R. Silva <gustavo@embeddedor.com>
Fri, 16 Mar 2018 13:21:08 +0000 (08:21 -0500)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 16 Mar 2018 14:40:19 +0000 (15:40 +0100)
In preparation to enabling -Wvla, remove VLA and replace it
with dynamic memory allocation instead.

The use of stack Variable Length Arrays needs to be avoided, as they
can be a vector for stack exhaustion, which can be both a runtime bug
or a security flaw. Also, in general, as code evolves it is easy to
lose track of how big a VLA can get. Thus, we can end up having runtime
failures that are hard to debug.

Also, fixed as part of the directive to remove all VLAs from
the kernel: https://lkml.org/lkml/2018/3/7/621

Notice that in this particular case, an alternative to kzalloc is kcalloc,
in which case the code would look as follows instead:

iv = kcalloc(crypto_skcipher_ivsize(tfm_cbc), sizeof(*iv), GFP_KERNEL);

but if the data type of _iv_ never changes, or the type size is always one
byte, kzalloc is good enough.

Signed-off-by: Gustavo A. R. Silva <gustavo@embeddedor.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/usb/wusbcore/crypto.c

index 4c00be2d19932f8f812b09d6eff72562bf87aa40..aff50eb09ca94db7dfb4879c76b905bd9a9c7dab 100644 (file)
@@ -202,7 +202,7 @@ static int wusb_ccm_mac(struct crypto_skcipher *tfm_cbc,
        struct scatterlist sg[4], sg_dst;
        void *dst_buf;
        size_t dst_size;
-       u8 iv[crypto_skcipher_ivsize(tfm_cbc)];
+       u8 *iv;
        size_t zero_padding;
 
        /*
@@ -224,7 +224,9 @@ static int wusb_ccm_mac(struct crypto_skcipher *tfm_cbc,
        if (!dst_buf)
                goto error_dst_buf;
 
-       memset(iv, 0, sizeof(iv));
+       iv = kzalloc(crypto_skcipher_ivsize(tfm_cbc), GFP_KERNEL);
+       if (!iv)
+               goto error_iv;
 
        /* Setup B0 */
        scratch->b0.flags = 0x59;       /* Format B0 */
@@ -276,6 +278,8 @@ static int wusb_ccm_mac(struct crypto_skcipher *tfm_cbc,
        bytewise_xor(mic, &scratch->ax, iv, 8);
        result = 8;
 error_cbc_crypt:
+       kfree(iv);
+error_iv:
        kfree(dst_buf);
 error_dst_buf:
        return result;