Fix 0 byte memory leak in zfs receive
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
This commit is contained in:
parent
1a759200e5
commit
960347d3a6
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue