This is the mail archive of the ecos-discuss@sources.redhat.com mailing list for the eCos project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

Problem with recv/recvfrom




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 );
}





Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]