From 8a6d4448257320ce8afc67ecea25b434f094a304 Mon Sep 17 00:00:00 2001 From: Jorgen Lundman Date: Sat, 6 Mar 2021 05:22:57 +0900 Subject: [PATCH] Fix abd_get_offset_struct() may allocate new abd Even when supplied with an abd to abd_get_offset_struct(), the call to abd_get_offset_impl() can allocate a different abd. Ensure to call abd_fini_struct() on the abd that is not used. Reviewed-by: Brian Behlendorf Signed-off-by: Jorgen Lundman Closes #11683 --- module/zfs/abd.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/module/zfs/abd.c b/module/zfs/abd.c index 7d3a2f6d69..1e6645c90c 100644 --- a/module/zfs/abd.c +++ b/module/zfs/abd.c @@ -555,8 +555,12 @@ abd_get_offset_impl(abd_t *abd, abd_t *sabd, size_t off, size_t size) abd_t * abd_get_offset_struct(abd_t *abd, abd_t *sabd, size_t off, size_t size) { + abd_t *result; abd_init_struct(abd); - return (abd_get_offset_impl(abd, sabd, off, size)); + result = abd_get_offset_impl(abd, sabd, off, size); + if (result != abd) + abd_fini_struct(abd); + return (result); } abd_t *