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.

Reply via email to