Follow @Openwall on Twitter for new release announcements and other news
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Date: Tue, 26 Jun 2012 12:01:06 -0400
From: Rich Felker <>
Subject: Re: openssh and sendmsg() problem

On Tue, Jun 26, 2012 at 02:00:17PM +0200, Szabolcs Nagy wrote:
> * orc <> [2012-06-26 19:01:46 +0800]:
> > strace shows that sendmsg system call returns EINVAL:
> > 
> > sendmsg(5, {msg_name(0)=NULL, msg_iov(1)=[{"\0", 1}], msg_controllen=24, {cmsg_len=20, cmsg_level=SOL_SOCKET, cmsg_
> > type=SCM_RIGHTS, {4, 385875968}}, msg_flags=0}, 0) = -1 EINVAL (Invalid argument)
> > 
> src/network/sendmsg.c has an ifdef for long>int case
> i don't know what it's supposed to do

It's there because the kernel expects certain fields to be long but
POSIX requires them to be int. Thus the syscall wrapper has to copy
the userspace struct (with int and padding) to a kernel-format struct
(with the padding filled with 0's so it's a valid long).

> you may want to change the struct msghdr definition
> in arch/*/bits/socket.h
> (eg to the one in your /usr/include/bits/socket.h)
> and remove the ifdef from sendmsg.c

Nope, this is not valid. See above.


Powered by blists - more mailing lists

Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.