]> git.proxmox.com Git - mirror_zfs.git/commitdiff
Don't leak packed recieved proprties
authorBrooks Davis <brooks@one-eyed-alien.net>
Tue, 29 Nov 2022 17:51:35 +0000 (09:51 -0800)
committerGitHub <noreply@github.com>
Tue, 29 Nov 2022 17:51:35 +0000 (09:51 -0800)
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 <behlendorf1@llnl.gov>
Signed-off-by: Brooks Davis <brooks.davis@sri.com>
Closes #14197

lib/libzfs_core/libzfs_core.c

index 3fe65e665b9c18d5be638729b0a2aa83d36b179d..254f14e043216bdca1df086a9e1bded7583f9562 100644 (file)
@@ -1105,7 +1105,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);
@@ -1114,14 +1115,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;
                }
 
@@ -1156,8 +1157,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);
        }