]> git.proxmox.com Git - mirror_zfs.git/commitdiff
Fix 0 byte memory leak in zfs receive
authorTom Caputi <tcaputi@datto.com>
Fri, 18 Jan 2019 19:06:48 +0000 (14:06 -0500)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Fri, 18 Jan 2019 19:06:48 +0000 (11:06 -0800)
Currently, when a DRR_OBJECT record is read into memory in
receive_read_record(), memory is allocated for the bonus buffer.
However, if the object doesn't have a bonus buffer the code will
still "allocate" the zero bytes, but the memory will not be passed
to the processing thread for cleanup later. This causes the spl
kmem tracking code to report a leak. This patch simply changes the
code so that it only allocates this memory if it has a non-zero
length.

Reviewed by: Matt Ahrens <mahrens@delphix.com>
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Signed-off-by: Tom Caputi <tcaputi@datto.com>
Closes #8266

module/zfs/dmu_recv.c

index 257f157fd9958e545ee62a66f7432e276f00a2a3..4ac6f2f17f1447ce6b606cf13aadb1c35486a913 100644 (file)
@@ -1785,6 +1785,8 @@ receive_read_payload_and_next_header(struct receive_arg *ra, int len, void *buf)
                        ra->rrd->payload_size = len;
                        ra->rrd->bytes_read = ra->bytes_read;
                }
+       } else {
+               ASSERT3P(buf, ==, NULL);
        }
 
        ra->prev_cksum = ra->cksum;
@@ -1936,9 +1938,12 @@ receive_read_record(struct receive_arg *ra)
        {
                struct drr_object *drro = &ra->rrd->header.drr_u.drr_object;
                uint32_t size = DRR_OBJECT_PAYLOAD_SIZE(drro);
-               void *buf = kmem_zalloc(size, KM_SLEEP);
+               void *buf = NULL;
                dmu_object_info_t doi;
 
+               if (size != 0)
+                       buf = kmem_zalloc(size, KM_SLEEP);
+
                err = receive_read_payload_and_next_header(ra, size, buf);
                if (err != 0) {
                        kmem_free(buf, size);