Skip to content

x/sys/unix: what if recvmsg syscall returns -1 and EWOULDBLOCK #76848

@lwintermelon

Description

@lwintermelon

Below are codes of Recvmsg func from x/sys/unix .

// Recvmsg receives a message from a socket using the recvmsg system call. The
// received non-control data will be written to p, and any "out of band"
// control data will be written to oob. The flags are passed to recvmsg.
//
// The results are:
//   - n is the number of non-control data bytes read into p
//   - oobn is the number of control data bytes read into oob; this may be interpreted using [ParseSocketControlMessage]
//   - recvflags is flags returned by recvmsg
//   - from is the address of the sender
//
// If the underlying socket type is not SOCK_DGRAM, a received message
// containing oob data and a single '\0' of non-control data is treated as if
// the message contained only control data, i.e. n will be zero on return.
func Recvmsg(fd int, p, oob []byte, flags int) (n, oobn int, recvflags int, from Sockaddr, err error) {
	var iov [1]Iovec
	if len(p) > 0 {
		iov[0].Base = &p[0]
		iov[0].SetLen(len(p))
	}
	var rsa RawSockaddrAny
	n, oobn, recvflags, err = recvmsgRaw(fd, iov[:], oob, flags, &rsa) //// here recvmsgRaw may return n=-1 and err=EWOULDBLOCK 
	// source address is only specified if the socket is unconnected
	if rsa.Addr.Family != AF_UNSPEC {
		from, err = anyToSockaddr(fd, &rsa) //// later err may be overrided  to nil
	}
	return  //// In this case, it returns n=-1 but err=nil !
}

That is possible, right? In this case, unix.Recvmsg returns n=-1 but err=nil !

Metadata

Metadata

Assignees

Labels

BugReportIssues describing a possible bug in the Go implementation.NeedsFixThe path to resolution is known, but the work has not been done.compiler/runtimeIssues related to the Go compiler and/or runtime.help wanted

Type

No type

Projects

Status

Done

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions