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 capnproto+unsubscr...@googlegroups.com.
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