diff options
| author | atarasov5 <[email protected]> | 2025-10-16 15:44:01 +0300 |
|---|---|---|
| committer | atarasov5 <[email protected]> | 2025-10-16 16:21:38 +0300 |
| commit | 4d0b02c1e022f3341888e9fe5fda974b260c0c92 (patch) | |
| tree | e63ea98fd4dfd454bde4447e79e1c95864afbaa6 /yql/essentials/minikql/computation/mkql_computation_node_holders.cpp | |
| parent | 5cab3df2e5a4e8aebcf57d0e4edb1bf10889d187 (diff) | |
YQL-20508: Fix unaligned read
commit_hash:1624694e39e7f77993098849f92540b905b7bb59
Diffstat (limited to 'yql/essentials/minikql/computation/mkql_computation_node_holders.cpp')
| -rw-r--r-- | yql/essentials/minikql/computation/mkql_computation_node_holders.cpp | 48 |
1 files changed, 32 insertions, 16 deletions
diff --git a/yql/essentials/minikql/computation/mkql_computation_node_holders.cpp b/yql/essentials/minikql/computation/mkql_computation_node_holders.cpp index bd32a8035d7..d78e6d4702c 100644 --- a/yql/essentials/minikql/computation/mkql_computation_node_holders.cpp +++ b/yql/essentials/minikql/computation/mkql_computation_node_holders.cpp @@ -9,8 +9,8 @@ #include <yql/essentials/minikql/mkql_alloc.h> #include <yql/essentials/minikql/mkql_node_cast.h> #include <yql/essentials/minikql/mkql_string_util.h> - #include <yql/essentials/public/udf/udf_value.h> +#include <yql/essentials/utils/unaligned_read.h> #include <library/cpp/containers/stack_vector/stack_vec.h> #include <util/generic/singleton.h> @@ -2123,18 +2123,34 @@ public: return EState::AtNull == State_ || Iterator_.Ok(); } + void FromUnpack(NUdf::TUnboxedValue& out) { + if (EState::AtNull == State_) { + out = Parent_->PayloadPacker_.Unpack(GetSmallValue(*Parent_->NullPayload_), Parent_->Ctx_->HolderFactory); + } else { + const auto& iteratorValue = Iterator_.Get(); + const auto& aligned = NYql::TypedReadUnaligned(&iteratorValue.second); + out = Parent_->PayloadPacker_.Unpack(GetSmallValue(aligned), Parent_->Ctx_->HolderFactory); + } + } + + void FromIterator(NUdf::TUnboxedValue& out) { + if (EState::AtNull == State_) { + out = NUdf::TUnboxedValue(); + } else { + out = NUdf::TUnboxedValue(NUdf::TUnboxedValuePod(Iterator_.Get().first)); + } + } + bool Next(NUdf::TUnboxedValue& key) final { if (!Skip()) { return false; } - key = NoSwap - ? (EState::AtNull == State_ - ? NUdf::TUnboxedValue() - : NUdf::TUnboxedValue(NUdf::TUnboxedValuePod(Iterator_.Get().first))) - : (EState::AtNull == State_ - ? Parent_->PayloadPacker_.Unpack(GetSmallValue(*Parent_->NullPayload_), Parent_->Ctx_->HolderFactory) - : Parent_->PayloadPacker_.Unpack(GetSmallValue(Iterator_.Get().second), Parent_->Ctx_->HolderFactory)); + if constexpr (NoSwap) { + FromIterator(key); + } else { + FromUnpack(key); + } return true; } @@ -2142,13 +2158,11 @@ public: if (!Next(key)) { return false; } - payload = NoSwap - ? (EState::AtNull == State_ - ? Parent_->PayloadPacker_.Unpack(GetSmallValue(*Parent_->NullPayload_), Parent_->Ctx_->HolderFactory) - : Parent_->PayloadPacker_.Unpack(GetSmallValue(Iterator_.Get().second), Parent_->Ctx_->HolderFactory)) - : (EState::AtNull == State_ - ? NUdf::TUnboxedValue() - : NUdf::TUnboxedValue(NUdf::TUnboxedValuePod(Iterator_.Get().first))); + if constexpr (NoSwap) { + FromUnpack(payload); + } else { + FromIterator(payload); + } return true; } @@ -2191,7 +2205,9 @@ private: if (!it.Ok()) { return NUdf::TUnboxedValuePod(); } - return PayloadPacker_.Unpack(GetSmallValue(it.Get().second), Ctx_->HolderFactory).Release().MakeOptional(); + const auto& iteratorValue = it.Get(); + const auto& aligned = NYql::TypedReadUnaligned(&iteratorValue.second); + return PayloadPacker_.Unpack(GetSmallValue(aligned), Ctx_->HolderFactory).Release().MakeOptional(); } NUdf::TUnboxedValue GetKeysIterator() const final { |
