HomeFreeBSD

cad/brlcad: fix null pointer accesses during build

Description

cad/brlcad: fix null pointer accesses during build

During an exp-run for llvm 12 (see bug 255570), it turned out that
cad/brlcad does not build with clang 12.0.0:

[ 99% 4379/4403] cd /wrkdirs/usr/ports/cad/brlcad/work/brlcad-7.30.2/db/nist && /wrkdirs/usr/ports/cad/brlcad/work/brlcad-7.30.2/bin/step-g -O /wrkdirs/usr/ports/cad/brlcad/work/brlcad-7.30.2/share/db/nist/NIST_MBE_PMI_11.g /wrkdirs/usr/ports/cad/brlcad/work/brlcad-7.30.2/db/nist/NIST_MBE_PMI_11.stp > /wrkdirs/usr/ports/cad/brlcad/work/brlcad-7.30.2/db/nist/NIST_MBE_PMI_11.log 2>&1
FAILED: share/db/nist/NIST_MBE_PMI_11.g

What happens is that the step-g intermediate program segfaults, because
it attempts to access a null pointer. Valgrind shows:

Reading Data from /wrkdirs/share/dim/ports/cad/brlcad/work/brlcad-7.30.2/db/nist/NIST_MBE_PMI_11.stp...

HEADER read:

24919== Invalid read of size 4

24919== at 0x1337BA10: EntList::firstNot(JoinType) (entlist.cc:39)

24919== by 0x1337C93E: nextNot (complexSupport.h:185)

24919== by 0x1337C93E: AndList::matchNonORs(EntNode*) (non-ors.cc:135)

24919== by 0x1337B77C: ComplexList::matches(EntNode*) (complexlist.cc:176)

24919== by 0x1337B36A: ComplexCollect::supports(EntNode*) const (collect.cc:140)

24919== by 0x1335FA5A: STEPcomplex::Initialize(char const**, char const*) (STEPcomplex.cc:126)

24919== by 0x1335F774: STEPcomplex::STEPcomplex(Registry*, std::1::basic_string<char, std::1::char_traits<char>, std::__1::allocator<char> > const**, int, char const*) (STEPcomplex.cc:33)

24919== by 0x1331842E: STEPfile::CreateSubSuperInstance(std::1::basic_istream<char, std::1::char_traits<char> >&, int, ErrorDescriptor&) (STEPfile.cc:1048)

24919== by 0x13315E15: STEPfile::CreateInstance(std::1::basic_istream<char, std::1::char_traits<char> >&, std::1::basic_ostream<char, std::1::char_traits<char> >&) (STEPfile.cc:833)

24919== by 0x133158B1: STEPfile::ReadData1(std::1::basic_istream<char, std::1::char_traits<char> >&) (STEPfile.cc:502)

24919== by 0x13319EA8: STEPfile::AppendFile(std::1::basic_istream<char, std::1::char_traits<char> >*, bool) (STEPfile.cc:1674)

24919== by 0x1331C984: STEPfile::ReadExchangeFile(std::1::basic_string<char, std::1::char_traits<char>, std::__1::allocator<char> >, bool) (STEPfile.inline.cc:119)

24919== by 0x3AFDCE: STEPWrapper::load(std::1::basic_string<char, std::1::char_traits<char>, std::__1::allocator<char> >&) (STEPWrapper.cpp:1300)

24919== Address 0x8 is not stack'd, malloc'd or (recently) free'd

24919

24919

24919== Process terminating with default action of signal 11 (SIGSEGV): dumping core

24919== Access not within mapped region at address 0x8

24919== at 0x1337BA10: EntList::firstNot(JoinType) (entlist.cc:39)

24919== by 0x1337C93E: nextNot (complexSupport.h:185)

24919== by 0x1337C93E: AndList::matchNonORs(EntNode*) (non-ors.cc:135)

24919== by 0x1337B77C: ComplexList::matches(EntNode*) (complexlist.cc:176)

24919== by 0x1337B36A: ComplexCollect::supports(EntNode*) const (collect.cc:140)

24919== by 0x1335FA5A: STEPcomplex::Initialize(char const**, char const*) (STEPcomplex.cc:126)

24919== by 0x1335F774: STEPcomplex::STEPcomplex(Registry*, std::1::basic_string<char, std::1::char_traits<char>, std::__1::allocator<char> > const**, int, char const*) (STEPcomplex.cc:33)

24919== by 0x1331842E: STEPfile::CreateSubSuperInstance(std::1::basic_istream<char, std::1::char_traits<char> >&, int, ErrorDescriptor&) (STEPfile.cc:1048)

24919== by 0x13315E15: STEPfile::CreateInstance(std::1::basic_istream<char, std::1::char_traits<char> >&, std::1::basic_ostream<char, std::1::char_traits<char> >&) (STEPfile.cc:833)

24919== by 0x133158B1: STEPfile::ReadData1(std::1::basic_istream<char, std::1::char_traits<char> >&) (STEPfile.cc:502)

24919== by 0x13319EA8: STEPfile::AppendFile(std::1::basic_istream<char, std::1::char_traits<char> >*, bool) (STEPfile.cc:1674)

24919== by 0x1331C984: STEPfile::ReadExchangeFile(std::1::basic_string<char, std::1::char_traits<char>, std::__1::allocator<char> >, bool) (STEPfile.inline.cc:119)

24919== by 0x3AFDCE: STEPWrapper::load(std::1::basic_string<char, std::1::char_traits<char>, std::__1::allocator<char> >&) (STEPWrapper.cpp:1300)

24919== If you believe this happened as a result of a stack

24919== overflow in your program's main thread (unlikely but

24919== possible), you can try to increase the size of the

24919== main thread stack using the --main-stacksize= flag.

24919== The main thread stack size used in this run was 16777216.

To fix this, add null pointer checks to EntList::firstNot() and various
other EntList functions.

Approved by: erik@brlcad.org (maintainer)
PR: 256166
MFH: 2021Q2

Details

Provenance
dimAuthored on May 26 2021, 10:38 AM
Parents
R11:eea42d68b725: lang/rust: Disable DOCS to fix build on armv6/7
Branches
Unknown
Tags
Unknown