From: Radosław Zarzyński Date: Wed, 30 Aug 2023 13:19:07 +0000 (+0200) Subject: common/weighted_shuffle: don't feed std::discrete_distribution with all-zero weights X-Git-Tag: v16.2.15~31^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=a64443aaeec78ebd53e41e646d65d30232b5b68f;p=ceph.git common/weighted_shuffle: don't feed std::discrete_distribution with all-zero weights This flaw results is the assertions like the following one: ``` /usr/include/c++/11/bits/random.tcc:2667: void std::discrete_distribution<_IntType>::param_type::_M_initialize() [with _IntType = int]: Assertion '__sum > 0' failed. Aborted (core dumped) ``` The reason behind is that `std::discrete_distribution` sums the weights and uses the result as a divisor. Fixes: https://tracker.ceph.com/issues/62645 Signed-off-by: Radosław Zarzyński (cherry picked from commit 1b7a7a8df88ffac007dbafdecc131807de66c046) --- diff --git a/src/common/weighted_shuffle.h b/src/common/weighted_shuffle.h index 10def0a011a4..dd8f22da014d 100644 --- a/src/common/weighted_shuffle.h +++ b/src/common/weighted_shuffle.h @@ -14,6 +14,8 @@ void weighted_shuffle(RandomIt first, RandomIt last, { if (first == last) { return; + } else if (std::accumulate(weight_first, weight_last, 0) == 0) { + return; } else { std::discrete_distribution d{weight_first, weight_last}; if (auto n = d(g); n > 0) {