diff options
author | atarasov5 <[email protected]> | 2025-10-10 14:01:00 +0300 |
---|---|---|
committer | atarasov5 <[email protected]> | 2025-10-10 14:24:07 +0300 |
commit | c62509aef170f46a8d9464bafa8b83bc293ebb63 (patch) | |
tree | 950c1d4a0a0996d496167bbfbdb4f0f53792afeb | |
parent | fdef5b914e371139f79cfaa9d358d3509852203c (diff) |
YQL-20425: Fix UBSan
commit_hash:542a9c3e054146d270700a469d6ba81b5022e539
13 files changed, 32 insertions, 15 deletions
diff --git a/yql/essentials/minikql/comp_nodes/mkql_listfromrange.cpp b/yql/essentials/minikql/comp_nodes/mkql_listfromrange.cpp index 556162ac520..3e08274c446 100644 --- a/yql/essentials/minikql/comp_nodes/mkql_listfromrange.cpp +++ b/yql/essentials/minikql/comp_nodes/mkql_listfromrange.cpp @@ -2,6 +2,7 @@ #include <yql/essentials/minikql/computation/mkql_computation_node_holders.h> #include <yql/essentials/minikql/computation/mkql_computation_node_codegen.h> // Y_IGNORE #include <yql/essentials/minikql/mkql_node_cast.h> +#include <yql/essentials/minikql/mkql_safe_arithmetic_ops.h> namespace NKikimr { namespace NMiniKQL { @@ -75,8 +76,7 @@ private: if (!Count) { return false; } - Current += Step; - --Count; + AddStep(); return true; } @@ -86,14 +86,19 @@ private: } value = NUdf::TUnboxedValuePod(Current); - Current += Step; - --Count; + AddStep(); return true; } T Current; const TStep Step; ui64 Count; + + private: + void AddStep() { + Current = SafeAdd(Current, static_cast<T>(Step)); + --Count; + } }; template <bool Asc> diff --git a/yql/essentials/minikql/invoke_builtins/mkql_builtins_abs.cpp b/yql/essentials/minikql/invoke_builtins/mkql_builtins_abs.cpp index 7c2a34a6cd1..5fc2bc315a1 100644 --- a/yql/essentials/minikql/invoke_builtins/mkql_builtins_abs.cpp +++ b/yql/essentials/minikql/invoke_builtins/mkql_builtins_abs.cpp @@ -1,5 +1,6 @@ #include "mkql_builtins_decimal.h" // Y_IGNORE -#include "mkql_safe_ops.h" + +#include <yql/essentials/minikql/mkql_safe_arithmetic_ops.h> #include <cmath> diff --git a/yql/essentials/minikql/invoke_builtins/mkql_builtins_add.cpp b/yql/essentials/minikql/invoke_builtins/mkql_builtins_add.cpp index eeccef174bb..0b6b2aef946 100644 --- a/yql/essentials/minikql/invoke_builtins/mkql_builtins_add.cpp +++ b/yql/essentials/minikql/invoke_builtins/mkql_builtins_add.cpp @@ -1,8 +1,8 @@ #include "mkql_builtins_impl.h" // Y_IGNORE #include "mkql_builtins_datetime.h" #include "mkql_builtins_decimal.h" // Y_IGNORE -#include "mkql_safe_ops.h" +#include <yql/essentials/minikql/mkql_safe_arithmetic_ops.h> #include <yql/essentials/minikql/mkql_type_ops.h> namespace NKikimr { diff --git a/yql/essentials/minikql/invoke_builtins/mkql_builtins_dec.cpp b/yql/essentials/minikql/invoke_builtins/mkql_builtins_dec.cpp index bc5bd2019f7..f3d1639c384 100644 --- a/yql/essentials/minikql/invoke_builtins/mkql_builtins_dec.cpp +++ b/yql/essentials/minikql/invoke_builtins/mkql_builtins_dec.cpp @@ -1,5 +1,6 @@ #include "mkql_builtins_decimal.h" // Y_IGNORE -#include "mkql_safe_ops.h" + +#include <yql/essentials/minikql/mkql_safe_arithmetic_ops.h> namespace NKikimr { namespace NMiniKQL { diff --git a/yql/essentials/minikql/invoke_builtins/mkql_builtins_inc.cpp b/yql/essentials/minikql/invoke_builtins/mkql_builtins_inc.cpp index 93179e95159..4a2c7700cbf 100644 --- a/yql/essentials/minikql/invoke_builtins/mkql_builtins_inc.cpp +++ b/yql/essentials/minikql/invoke_builtins/mkql_builtins_inc.cpp @@ -1,5 +1,6 @@ #include "mkql_builtins_decimal.h" // Y_IGNORE -#include "mkql_safe_ops.h" + +#include <yql/essentials/minikql/mkql_safe_arithmetic_ops.h> namespace NKikimr { namespace NMiniKQL { diff --git a/yql/essentials/minikql/invoke_builtins/mkql_builtins_minus.cpp b/yql/essentials/minikql/invoke_builtins/mkql_builtins_minus.cpp index 2556f08a885..b20f9990af2 100644 --- a/yql/essentials/minikql/invoke_builtins/mkql_builtins_minus.cpp +++ b/yql/essentials/minikql/invoke_builtins/mkql_builtins_minus.cpp @@ -1,5 +1,6 @@ #include "mkql_builtins_decimal.h" // Y_IGNORE -#include "mkql_safe_ops.h" + +#include <yql/essentials/minikql/mkql_safe_arithmetic_ops.h> namespace NKikimr { namespace NMiniKQL { diff --git a/yql/essentials/minikql/invoke_builtins/mkql_builtins_mul.cpp b/yql/essentials/minikql/invoke_builtins/mkql_builtins_mul.cpp index 4e94d485d07..68864713bb9 100644 --- a/yql/essentials/minikql/invoke_builtins/mkql_builtins_mul.cpp +++ b/yql/essentials/minikql/invoke_builtins/mkql_builtins_mul.cpp @@ -1,8 +1,8 @@ #include "mkql_builtins_impl.h" // Y_IGNORE #include "mkql_builtins_datetime.h" -#include "mkql_safe_ops.h" #include <yql/essentials/minikql/mkql_type_ops.h> +#include <yql/essentials/minikql/mkql_safe_arithmetic_ops.h> namespace NKikimr { namespace NMiniKQL { diff --git a/yql/essentials/minikql/invoke_builtins/mkql_builtins_sub.cpp b/yql/essentials/minikql/invoke_builtins/mkql_builtins_sub.cpp index 8164dee43c8..b41b0c88ba5 100644 --- a/yql/essentials/minikql/invoke_builtins/mkql_builtins_sub.cpp +++ b/yql/essentials/minikql/invoke_builtins/mkql_builtins_sub.cpp @@ -1,9 +1,9 @@ #include "mkql_builtins_impl.h" // Y_IGNORE #include "mkql_builtins_datetime.h" #include "mkql_builtins_decimal.h" // Y_IGNORE -#include "mkql_safe_ops.h" #include <yql/essentials/minikql/mkql_type_ops.h> +#include <yql/essentials/minikql/mkql_safe_arithmetic_ops.h> namespace NKikimr { namespace NMiniKQL { diff --git a/yql/essentials/minikql/invoke_builtins/mkql_numeric_cast.h b/yql/essentials/minikql/mkql_numeric_cast.h index 954f741e98f..954f741e98f 100644 --- a/yql/essentials/minikql/invoke_builtins/mkql_numeric_cast.h +++ b/yql/essentials/minikql/mkql_numeric_cast.h diff --git a/yql/essentials/minikql/invoke_builtins/mkql_safe_ops.h b/yql/essentials/minikql/mkql_safe_arithmetic_ops.h index 55c75d310f8..d8ae77b5f1f 100644 --- a/yql/essentials/minikql/invoke_builtins/mkql_safe_ops.h +++ b/yql/essentials/minikql/mkql_safe_arithmetic_ops.h @@ -1,7 +1,6 @@ #pragma once -#include <yql/essentials/minikql/defs.h> -#include <yql/essentials/minikql/invoke_builtins/mkql_numeric_cast.h> +#include <yql/essentials/minikql/mkql_numeric_cast.h> #include <yql/essentials/public/decimal/yql_decimal.h> #include <type_traits> diff --git a/yql/essentials/parser/pg_wrapper/comp_factory.cpp b/yql/essentials/parser/pg_wrapper/comp_factory.cpp index d2eb19a64bf..aa6b45cc593 100644 --- a/yql/essentials/parser/pg_wrapper/comp_factory.cpp +++ b/yql/essentials/parser/pg_wrapper/comp_factory.cpp @@ -78,6 +78,7 @@ constexpr auto PG_ERROR = ERROR; #include <yql/essentials/minikql/mkql_node_builder.h> #include <yql/essentials/minikql/mkql_string_util.h> #include <yql/essentials/minikql/mkql_type_builder.h> +#include <yql/essentials/minikql/mkql_safe_arithmetic_ops.h> #include <yql/essentials/types/binary_json/read.h> #include <yql/essentials/types/uuid/uuid.h> #include <yql/essentials/public/udf/arrow/block_reader.h> @@ -2236,7 +2237,7 @@ NUdf::TUnboxedValuePod ConvertFromPgValue(NUdf::TUnboxedValuePod value, TMaybe<N return NUdf::TUnboxedValuePod(res); } case NUdf::EDataSlot::Timestamp64: { - auto res = (i64)DatumGetInt64(ScalarDatumFromPod(value)) - PgTimestampShift; + auto res = SafeSub((i64)DatumGetInt64(ScalarDatumFromPod(value)), PgTimestampShift); if (res < NUdf::MIN_TIMESTAMP64 || res > NUdf::MAX_TIMESTAMP64) { return NUdf::TUnboxedValuePod(); } diff --git a/yql/essentials/parser/pg_wrapper/ubsan.supp b/yql/essentials/parser/pg_wrapper/ubsan.supp index 4268441239a..7e19d3f56f4 100644 --- a/yql/essentials/parser/pg_wrapper/ubsan.supp +++ b/yql/essentials/parser/pg_wrapper/ubsan.supp @@ -1 +1,9 @@ +# This file are using reintrepret_cast<void(void*, const void*, size_t>)(...) +# for function with void(char*, const char*, size_t) signature. This is UB. +# Just ignore it instead of fixing since it is third party library. +# It might be fixed in future versions of Postgres. function:pg_wrapper/postgresql/src/backend/utils/hash/dynahash.c +# Here simple integer overflow in third_party library. +# Just ignore it instead of fixing since it is third party library. +# It might be fixed in future versions of Postgres. +signed-integer-overflow:utils/adt/numeric.c diff --git a/yql/essentials/public/udf/arrow/block_io_buffer.h b/yql/essentials/public/udf/arrow/block_io_buffer.h index 8af658f67c6..27013c7ea53 100644 --- a/yql/essentials/public/udf/arrow/block_io_buffer.h +++ b/yql/essentials/public/udf/arrow/block_io_buffer.h @@ -69,7 +69,7 @@ public: void PushString(std::string_view data) { Ensure(sizeof(ui32) + data.size()); - *(ui32*)&Vec_[Pos_] = data.size(); + WriteUnaligned<ui32>(&Vec_[Pos_], data.size()); Pos_ += sizeof(ui32); std::memcpy(Vec_.data() + Pos_, data.data(), data.size()); Pos_ += data.size(); |