summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorBrooks Davis <[email protected]>2022-11-29 09:51:35 -0800
committerTony Hutter <[email protected]>2022-12-01 12:39:44 -0800
commitc4468a70c35c92b434aeb7efdccc69370b5e2dc8 (patch)
treef3014aae0cb7a4cc34ae9a2e1e12c7b2331c2b1f /lib
parente48aaef89f3eba71da5ce6c12384348a698a5b29 (diff)
Don't leak packed recieved proprties
When local properties (e.g., from -o and -x) are provided, don't leak the packed representation of the received properties due to variable reuse. Reviewed-by: Brian Behlendorf <[email protected]> Signed-off-by: Brooks Davis <[email protected]> Closes #14197
Diffstat (limited to 'lib')
-rw-r--r--lib/libzfs_core/libzfs_core.c17
1 files changed, 10 insertions, 7 deletions
diff --git a/lib/libzfs_core/libzfs_core.c b/lib/libzfs_core/libzfs_core.c
index 855d8cb0a..9b2050c67 100644
--- a/lib/libzfs_core/libzfs_core.c
+++ b/lib/libzfs_core/libzfs_core.c
@@ -890,7 +890,8 @@ recv_impl(const char *snapname, nvlist_t *recvdprops, nvlist_t *localprops,
fnvlist_free(outnvl);
} else {
zfs_cmd_t zc = {"\0"};
- char *packed = NULL;
+ char *rp_packed = NULL;
+ char *lp_packed = NULL;
size_t size;
ASSERT3S(g_refcount, >, 0);
@@ -899,14 +900,14 @@ recv_impl(const char *snapname, nvlist_t *recvdprops, nvlist_t *localprops,
(void) strlcpy(zc.zc_value, snapname, sizeof (zc.zc_value));
if (recvdprops != NULL) {
- packed = fnvlist_pack(recvdprops, &size);
- zc.zc_nvlist_src = (uint64_t)(uintptr_t)packed;
+ rp_packed = fnvlist_pack(recvdprops, &size);
+ zc.zc_nvlist_src = (uint64_t)(uintptr_t)rp_packed;
zc.zc_nvlist_src_size = size;
}
if (localprops != NULL) {
- packed = fnvlist_pack(localprops, &size);
- zc.zc_nvlist_conf = (uint64_t)(uintptr_t)packed;
+ lp_packed = fnvlist_pack(localprops, &size);
+ zc.zc_nvlist_conf = (uint64_t)(uintptr_t)lp_packed;
zc.zc_nvlist_conf_size = size;
}
@@ -941,8 +942,10 @@ recv_impl(const char *snapname, nvlist_t *recvdprops, nvlist_t *localprops,
zc.zc_nvlist_dst_size, errors, KM_SLEEP));
}
- if (packed != NULL)
- fnvlist_pack_free(packed, size);
+ if (rp_packed != NULL)
+ fnvlist_pack_free(rp_packed, size);
+ if (lp_packed != NULL)
+ fnvlist_pack_free(lp_packed, size);
free((void *)(uintptr_t)zc.zc_nvlist_dst);
}