Search before asking
Version
master (trunk)
What's Wrong?
When running OrcReadLinesTest.test0 BE unit test with ASAN build on x86, AddressSanitizer reports a SEGV crash due to null pointer dereference of _row_reader in OrcReader::_seek_to_read_one_line().
ASAN crash stack:
==XX==ERROR: AddressSanitizer: SEGV on unknown address 0x000000000030 (pc 0x555558b3c2e0 bp 0x7ffff3c8e400 sp 0x7ffff3c8e3a0 T2)
==XX==The signal is caused by a READ memory access.
#0 0x555558b3c2e0 in orc::RowReaderImpl::seekToRow(unsigned long) be/src/formats/orc/../../thirdparty/installed/include/orc/Reader.hh
#1 0x5555590a3b5c in doris::vectorized::OrcReader::_seek_to_read_one_line() be/src/format/orc/vorc_reader.h:710
#2 0x5555590a3b5c in doris::vectorized::OrcReader::_get_next_block_impl(doris::vectorized::Block*, unsigned long*, bool*) be/src/format/orc/vorc_reader.cpp:2350
#3 0x555558f5c5a0 in doris::vectorized::OrcReader::get_next_block(doris::vectorized::Block*, unsigned long*, bool*) be/src/format/orc/vorc_reader.cpp:2260
#4 0x555558f5c5a0 in doris::vectorized::GenericReader::read_by_rows(doris::RuntimeState*, doris::vectorized::Block*, unsigned long*, bool*) be/src/format/generic_reader.h:165
...
Root cause:
In OrcReader::_init_orc_row_reader(), when createRowReader throws an exception and should_stop is true with error message "stop", the catch block swallows the exception and returns Status::OK(), but _row_reader remains nullptr. The caller then proceeds to call _seek_to_read_one_line() which dereferences the null _row_reader via _row_reader->seekToRow(), causing SEGV.
This is inconsistent with _create_file_reader() which returns Status::EndOfFile("stop") in the same should_stop scenario.
What You Expected?
No SEGV crash. When _row_reader is not initialized, the code should either return a proper error status or assert the precondition, not silently continue and dereference a null pointer.
How to Reproduce?
- Build BE with ASAN:
BUILD_TYPE=ASAN ./build.sh --be
- Run:
./run-be-ut.sh --run --filter=OrcReadLinesTest.test0
- Observe ASAN SEGV crash
Anything Else?
The x86 vs ARM difference is a typical undefined behavior manifestation - x86 null pointer dereference hits unmapped memory (SIGSEGV), while ARM may happen to access mapped memory and appear to pass.
Are you willing to submit PR?
Code of Conduct
Search before asking
Version
master (trunk)
What's Wrong?
When running
OrcReadLinesTest.test0BE unit test with ASAN build on x86, AddressSanitizer reports a SEGV crash due to null pointer dereference of_row_readerinOrcReader::_seek_to_read_one_line().ASAN crash stack:
Root cause:
In
OrcReader::_init_orc_row_reader(), whencreateRowReaderthrows an exception andshould_stopis true with error message "stop", the catch block swallows the exception and returnsStatus::OK(), but_row_readerremains nullptr. The caller then proceeds to call_seek_to_read_one_line()which dereferences the null_row_readervia_row_reader->seekToRow(), causing SEGV.This is inconsistent with
_create_file_reader()which returnsStatus::EndOfFile("stop")in the sameshould_stopscenario.What You Expected?
No SEGV crash. When
_row_readeris not initialized, the code should either return a proper error status or assert the precondition, not silently continue and dereference a null pointer.How to Reproduce?
BUILD_TYPE=ASAN ./build.sh --be./run-be-ut.sh --run --filter=OrcReadLinesTest.test0Anything Else?
The x86 vs ARM difference is a typical undefined behavior manifestation - x86 null pointer dereference hits unmapped memory (SIGSEGV), while ARM may happen to access mapped memory and appear to pass.
Are you willing to submit PR?
Code of Conduct