Module Name:    src
Committed By:   hannken
Date:           Wed Nov  7 09:59:12 UTC 2018

Modified Files:
        src/sys/kern: uipc_syscalls.c

Log Message:
Don't defer errors from sendmmsg().  This matches the linux manpage.

Defer errors from recvmmsg() through so_rerror and
tests and return a deferred error on entry.

Ok: christos@


To generate a diff of this commit:
cvs rdiff -u -r1.197 -r1.198 src/sys/kern/uipc_syscalls.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/kern/uipc_syscalls.c
diff -u src/sys/kern/uipc_syscalls.c:1.197 src/sys/kern/uipc_syscalls.c:1.198
--- src/sys/kern/uipc_syscalls.c:1.197	Mon Sep  3 16:29:35 2018
+++ src/sys/kern/uipc_syscalls.c	Wed Nov  7 09:59:12 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: uipc_syscalls.c,v 1.197 2018/09/03 16:29:35 riastradh Exp $	*/
+/*	$NetBSD: uipc_syscalls.c,v 1.198 2018/11/07 09:59:12 hannken Exp $	*/
 
 /*-
  * Copyright (c) 2008, 2009 The NetBSD Foundation, Inc.
@@ -61,7 +61,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: uipc_syscalls.c,v 1.197 2018/09/03 16:29:35 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uipc_syscalls.c,v 1.198 2018/11/07 09:59:12 hannken Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_pipe.h"
@@ -806,14 +806,11 @@ sys_sendmmsg(struct lwp *l, const struct
 	}
 
 	*retval = dg;
-	if (error)
-		so->so_error = error;
 
 	fd_putfile(s);
 
 	/*
-	 * If we succeeded at least once, return 0, hopefully so->so_error
-	 * will catch it next time.
+	 * If we succeeded at least once, return 0.
 	 */
 	if (dg)
 		return 0;
@@ -1052,6 +1049,16 @@ sys_recvmmsg(struct lwp *l, const struct
 	if ((error = fd_getsock(s, &so)) != 0)
 		return error;
 
+	/*
+	 * If so->so_rerror holds a deferred error return it now.
+	 */
+	if (so->so_rerror) {
+		error = so->so_rerror;
+		so->so_rerror = 0;
+		fd_putfile(s);
+		return error;
+	}
+
 	vlen = SCARG(uap, vlen);
 	if (vlen > 1024)
 		vlen = 1024;
@@ -1116,13 +1123,14 @@ sys_recvmmsg(struct lwp *l, const struct
 		m_free(from);
 
 	*retval = dg;
+
 	if (error)
-		so->so_error = error;
+		so->so_rerror = error;
 
 	fd_putfile(s);
 
 	/*
-	 * If we succeeded at least once, return 0, hopefully so->so_error
+	 * If we succeeded at least once, return 0, hopefully so->so_rerror
 	 * will catch it next time.
 	 */
 	if (dg)

Reply via email to