This is the mail archive of the
ecos-discuss@sources.redhat.com
mailing list for the eCos project.
Problem with recv/recvfrom
- To: ecos-discuss at sources dot redhat dot com
- Subject: [ECOS] Problem with recv/recvfrom
- From: "Wade Jensen" <Wade_Jensen at inter-tel dot com>
- Date: Sun, 20 May 2001 15:54:14 -0700
The recv function calls recvfrom with a NULL fromlen parameter. The recvfrom
function always dereferences this parameter.
I assume that
msg.msg_namelen = *fromlen;
should be
msg.msg_namelen = fromlen ? *fromlen : (socklen_t)fromlen;
However, is it safe to pass this NULL fromlen pointer to ops->recvmsg?
Thanks,
Wade Jensen
>From packages\io\fileio\current\src\socket.cxx:
// -------------------------------------------------------------------------
__externC ssize_t recvfrom (int s, void *buf, size_t len, int flags,
struct sockaddr *from, socklen_t *fromlen)
{
SOCKET_ENTRY();
struct msghdr msg;
struct iovec iov;
ssize_t ret = 0;
int error = 0;
cyg_file *fp;
fp = cyg_fp_get( s );
if( fp == NULL )
FILEIO_RETURN(EBADF);
if( fp->f_type == CYG_FILE_TYPE_SOCKET )
{
cyg_sock_ops *ops = (cyg_sock_ops *)fp->f_xops;
// Set up a message header...
msg.msg_name = (caddr_t)from;
msg.msg_namelen = *fromlen;
msg.msg_iov = &iov;
msg.msg_iovlen = 1;
iov.iov_base = buf;
iov.iov_len = len;
msg.msg_control = 0;
msg.msg_flags = flags;
LOCK_SOCKET( fp );
error = ops->recvmsg( fp, &msg, fromlen, &ret );
UNLOCK_SOCKET( fp );
}
cyg_fp_free( fp );
if( error != ENOERR )
SOCKET_RETURN(error);
SOCKET_RETURN_VALUE( ret );
}
// -------------------------------------------------------------------------
__externC ssize_t recv (int s, void *buf, size_t len, int flags)
{
return recvfrom( s, buf, len, flags, NULL, NULL );
}