diff options
author | Tom Caputi <[email protected]> | 2018-04-17 14:13:57 -0400 |
---|---|---|
committer | Brian Behlendorf <[email protected]> | 2018-04-17 11:13:57 -0700 |
commit | e14a32b1c844d924b9f093375c0badcf10f61741 (patch) | |
tree | 933a0515c9755a3b8ef854221a45c2de2e1112fc /module/zfs/dmu_send.c | |
parent | 0c03d21ac99ebdbefe65c319fc3712928c40af78 (diff) |
Fix object reclaim when using large dnodes
Currently, when the receive_object() code wants to reclaim an
object, it always assumes that the dnode is the legacy 512 bytes,
even when the incoming bonus buffer exceeds this length. This
causes a buffer overflow if --enable-debug is not provided and
triggers an ASSERT if it is. This patch resolves this issue and
adds an ASSERT to ensure this can't happen again.
Reviewed-by: Brian Behlendorf <[email protected]>
Signed-off-by: Tom Caputi <[email protected]>
Closes #7097
Closes #7433
Diffstat (limited to 'module/zfs/dmu_send.c')
-rw-r--r-- | module/zfs/dmu_send.c | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/module/zfs/dmu_send.c b/module/zfs/dmu_send.c index 6c535e541..6f3f6fde9 100644 --- a/module/zfs/dmu_send.c +++ b/module/zfs/dmu_send.c @@ -2606,9 +2606,10 @@ receive_object(struct receive_writer_arg *rwa, struct drr_object *drro, drro->drr_bonustype != doi.doi_bonus_type || drro->drr_bonuslen != doi.doi_bonus_size) { /* currently allocated, but with different properties */ - err = dmu_object_reclaim(rwa->os, drro->drr_object, + err = dmu_object_reclaim_dnsize(rwa->os, drro->drr_object, drro->drr_type, drro->drr_blksz, - drro->drr_bonustype, drro->drr_bonuslen, tx); + drro->drr_bonustype, drro->drr_bonuslen, + drro->drr_dn_slots << DNODE_SHIFT, tx); } if (err != 0) { dmu_tx_commit(tx); |