Commit 77ce56e2 authored by Arnd Bergmann's avatar Arnd Bergmann Committed by Jens Axboe

drbd: dynamically allocate shash descriptor

Building with clang and KASAN, we get a warning about an overly large
stack frame on 32-bit architectures:

drivers/block/drbd/drbd_receiver.c:921:31: error: stack frame size of 1280 bytes in function 'conn_connect'
      [-Werror,-Wframe-larger-than=]

We already allocate other data dynamically in this function, so
just do the same for the shash descriptor, which makes up most of
this memory.

Link: https://lore.kernel.org/lkml/20190617132440.2721536-1-arnd@arndb.de/Reviewed-by: default avatarKees Cook <keescook@chromium.org>
Reviewed-by: default avatarRoland Kammerer <roland.kammerer@linbit.com>
Signed-off-by: default avatarArnd Bergmann <arnd@arndb.de>
Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent 327fe1d4
...@@ -5417,7 +5417,7 @@ static int drbd_do_auth(struct drbd_connection *connection) ...@@ -5417,7 +5417,7 @@ static int drbd_do_auth(struct drbd_connection *connection)
unsigned int key_len; unsigned int key_len;
char secret[SHARED_SECRET_MAX]; /* 64 byte */ char secret[SHARED_SECRET_MAX]; /* 64 byte */
unsigned int resp_size; unsigned int resp_size;
SHASH_DESC_ON_STACK(desc, connection->cram_hmac_tfm); struct shash_desc *desc;
struct packet_info pi; struct packet_info pi;
struct net_conf *nc; struct net_conf *nc;
int err, rv; int err, rv;
...@@ -5430,6 +5430,13 @@ static int drbd_do_auth(struct drbd_connection *connection) ...@@ -5430,6 +5430,13 @@ static int drbd_do_auth(struct drbd_connection *connection)
memcpy(secret, nc->shared_secret, key_len); memcpy(secret, nc->shared_secret, key_len);
rcu_read_unlock(); rcu_read_unlock();
desc = kmalloc(sizeof(struct shash_desc) +
crypto_shash_descsize(connection->cram_hmac_tfm),
GFP_KERNEL);
if (!desc) {
rv = -1;
goto fail;
}
desc->tfm = connection->cram_hmac_tfm; desc->tfm = connection->cram_hmac_tfm;
rv = crypto_shash_setkey(connection->cram_hmac_tfm, (u8 *)secret, key_len); rv = crypto_shash_setkey(connection->cram_hmac_tfm, (u8 *)secret, key_len);
...@@ -5571,7 +5578,10 @@ static int drbd_do_auth(struct drbd_connection *connection) ...@@ -5571,7 +5578,10 @@ static int drbd_do_auth(struct drbd_connection *connection)
kfree(peers_ch); kfree(peers_ch);
kfree(response); kfree(response);
kfree(right_response); kfree(right_response);
if (desc) {
shash_desc_zero(desc); shash_desc_zero(desc);
kfree(desc);
}
return rv; return rv;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment