[1/4] connection: Fix sendmsg() on FreeBSD

Submitted by Philip Withnall on Nov. 1, 2014, 5:06 p.m.

Details

Message ID 1414861577.2217.25.camel@philip-laptop
State Superseded
Headers show

Not browsing as part of any series.

Commit Message

Philip Withnall Nov. 1, 2014, 5:06 p.m.
It expects ((msg_controllen == 0) == (msg_control == NULL)), and returns
EINVAL otherwise. It can't hurt to be tidy about things on other platforms
either though.

See: https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=99356#c5

Signed-off-by: Philip Withnall <philip at tecnocode.co.uk>
Signed-off-by: Karsten Otto <ottoka at posteo.de>
---
 src/connection.c | 13 +++++++++++--
 1 file changed, 11 insertions(+), 2 deletions(-)

Patch hide | download patch | download mbox

diff --git a/src/connection.c b/src/connection.c
index f292853..c4eb354 100644
--- a/src/connection.c
+++ b/src/connection.c
@@ -287,10 +287,19 @@  wl_connection_flush(struct wl_connection *connection)
 		msg.msg_namelen = 0;
 		msg.msg_iov = iov;
 		msg.msg_iovlen = count;
-		msg.msg_control = cmsg;
-		msg.msg_controllen = clen;
+		msg.msg_control = NULL;
+		msg.msg_controllen = 0;
 		msg.msg_flags = 0;
 
+		/* FreeBSD requires msg_control to be set to NULL iff
+		 * msg_controllen is 0 (see
+		 * http://www.freebsd.org/cgi/query-pr.cgi?pr=docs/99356#reply2)
+		 * Can't hurt to do that on all platforms. */
+		if (clen > 0) {
+			msg.msg_controllen = clen;
+			msg.msg_control = cmsg;
+		}
+
 		do {
 			len = sendmsg(connection->fd, &msg,
 				      MSG_NOSIGNAL | MSG_DONTWAIT);

Comments

On 11/01/2014 10:06 AM, Philip Withnall wrote:
>
> It expects ((msg_controllen == 0) == (msg_control == NULL)), and returns
> EINVAL otherwise. It can't hurt to be tidy about things on other platforms
> either though.
>
> See: https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=99356#c5
>
> Signed-off-by: Philip Withnall <philip at tecnocode.co.uk>
> Signed-off-by: Karsten Otto <ottoka at posteo.de>
> ---
>   src/connection.c | 13 +++++++++++--
>   1 file changed, 11 insertions(+), 2 deletions(-)
>
> diff --git a/src/connection.c b/src/connection.c
> index f292853..c4eb354 100644
> --- a/src/connection.c
> +++ b/src/connection.c
> @@ -287,10 +287,19 @@ wl_connection_flush(struct wl_connection *connection)
>   		msg.msg_namelen = 0;
>   		msg.msg_iov = iov;
>   		msg.msg_iovlen = count;
> -		msg.msg_control = cmsg;
> -		msg.msg_controllen = clen;
> +		msg.msg_control = NULL;
> +		msg.msg_controllen = 0;
>   		msg.msg_flags = 0;
>
> +		/* FreeBSD requires msg_control to be set to NULL iff
> +		 * msg_controllen is 0 (see
> +		 * http://www.freebsd.org/cgi/query-pr.cgi?pr=docs/99356#reply2)
> +		 * Can't hurt to do that on all platforms. */
> +		if (clen > 0) {
> +			msg.msg_controllen = clen;
> +			msg.msg_control = cmsg;
> +		}
> +
>   		do {
>   			len = sendmsg(connection->fd, &msg,
>   				      MSG_NOSIGNAL | MSG_DONTWAIT);
>

How about:

		msg.msg_controllen = clen;
		msg.msg_control = clen ? cmsg : NULL;