mirror of
https://github.com/netbirdio/gvisor.git
synced 2026-05-22 17:12:49 -07:00
Fix FUSE_RELEASE protocol reply processing
This commit fixes the potential unexpected errors of original handling of FUSE_RELEASE responses while keep the same behavior (ignoring any reply).
This commit is contained in:
@@ -204,8 +204,11 @@ func (fd *DeviceFD) readLocked(ctx context.Context, dst usermem.IOSequence, opts
|
||||
|
||||
// Fully done with this req, remove it from the queue.
|
||||
fd.queue.Remove(req)
|
||||
if req.hdr.Opcode == linux.FUSE_RELEASE {
|
||||
|
||||
// Remove noReply ones from map of requests expecting a reply.
|
||||
if req.noReply {
|
||||
fd.numActiveRequests -= 1
|
||||
delete(fd.completions, req.hdr.Unique)
|
||||
}
|
||||
|
||||
return int64(n), nil
|
||||
@@ -296,6 +299,10 @@ func (fd *DeviceFD) writeLocked(ctx context.Context, src usermem.IOSequence, opt
|
||||
|
||||
fut, ok := fd.completions[hdr.Unique]
|
||||
if !ok {
|
||||
if fut.hdr.Unique == linux.FUSE_RELEASE {
|
||||
// Currently we simply discard the reply for FUSE_RELEASE.
|
||||
return n + src.NumBytes(), nil
|
||||
}
|
||||
// Server sent us a response for a request we never sent?
|
||||
return 0, syserror.EINVAL
|
||||
}
|
||||
|
||||
@@ -84,7 +84,12 @@ func (fd *fileDescription) Release(ctx context.Context) {
|
||||
}
|
||||
kernelTask := kernel.TaskFromContext(ctx)
|
||||
// ignoring errors and FUSE server reply is analogous to Linux's behavior.
|
||||
req, _ := conn.NewRequest(auth.CredentialsFromContext(ctx), uint32(kernelTask.ThreadID()), fd.inode().NodeID, opcode, &in)
|
||||
req, err := conn.NewRequest(auth.CredentialsFromContext(ctx), uint32(kernelTask.ThreadID()), fd.inode().NodeID, opcode, &in)
|
||||
if err != nil {
|
||||
// No way to invoke Call() with an errored request.
|
||||
return
|
||||
}
|
||||
req.noReply = true
|
||||
conn.CallAsync(kernelTask, req)
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user