diff options
author | Joshua M. Clulow <jmc@joyent.com> | 2013-01-08 06:02:12 +0000 |
---|---|---|
committer | Joshua M. Clulow <jmc@joyent.com> | 2013-01-08 06:04:06 +0000 |
commit | 64e3b53009bc06fc60381558426612f1d1de0c5b (patch) | |
tree | 6f800483fd05d605c6c0a50b26bdfbf228b7d33b | |
parent | e5cceaaaf353c60b9b65fecb6102b607e3972847 (diff) | |
download | illumos-joyent-64e3b53009bc06fc60381558426612f1d1de0c5b.tar.gz |
OS-1792 dbuf_read_impl shows too much enthusiasm
Reviewed by: Bryan Cantrill <bryan@joyent.com>
-rw-r--r-- | usr/src/uts/common/fs/zfs/dbuf.c | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/usr/src/uts/common/fs/zfs/dbuf.c b/usr/src/uts/common/fs/zfs/dbuf.c index e8bf55c321..098a8b4b04 100644 --- a/usr/src/uts/common/fs/zfs/dbuf.c +++ b/usr/src/uts/common/fs/zfs/dbuf.c @@ -22,6 +22,7 @@ * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. * Copyright 2011 Nexenta Systems, Inc. All rights reserved. * Copyright (c) 2012 by Delphix. All rights reserved. + * Copyright (c) 2013, Joyent, Inc. All rights reserved. */ #include <sys/zfs_context.h> @@ -532,8 +533,19 @@ dbuf_read_impl(dmu_buf_impl_t *db, zio_t *zio, uint32_t *flags) arc_space_consume(DN_MAX_BONUSLEN, ARC_SPACE_OTHER); if (bonuslen < DN_MAX_BONUSLEN) bzero(db->db.db_data, DN_MAX_BONUSLEN); - if (bonuslen) - bcopy(DN_BONUS(dn->dn_phys), db->db.db_data, bonuslen); + + if (bonuslen) { + /* + * Absent byzantine on-disk corruption, we fully expect + * our bonuslen to be no more than DN_MAX_BONUSLEN -- + * but we nonetheless explicitly clamp it on the bcopy() + * to prevent any on-disk corruption from becoming + * rampant in-kernel corruption. + */ + bcopy(DN_BONUS(dn->dn_phys), db->db.db_data, + MIN(bonuslen, DN_MAX_BONUSLEN)); + } + DB_DNODE_EXIT(db); dbuf_update_data(db); db->db_state = DB_CACHED; |