1
0
mirror of https://github.com/facebookincubator/mvfst.git synced 2025-07-29 03:41:11 +03:00

remove virtual destructor in quic::PriorityQueue::Priority

Summary:
fix for OSS issue reported in https://github.com/facebook/mvfst/issues/382

UndefinedBehaviorSanitizer: dynamic-type-mismatch buck-out/v2/gen/fbcode/12f4c1ea6c843aab/quic/priority/__http_priority_queue__/buck-headers/quic/priority/HTTPPriorityQueue.h:133:9
buck-out/v2/gen/fbcode/12f4c1ea6c843aab/quic/priority/__http_priority_queue__/buck-headers/quic/priority/HTTPPriorityQueue.h:76:23: runtime error: member call on address 0x51a0000026b8 which does not point to an object of type 'quic::HTTPPriorityQueue::Priority'
0x51a0000026b8: note: object is of type 'quic::PriorityQueue::Priority'
 be be be be  10 1b 13 02 00 00 00 00  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  00 00 00 00
              ^~~~~~~~~~~~~~~~~~~~~~~
              vptr for 'quic::PriorityQueue::Priority'
    #0 0x000000e36302 in quic::HTTPPriorityQueue::Priority::operator==(quic::HTTPPriorityQueue::Priority const&) const fbcode/quic/priority/HTTPPriorityQueue.h:76
```

Reviewed By: mjoras

Differential Revision: D73674107

fbshipit-source-id: 4934e404cf6298d6351d4b45f676a8a83838f91f
This commit is contained in:
Hani Damlaj
2025-04-27 23:08:16 -07:00
committed by Facebook GitHub Bot
parent b49e49ed1b
commit 6a52a365ab
3 changed files with 24 additions and 20 deletions

View File

@ -13,6 +13,23 @@ constexpr size_t kDestroyIndexThreshold = 50;
} // namespace
namespace quic {
/*implicit*/ HTTPPriorityQueue::Priority::Priority(
const PriorityQueue::Priority& basePriority)
: PriorityQueue::Priority(basePriority) {
if (!isInitialized()) {
getFields() = kDefaultPriority;
}
}
HTTPPriorityQueue::Priority::Priority(uint8_t u, bool i, OrderId o) {
auto& fields = getFields();
fields.urgency = u;
fields.incremental = i;
fields.order = (i ? 0 : o);
fields.paused = false;
}
PriorityQueue::PriorityLogFields HTTPPriorityQueue::toLogFields(
const PriorityQueue::Priority& pri) const {
// This is defined by the QLOG schema

View File

@ -41,20 +41,9 @@ class HTTPPriorityQueue : public quic::PriorityQueue {
// TODO: change default priority to (3, false, false, 0) to match spec
static constexpr HTTPPriority kDefaultPriority{3, false, true, 0};
/*implicit*/ Priority(const PriorityQueue::Priority& basePriority)
: PriorityQueue::Priority(basePriority) {
if (!isInitialized()) {
getFields() = kDefaultPriority;
}
}
/*implicit*/ Priority(const PriorityQueue::Priority& basePriority);
Priority(uint8_t u, bool i, OrderId o = 0) {
auto& fields = getFields();
fields.urgency = u;
fields.incremental = i;
fields.order = (i ? 0 : o);
fields.paused = false;
}
Priority(uint8_t u, bool i, OrderId o = 0);
enum Paused { PAUSED };
@ -66,7 +55,7 @@ class HTTPPriorityQueue : public quic::PriorityQueue {
Priority& operator=(const Priority&) = default;
Priority(Priority&&) = default;
Priority& operator=(Priority&&) = default;
~Priority() override = default;
~Priority() = default;
const HTTPPriority* operator->() const {
return &getFields();
@ -94,7 +83,7 @@ class HTTPPriorityQueue : public quic::PriorityQueue {
}
[[nodiscard]] uint64_t toUint64() const {
auto& fields = getFields();
const auto& fields = getFields();
return (
(uint64_t(fields.urgency) << 61) | (uint64_t(fields.paused) << 60) |
(uint64_t(fields.incremental) << 59) | fields.order);

View File

@ -122,7 +122,7 @@ class PriorityQueue {
public:
Priority() : storage_{kUninitialized} {}
virtual ~Priority() = default;
~Priority() = default;
[[nodiscard]] bool isInitialized() const {
return storage_ != kUninitialized;
@ -133,16 +133,14 @@ class PriorityQueue {
template <typename T>
T& getPriority() {
static_assert(
std::is_trivially_copyable<T>::value, "T must be trivially copyable");
static_assert(std::is_pod<T>::value, "T must be trivially copyable");
static_assert(sizeof(T) <= sizeof(StorageType), "T must fit in storage_");
return *reinterpret_cast<T*>(storage_.data());
}
template <typename T>
const T& getPriority() const {
static_assert(
std::is_trivially_copyable<T>::value, "T must be trivially copyable");
static_assert(std::is_pod<T>::value, "T must be trivially copyable");
static_assert(sizeof(T) <= sizeof(StorageType), "T must fit in storage_");
return *reinterpret_cast<const T*>(storage_.data());
}