Subject: Re: the size of an argument for set/getsockopt(2)
To: Hitoshi Asaeda <Hitoshi.Asaeda@sophia.inria.fr>
From: None <itojun@iijlab.net>
List: tech-kern
Date: 05/29/2002 17:19:26
>I felt the change of sys_setsockopt() in uipc_syscalls.c as well as
>sosetopt() in uipc_socket.c affected many parts.
>I don't prefer making users change mbuf size using sysctl after my
>code is comitted.
>Also, in fact, changing the size of mbuf is not a solution, since when
>we encounter "shorter storage for setsockopt()" after we change it, we
>again expand the size?

	i am not talking about changing mbuf size.  i am talking about
	ading support for cluster mbuf in sys_setsockopt().

	users won't notice the change.  the change i meant is perfectly
	internal to the kernel.  see below.

itojun


Index: uipc_syscalls.c
===================================================================
RCS file: /cvsroot/syssrc/sys/kern/uipc_syscalls.c,v
retrieving revision 1.68
diff -u -r1.68 uipc_syscalls.c
--- uipc_syscalls.c	2002/02/11 18:11:43	1.68
+++ uipc_syscalls.c	2002/05/29 08:19:11
@@ -241,6 +241,7 @@
 	if (error) {
 		fdremove(fdp, fd);
 		ffree(fp);
+		soclose(so);
 	}
 	m_freem(nam);
 	splx(s);
@@ -777,19 +778,22 @@
 	struct file	*fp;
 	struct mbuf	*m;
 	int		error;
+	unsigned int	l;
 
 	m = NULL;
 	/* getsock() will use the descriptor for us */
 	if ((error = getsock(p->p_fd, SCARG(uap, s), &fp)) != 0)
 		return (error);
-	if (SCARG(uap, valsize) > MLEN) {
+	l = SCARG(uap, valsize);
+	if (l > MCLBYTES) {
 		error = EINVAL;
 		goto out;
 	}
 	if (SCARG(uap, val)) {
 		m = m_get(M_WAIT, MT_SOOPTS);
-		error = copyin(SCARG(uap, val), mtod(m, caddr_t),
-			       SCARG(uap, valsize));
+		if (l > MLEN)
+			MCLGET(m, M_WAIT);
+		error = copyin(SCARG(uap, val), mtod(m, caddr_t), l);
 		if (error) {
 			(void) m_free(m);
 			goto out;