Skip to content

Commit

Permalink
Prevent null dereferences when accessing dbuf kstat
Browse files Browse the repository at this point in the history
In arc_buf_info(), the arc_buf_t may have no header.  If not, don't try
to fetch the arc buffer stats and instead just zero them.

The null dereferences were observed while accessing the dbuf kstat with
awk on a system in which millions of small files were being created in
order to overflow the system's metadata limit.

Signed-off-by: Tim Chase <tim@chase2k.com>
Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
Signed-off-by: Chunwei Chen <david.chen@osnexus.com>
Closes #4837
  • Loading branch information
dweeezil authored and behlendorf committed Jul 14, 2016
1 parent 8d9e124 commit 8887c7d
Showing 1 changed file with 7 additions and 3 deletions.
10 changes: 7 additions & 3 deletions module/zfs/arc.c
Original file line number Diff line number Diff line change
Expand Up @@ -1461,16 +1461,20 @@ arc_buf_info(arc_buf_t *ab, arc_buf_info_t *abi, int state_index)
l2arc_buf_hdr_t *l2hdr = NULL;
arc_state_t *state = NULL;

memset(abi, 0, sizeof (arc_buf_info_t));

if (hdr == NULL)
return;

abi->abi_flags = hdr->b_flags;

if (HDR_HAS_L1HDR(hdr)) {
l1hdr = &hdr->b_l1hdr;
state = l1hdr->b_state;
}
if (HDR_HAS_L2HDR(hdr))
l2hdr = &hdr->b_l2hdr;

memset(abi, 0, sizeof (arc_buf_info_t));
abi->abi_flags = hdr->b_flags;

if (l1hdr) {
abi->abi_datacnt = l1hdr->b_datacnt;
abi->abi_access = l1hdr->b_arc_access;
Expand Down

0 comments on commit 8887c7d

Please sign in to comment.