From 34b7d0837fd93b0064261fae8107a1c86a9704d2 Mon Sep 17 00:00:00 2001 From: Philipp Reisner Date: Tue, 17 May 2011 10:12:56 +0200 Subject: [PATCH] --- yaml --- r: 346069 b: refs/heads/master c: 7aca6c754976f2813a3fcc2f5068b8fe09eb219c h: refs/heads/master i: 346067: 35606149f713803376c00c8c04b52f81b52942ea v: v3 --- [refs] | 2 +- trunk/drivers/block/drbd/drbd_receiver.c | 15 +++++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/[refs] b/[refs] index 233cfa04e86d..fc16b16f7596 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: f179d76d76ce6653ba4c6a6b0c2e7c42215734bc +refs/heads/master: 7aca6c754976f2813a3fcc2f5068b8fe09eb219c diff --git a/trunk/drivers/block/drbd/drbd_receiver.c b/trunk/drivers/block/drbd/drbd_receiver.c index b5eeb8de407b..61b57fc48679 100644 --- a/trunk/drivers/block/drbd/drbd_receiver.c +++ b/trunk/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);