Skip to content

Commit f9e4c5c

Browse files
committed
YQ RD fixed use after free (ydb-platform#10978)
1 parent 6eb0646 commit f9e4c5c

File tree

2 files changed

+21
-6
lines changed

2 files changed

+21
-6
lines changed

ydb/core/fq/libs/row_dispatcher/json_parser.cpp

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -264,7 +264,7 @@ class TJsonParser::TImpl {
264264
public:
265265
TImpl(const TVector<TString>& columns, const TVector<TString>& types, ui64 batchSize, TDuration batchCreationTimeout)
266266
: Alloc(__LOCATION__, NKikimr::TAlignedPagePoolCounters(), true, false)
267-
, TypeEnv(Alloc)
267+
, TypeEnv(std::make_unique<NKikimr::NMiniKQL::TTypeEnvironment>(Alloc))
268268
, BatchSize(batchSize)
269269
, BatchCreationTimeout(batchCreationTimeout)
270270
, ParsedValues(columns.size())
@@ -273,7 +273,7 @@ class TJsonParser::TImpl {
273273

274274
with_lock (Alloc) {
275275
auto functonRegistry = NKikimr::NMiniKQL::CreateFunctionRegistry(&PrintBackTrace, NKikimr::NMiniKQL::CreateBuiltinRegistry(), false, {});
276-
NKikimr::NMiniKQL::TProgramBuilder programBuilder(TypeEnv, *functonRegistry);
276+
NKikimr::NMiniKQL::TProgramBuilder programBuilder(*TypeEnv, *functonRegistry);
277277

278278
Columns.reserve(columns.size());
279279
for (size_t i = 0; i < columns.size(); i++) {
@@ -373,8 +373,12 @@ class TJsonParser::TImpl {
373373
}
374374

375375
~TImpl() {
376-
Alloc.Acquire();
377-
ClearColumns(0);
376+
with_lock (Alloc) {
377+
ClearColumns(0);
378+
ParsedValues.clear();
379+
Columns.clear();
380+
TypeEnv.reset();
381+
}
378382
}
379383

380384
private:
@@ -395,7 +399,7 @@ class TJsonParser::TImpl {
395399

396400
private:
397401
NKikimr::NMiniKQL::TScopedAlloc Alloc;
398-
NKikimr::NMiniKQL::TTypeEnvironment TypeEnv;
402+
std::unique_ptr<NKikimr::NMiniKQL::TTypeEnvironment> TypeEnv;
399403

400404
const ui64 BatchSize;
401405
const TDuration BatchCreationTimeout;
@@ -405,7 +409,7 @@ class TJsonParser::TImpl {
405409
TJsonParserBuffer Buffer;
406410
simdjson::ondemand::parser Parser;
407411

408-
TVector<std::vector<NYql::NUdf::TUnboxedValue, NKikimr::NMiniKQL::TMKQLAllocator<NYql::NUdf::TUnboxedValue>>> ParsedValues;
412+
TVector<NKikimr::NMiniKQL::TUnboxedValueVector> ParsedValues;
409413
};
410414

411415
TJsonParser::TJsonParser(const TVector<TString>& columns, const TVector<TString>& types, ui64 batchSize, TDuration batchCreationTimeout)

ydb/core/fq/libs/row_dispatcher/ut/json_parser_ut.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
#include <ydb/core/base/backtrace.h>
2+
13
#include <ydb/core/fq/libs/ydb/ydb.h>
24
#include <ydb/core/fq/libs/events/events.h>
35

@@ -22,7 +24,16 @@ class TFixture : public NUnitTest::TBaseFixture {
2224
TFixture()
2325
: Runtime(true) {}
2426

27+
static void SegmentationFaultHandler(int) {
28+
Cerr << "segmentation fault call stack:" << Endl;
29+
FormatBackTrace(&Cerr);
30+
abort();
31+
}
32+
2533
void SetUp(NUnitTest::TTestContext&) override {
34+
NKikimr::EnableYDBBacktraceFormat();
35+
signal(SIGSEGV, &SegmentationFaultHandler);
36+
2637
TAutoPtr<TAppPrepare> app = new TAppPrepare();
2738
Runtime.SetLogBackend(CreateStderrBackend());
2839
Runtime.SetLogPriority(NKikimrServices::FQ_ROW_DISPATCHER, NLog::PRI_TRACE);

0 commit comments

Comments
 (0)