From 031d7c2fe6afaa78943bd0a563b91fc84ace42d7 Mon Sep 17 00:00:00 2001 From: Gvozden Neskovic Date: Wed, 31 Aug 2016 10:12:08 +0200 Subject: fix: Shift exponent too large Undefined operation is reported by running ztest (or zloop) compiled with GCC UndefinedBehaviorSanitizer. Error only happens on top level of dnode indirection with large enough offset values. Logically, left shift operation would work, but bit shift semantics in C, and limitation of uint64_t, do not produce desired result. Issue #5059, #4883 Signed-off-by: Gvozden Neskovic --- include/sys/dbuf.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'include/sys/dbuf.h') diff --git a/include/sys/dbuf.h b/include/sys/dbuf.h index bf546db6f..6262f012e 100644 --- a/include/sys/dbuf.h +++ b/include/sys/dbuf.h @@ -270,7 +270,8 @@ typedef struct dbuf_hash_table { kmutex_t hash_mutexes[DBUF_MUTEXES]; } dbuf_hash_table_t; -uint64_t dbuf_whichblock(struct dnode *di, int64_t level, uint64_t offset); +uint64_t dbuf_whichblock(const struct dnode *di, const int64_t level, + const uint64_t offset); void dbuf_create_bonus(struct dnode *dn); int dbuf_spill_set_blksz(dmu_buf_t *db, uint64_t blksz, dmu_tx_t *tx); -- cgit v1.2.3