Hmm, I don't see any problems in the code. The crash seems to be in the destructor for FlatArrayMessageBuilder, when freeing an array that was allocated in the constructor. I can't really see how this could happen unless the FlatArrayMessageBuilder's own memory was corrupted somehow.
Would you be able to write a complete self-contained test case which I can actually compile and run myself? (You've almost provided that already but I want to make sure I'm looking at exactly the same code end-to-end.) -Kenton On Sun, Feb 2, 2020 at 3:25 PM <[email protected]> wrote: > Hello, > > I am new to capnproto and may be doing something silly. I am trying to > create a Data field of size 1526144 and it serializes without any issue. > But when I try to deserialize the same message it fails with segfault. > If I decrease the Data size to about 8K it works without any problem. I > could not find a documentation that explains this limit. > > I am using following versions: > > capnp --version > Cap'n Proto version 0.6.1 > > gcc --version > gcc (Ubuntu 7.4.0-1ubuntu1~18.04.1) 7.4.0 > > uname -r > 4.15.0-74-generic > > OS: Ubuntu 18.04.3 LTS > > Message definition: > > struct FrameData { > frameId @0 :UInt32; > image @1 :Data; > } > > Code: > > capnp::MallocMessageBuilder msg_builder; > FrameData::Builder frame = msg_builder.initRoot<FrameData>(); > > frame.setFrameId(1); > int size = 1526144; > uint8_t* addr = (uint8_t*) malloc(size); > memset(addr, 0, size); > > auto data = capnp::Data::Reader((kj::byte*)addr, size); > > frame.setImage(kj::arrayPtr(addr, size)); > > auto words = capnp::messageToFlatArray(msg_builder); > > capnp::FlatArrayMessageReader msg2(words.asPtr()); > FrameData::Reader frame2 = msg2.getRoot<FrameData>(); > std::cout << frame2.getFrameId() << std::endl; > > > Running under GDB: > > Thread 3 "libavtests" received signal SIGSEGV, Segmentation fault. > [Switching to Thread 0x7fffe0669700 (LWP 8720)] > 0x00005555555bf03e in kj::ArrayDisposer::Dispose_<kj::ArrayPtr<capnp::word > const>, true>::dispose (firstElement=0x55555586b0e0 > <kj::_::HeapArrayDisposer::instance>, > elementCount=140736911018432, capacity=140736911018432, disposer=...) > at /usr/local/include/kj/array.h:622 > 622 disposer.disposeImpl(const_cast<RemoveConst<T>*>(firstElement), > > (gdb) bt > Thread 3 "libavtests" received signal SIGSEGV, Segmentation fault. > [Switching to Thread 0x7fffdbfff700 (LWP 8138)] > 0x00005555555bf0fe in kj::ArrayDisposer::Dispose_<kj::ArrayPtr<capnp::word > const>, true>::dispose (firstElement=0x55555586c0e0 > <kj::_::HeapArrayDisposer::instance>, > elementCount=140736954317192, capacity=140736954317192, disposer=...) > at /usr/local/include/kj/array.h:622 > 622 disposer.disposeImpl(const_cast<RemoveConst<T>*>(firstElement), > (gdb) bt > #0 0x00005555555bf0fe in > kj::ArrayDisposer::Dispose_<kj::ArrayPtr<capnp::word const>, > true>::dispose(kj::ArrayPtr<capnp::word const>*, unsigned long, unsigned > long, kj::ArrayDisposer const&) (firstElement=0x55555586c0e0 > <kj::_::HeapArrayDisposer::instance>, elementCount=140736954317192, > capacity=140736954317192, disposer=...) > at /usr/local/include/kj/array.h:622 > #1 0x00005555555bf0b8 in > kj::ArrayDisposer::dispose<kj::ArrayPtr<capnp::word const> > >(kj::ArrayPtr<capnp::word const>*, unsigned long, unsigned long) const > (this=0x555555894908, firstElement=0x55555586c0e0 > <kj::_::HeapArrayDisposer::instance>, elementCount=140736954317192, > capacity=140736954317192) > at /usr/local/include/kj/array.h:640 > #2 0x00005555555bf085 in kj::Array<kj::ArrayPtr<capnp::word const> > >::dispose() (this=0x7fffdbffea48) at /usr/local/include/kj/array.h:254 > --Type <RET> for more, q to quit, c to continue without paging-- > #3 0x00005555555bf024 in kj::Array<kj::ArrayPtr<capnp::word const> > >::~Array() (this=0x7fffdbffea48, __in_chrg=<optimized out>) at > /usr/local/include/kj/array.h:149 > #4 0x00005555555befaa in > capnp::FlatArrayMessageReader::~FlatArrayMessageReader() > (this=0x7fffdbffe980, __in_chrg=<optimized out>) at > /usr/include/capnp/serialize.h:53 > #5 0x00005555555cab8d in server() () at > /home/ks/workspace/capnptest/test.cpp:122 > #6 0x00005555555cb4a0 in std::__invoke_impl<void, void > (*)()>(std::__invoke_other, void (*&&)()) (__f=@0x555555894908: > 0x5555555ca80a <server()>) > at /usr/include/c++/7/bits/invoke.h:60 > #7 0x00005555555cb231 in std::__invoke<void (*)()>(void (*&&)()) > (__fn=@0x555555894908: 0x5555555ca80a <server()>) at > /usr/include/c++/7/bits/invoke.h:95 > #8 0x00005555555cb83c in std::thread::_Invoker<std::tuple<void (*)()> > >::_M_invoke<0ul>(std::_Index_tuple<0ul>) (this=0x555555894908) at > /usr/include/c++/7/thread:234 > #9 0x00005555555cb80d in std::thread::_Invoker<std::tuple<void (*)()> > >::operator()() (this=0x555555894908) at /usr/include/c++/7/thread:243 > #10 0x00005555555cb7ec in > std::thread::_State_impl<std::thread::_Invoker<std::tuple<void (*)()> > > >::_M_run() (this=0x555555894900) at /usr/include/c++/7/thread:186 > #11 0x00007ffff7f34408 in std::execute_native_thread_routine(void*) > (__p=0x555555894900) > at > /opt/conda/conda-bld/compilers_linux-64_1534514838838/work/.build/x86_64-conda_cos6-linux-gnu/src/gcc/libstdc++-v3/src/c++11/thread.cc:80 > #12 0x00007ffff5db86db in start_thread (arg=0x7fffdbfff700) at > pthread_create.c:463 > #13 0x00007ffff450c88f in clone () at > ../sysdeps/unix/sysv/linux/x86_64/clone.S:95 > > > Please let me know if the code looks OK or if I have to change anything. > > -- > You received this message because you are subscribed to the Google Groups > "Cap'n Proto" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to [email protected]. > To view this discussion on the web visit > https://groups.google.com/d/msgid/capnproto/8ff65d7a-c08b-43be-90cf-4098a07a6265%40googlegroups.com > <https://groups.google.com/d/msgid/capnproto/8ff65d7a-c08b-43be-90cf-4098a07a6265%40googlegroups.com?utm_medium=email&utm_source=footer> > . > -- You received this message because you are subscribed to the Google Groups "Cap'n Proto" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To view this discussion on the web visit https://groups.google.com/d/msgid/capnproto/CAJouXQmT7pkZHevdXe2nZtnoxwa0aHmoperxjF%2BFmL4av29srg%40mail.gmail.com.
