From 55ef37166897eae03ea8e572487db4eefc3f9d1d Mon Sep 17 00:00:00 2001 From: Rahat Mahmood Date: Thu, 3 Feb 2022 15:11:53 -0800 Subject: [PATCH] Return well-defined error on short payload in FUSE. Errors from syscalls without a well-defined translation to errnos result in sentry panics. Reported-by: syzbot+907201b840bb25d94e00@syzkaller.appspotmail.com PiperOrigin-RevId: 426248731 --- pkg/sentry/fsimpl/fuse/request_response.go | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/pkg/sentry/fsimpl/fuse/request_response.go b/pkg/sentry/fsimpl/fuse/request_response.go index 3170c3cde..98bf60486 100644 --- a/pkg/sentry/fsimpl/fuse/request_response.go +++ b/pkg/sentry/fsimpl/fuse/request_response.go @@ -15,11 +15,11 @@ package fuse import ( - "fmt" - "golang.org/x/sys/unix" "gvisor.dev/gvisor/pkg/abi/linux" + "gvisor.dev/gvisor/pkg/errors/linuxerr" "gvisor.dev/gvisor/pkg/hostarch" + "gvisor.dev/gvisor/pkg/log" "gvisor.dev/gvisor/pkg/marshal" "gvisor.dev/gvisor/pkg/sentry/kernel" "gvisor.dev/gvisor/pkg/sentry/kernel/auth" @@ -212,7 +212,9 @@ func (r *Response) UnmarshalPayload(m marshal.Marshallable) error { wantDataLen := uint32(m.SizeBytes()) if haveDataLen < wantDataLen { - return fmt.Errorf("payload too small. Minimum data lenth required: %d, but got data length %d", wantDataLen, haveDataLen) + log.Warningf("fusefs: Payload too small. Minimum data length required: %d, but got data length %d", wantDataLen, haveDataLen) + return linuxerr.EINVAL + } // The response data is empty unless there is some payload. And so, doesn't