Skip to content

Pontenial use-after-free check with verify - critical #30043

@pavelvelikhov

Description

@pavelvelikhov

На разных базах иногда сталкивались с потенциальным use-after-free сценарием, здесь собрана вся фактура:

  1. Сначала обнаружилось на /ru/market_billing/prod/market-billing 11 сентября:
    Crash dump kqp_opt_hash_func_propagate_transformer.cpp #24701 - подозрение пало на hash propagate transformer, его отключили, но
    повторилось в другом кейсе:
    https://st.yandex-team.ru/KIKIMR-24094
    Для этого кейса я сделал репро в ut, но проблема в ut не воспроизвелась:
    [NOT FOR MERGE] Added repro for use after free potential bug #26853

При этом на preprod в market-billing падение воспроизводится

Решили временно решить проблему, заменив verify на ensure, но теперь начало падать в других местах:
#26433
#26434

  1. Приехал еще один core dump:
    stable-25-3-1: coredump 3NYql::(anonymous namespace)::TGcNodeTransformer::DoTransform #27093

  2. С похожей проблемой столкнулся Никита и у него есть конкретные подозрения:

Nikita Vasilev, [27 Nov 2025 at 16:30:24]:
Привет!
Можешь, пожалуйста, подсказать, правильно ли я вижу тут баг или нет.

Вот здесь в TGcNodeTransformer используется GetHashAbove() для поиска в UniqueNodes. Этот хэш может быть нулевым, т.к. может быть просто не установлен.
https://a.yandex-team.ru/arcadia/yql/essentials/core/yql_gc_transformer.cpp?rev=tags%2Freleases%2Fydb%2Fstable-25-3-1-16#L28

При этом для заполнения UniqueNodes используется hash из функции https://a.yandex-team.ru/arcadia/yql/essentials/core/yql_expr_csee.cpp?rev=r18126538#L554 . Он не может быть нулевым никак https://a.yandex-team.ru/arcadia/yql/essentials/core/yql_expr_csee.cpp?rev=r18126538#L210 .

Правильно я понимаю, что надо бы вместо использования GetHashAbove в TGcNodeTransformer считать хэш через CalcHash? Или там именно Above почему-то нужен?

Сейчас, собственно, столкнулись с падением по верифайке, из-за того, что хэш нулевой
https://st.yandex-team.ru/KIKIMR-24374
(Если бы он был не нулевой, то все бы проверили вот здесь https://a.yandex-team.ru/arcadia/yql/essentials/core/yql_gc_transformer.cpp?rev=tags%2Freleases%2Fydb%2Fstable-25-3-1-16#L32 и не упали, а просто кинули INTERNAL_ERROR )

Запрос тоже в тикет прикрепил, но он там какой-то гигантский с миллионом join. Вообще не понимаю, как его упростить можно

Связанный тикет: https://st.yandex-team.ru/KIKIMR-24374

Metadata

Metadata

Labels

No labels
No labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions