]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
common/weighted_shuffle: don't feed std::discrete_distribution with all-zero weights
authorRadosław Zarzyński <rzarzyns@redhat.com>
Wed, 30 Aug 2023 13:19:07 +0000 (15:19 +0200)
committerRadoslaw Zarzynski <rzarzyns@redhat.com>
Thu, 11 Jan 2024 20:09:36 +0000 (20:09 +0000)
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 <rzarzyns@redhat.com>
(cherry picked from commit 1b7a7a8df88ffac007dbafdecc131807de66c046)

src/common/weighted_shuffle.h

index 10def0a011a41ecc8a6dd19ca3b88834e72ac2e2..dd8f22da014de4aba2ff5e2930312c0648680227 100644 (file)
@@ -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) {