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.
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;
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),
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