The "size" it's the amount of bytes that the FUSE wants to read, and "res" 
it's the amount of bytes that were read. 
The syscall *pread* ensures that "size" is always greater or equal than 
"res". If an error occurred during the this syscall "res" will be -1, but 
in this case "memcpy" isn't called . 
FUSE also guarantees that the destination buffer as enough space to hold 
the amounted bytes that requested, that is, "size" value. 

I have already tested other methods related to buf field on the capnp 
struct, like *hasBuf*, and i also get segmentation fault. 

I forgot to say that this code works on my MacBook, but when a try it on a 
different OS (Ubuntu 18.04 or Ubuntu 16.04) it fails. I have already 
compiled it with different compilers (g++ and clang++) with old and new 
versions. But nothing seems to solve the problem. 
 

domingo, 3 de Novembro de 2019 às 06:10:43 UTC, Paweł Głodny R. escreveu:
>
> Look at the line you mentioned yourself: "std::memcpy(buf, 
> reply.getBuf().begin(), res);". You probably meant "size" instead of 
> "res". 
> What's the output of "res = reply.getResult();" exactly? Unless it's 
> not the size, you've got logic error and "memcpy" may go out-of-range 
> when copying data. 
> Does the destination buffer have enough space to hold all the copied 
> data (you might need to guarantee it explicitly - it won't resize on 
> it's own)? 
> What's the type of "reply.getBuf().begin()"? Remember that "memcpy" 
> operates on raw pointers. 
>
> -Paweł 
>
> On Sun, 3 Nov 2019 at 06:18, Diogo Leitão <[email protected] 
> <javascript:>> wrote: 
> > 
> > Hi 
> > 
> > I'm using FUSE + Cap'n Proto to build a distributed filesystem. 
> Everything seems to be fine, but when i try get the data field, on the 
> client side, using the getBuf method, i get a segmentation fault error. 
> > 
> > This is the code that i made. What am i doing wrong? 
> > 
> > 
> > /* 
> > 
> >  * Capnp source file 
> > 
> >  */ 
> > 
> > interface FilesystemOps { 
> > 
> >     ... 
> >     read @16 (request :ReadRequest) -> (reply :ReadReply); 
> > 
> >     ... 
> > } 
> > 
> > 
> > struct ReadRequest { 
> >     path @0 :Text; 
> >     size @1 :UInt64; 
> >     offset @2 :Int64; 
> > } 
> > 
> > struct ReadReply { 
> >     result @0 :Int32; 
> >     buf @1 :Data; 
> > } 
> > 
> > 
> > /* 
> > 
> >  * Client side 
> > 
> >  */ 
> > 
> > int FilesystemOpsClient::rpc_read(const char *path, char *buf, size_t 
> size, off_t offset, struct fuse_file_info *fi) { 
> >     std::cout << "rpc_read begin " << size << std::endl; 
> > 
> >     int res; 
> >     auto clientData = getClient(); 
> >     auto request = clientData->cap_.readRequest(); 
> >     auto builder = request.getRequest(); 
> > 
> >     builder.setPath(path); 
> >     builder.setSize(size); 
> >     builder.setOffset(offset); 
> > 
> >     auto reply = request.send().wait(clientData->waitScope_).getReply(); 
> > 
> >     res = reply.getResult(); 
> >     if (res != -1) { 
> >         std::memcpy(buf, reply.getBuf().begin(), res); 
> > 
> >     } 
> > 
> >     return res; 
> > } 
> > 
> > 
> > /* 
> > 
> >  * Server side 
> > 
> >  */ 
> > 
> > kj::Promise<void> 
> FilesystemOpsImpl::read(FilesystemOps::Server::ReadContext context) { 
> >     int res; 
> >     auto request = context.getParams().getRequest(); 
> >     auto reply = context.getResults().getReply(); 
> > 
> >     std::string path = root_path_ + request.getPath().cStr(); 
> >     size_t size = request.getSize(); 
> >     off_t offset = request.getOffset(); 
> > 
> >     int fd = ::open(path.c_str(), O_RDONLY); 
> >     if (fd == -1) { 
> >         res = -1; 
> >     } else { 
> >         res = pread(fd, reply.initBuf(size).begin(), size, offset); 
> >         close(fd); 
> >     } 
> > 
> >     reply.setResult(res); 
> > 
> >     return kj::READY_NOW; 
> > } 
> > 
> > 
> > Appreciate your help. Thank you. 
> > 
> > 
> > -- 
> > 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] <javascript:>. 
> > To view this discussion on the web visit 
> https://groups.google.com/d/msgid/capnproto/ee51e0ec-819c-4962-9245-41cafcd03862%40googlegroups.com.
>  
>
>

-- 
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/bd19f6da-b288-4c17-80ae-b14e2f903d1c%40googlegroups.com.

Reply via email to