diff --git a/kernel-module/xt_RTPENGINE.c b/kernel-module/xt_RTPENGINE.c index 9b661d6773..c60864e4c5 100644 --- a/kernel-module/xt_RTPENGINE.c +++ b/kernel-module/xt_RTPENGINE.c @@ -5743,17 +5743,25 @@ static int srtp_decrypt_aes_gcm(struct re_crypto_context *c, iv.seq ^= htons(pkt_idx & 0x00ffffULL); req = aead_request_alloc(c->aead, GFP_ATOMIC); - if (!req) + if (!req) { + if (copy) + kfree(copy); return -ENOMEM; - if (IS_ERR(req)) + } + if (IS_ERR(req)) { + if (copy) + kfree(copy); return PTR_ERR(req); + } sg_init_table(sg, ARRAY_SIZE(sg)); sg_set_buf(&sg[0], r->rtp_header, r->header_len); sg_set_buf(&sg[1], r->payload, r->payload_len); // make copy of payload in case the decyption clobbers it - copy = kmalloc(r->payload_len, GFP_ATOMIC); + if (!copy) + copy = kmalloc(r->payload_len, GFP_ATOMIC); + if (copy) memcpy(copy, r->payload, r->payload_len);