summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoratarasov5 <[email protected]>2025-10-10 14:01:00 +0300
committeratarasov5 <[email protected]>2025-10-10 14:24:07 +0300
commitc62509aef170f46a8d9464bafa8b83bc293ebb63 (patch)
tree950c1d4a0a0996d496167bbfbdb4f0f53792afeb
parentfdef5b914e371139f79cfaa9d358d3509852203c (diff)
YQL-20425: Fix UBSan
commit_hash:542a9c3e054146d270700a469d6ba81b5022e539
-rw-r--r--yql/essentials/minikql/comp_nodes/mkql_listfromrange.cpp13
-rw-r--r--yql/essentials/minikql/invoke_builtins/mkql_builtins_abs.cpp3
-rw-r--r--yql/essentials/minikql/invoke_builtins/mkql_builtins_add.cpp2
-rw-r--r--yql/essentials/minikql/invoke_builtins/mkql_builtins_dec.cpp3
-rw-r--r--yql/essentials/minikql/invoke_builtins/mkql_builtins_inc.cpp3
-rw-r--r--yql/essentials/minikql/invoke_builtins/mkql_builtins_minus.cpp3
-rw-r--r--yql/essentials/minikql/invoke_builtins/mkql_builtins_mul.cpp2
-rw-r--r--yql/essentials/minikql/invoke_builtins/mkql_builtins_sub.cpp2
-rw-r--r--yql/essentials/minikql/mkql_numeric_cast.h (renamed from yql/essentials/minikql/invoke_builtins/mkql_numeric_cast.h)0
-rw-r--r--yql/essentials/minikql/mkql_safe_arithmetic_ops.h (renamed from yql/essentials/minikql/invoke_builtins/mkql_safe_ops.h)3
-rw-r--r--yql/essentials/parser/pg_wrapper/comp_factory.cpp3
-rw-r--r--yql/essentials/parser/pg_wrapper/ubsan.supp8
-rw-r--r--yql/essentials/public/udf/arrow/block_io_buffer.h2
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();