diff options
author | Philipp Reisner | 2011-05-17 10:12:56 +0200 |
---|---|---|
committer | Philipp Reisner | 2012-11-08 16:55:53 +0100 |
commit | 7aca6c754976f2813a3fcc2f5068b8fe09eb219c (patch) | |
tree | 05126a224e185c86b0d47df56462a97e53ce4e5f /drivers/block/drbd/drbd_receiver.c | |
parent | drbd: Made cmp_after_sb() more generic into convert_after_sb() (diff) | |
download | kernel-qcow2-linux-7aca6c754976f2813a3fcc2f5068b8fe09eb219c.tar.gz kernel-qcow2-linux-7aca6c754976f2813a3fcc2f5068b8fe09eb219c.tar.xz kernel-qcow2-linux-7aca6c754976f2813a3fcc2f5068b8fe09eb219c.zip |
drbd: Allocation of int_dig_in and int_dig_vv was missing
Signed-off-by: Philipp Reisner <philipp.reisner@linbit.com>
Signed-off-by: Lars Ellenberg <lars.ellenberg@linbit.com>
Diffstat (limited to 'drivers/block/drbd/drbd_receiver.c')
-rw-r--r-- | drivers/block/drbd/drbd_receiver.c | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/drivers/block/drbd/drbd_receiver.c b/drivers/block/drbd/drbd_receiver.c index b5eeb8de407b..61b57fc48679 100644 --- a/drivers/block/drbd/drbd_receiver.c +++ b/drivers/block/drbd/drbd_receiver.c @@ -3004,6 +3004,7 @@ static int receive_protocol(struct drbd_tconn *tconn, struct packet_info *pi) int p_proto, p_after_sb_0p, p_after_sb_1p, p_after_sb_2p; int p_discard_my_data, p_two_primaries, cf; struct net_conf *nc; + void *int_dig_in = NULL, *int_dig_vv = NULL; p_proto = be32_to_cpu(p->protocol); p_after_sb_0p = be32_to_cpu(p->after_sb_0p); @@ -3026,6 +3027,8 @@ static int receive_protocol(struct drbd_tconn *tconn, struct packet_info *pi) integrity_alg[SHARED_SECRET_MAX-1] = 0; if (integrity_alg[0]) { + int hash_size; + tfm = crypto_alloc_hash(integrity_alg, 0, CRYPTO_ALG_ASYNC); if (!tfm) { conn_err(tconn, "peer data-integrity-alg %s not supported\n", @@ -3033,11 +3036,23 @@ static int receive_protocol(struct drbd_tconn *tconn, struct packet_info *pi) goto disconnect; } conn_info(tconn, "peer data-integrity-alg: %s\n", integrity_alg); + + hash_size = crypto_hash_digestsize(tfm); + int_dig_in = kmalloc(hash_size, GFP_KERNEL); + int_dig_vv = kmalloc(hash_size, GFP_KERNEL); + if (!(int_dig_in && int_dig_vv)) { + crypto_free_hash(tfm); + goto disconnect; + } } if (tconn->peer_integrity_tfm) crypto_free_hash(tconn->peer_integrity_tfm); tconn->peer_integrity_tfm = tfm; + kfree(tconn->int_dig_in); + kfree(tconn->int_dig_vv); + tconn->int_dig_in = int_dig_in; + tconn->int_dig_vv = int_dig_vv; } clear_bit(CONN_DRY_RUN, &tconn->flags); |