Message ID | 4AB1FE2A.1060906@cn.fujitsu.com |
---|---|
State | Changes Requested, archived |
Delegated to: | David Miller |
Headers | show |
From: Shan Wei <shanwei@cn.fujitsu.com> Date: Thu, 17 Sep 2009 17:15:22 +0800 > Xiaotian Feng wrote, at 09/17/2009 01:19 PM: >> Due to man page of setsockopt, if optlen is not valid, kernel should return >> -EINVAL. But a simple testcase as following, errno is 0, which means setsockopt >> is successful. >> >> addr.s_addr = inet_addr("192.1.2.3"); >> setsockopt(s, IPPROTO_IP, IP_MULTICAST_IF, &addr, 1); >> printf("errno is %d\n", errno); >> >> This patch fixes the optlen check part, with the patch, we got errno EINVAL. >> > > I also think it's a bug, the freebsd also does the optlen check. > But the style should be coincident with other option: firstly check the > availability of optlen, then copy option value from user and deal with it. > > How about this one: This definitely is better and cleaner, but please don't post such things without proper signoffs and commit messages because now I have to ask you to do that instead of me just applying your patch :-/ -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/net/ipv4/ip_sockglue.c b/net/ipv4/ip_sockglue.c index fc7993e..5a06935 100644 --- a/net/ipv4/ip_sockglue.c +++ b/net/ipv4/ip_sockglue.c @@ -611,6 +611,9 @@ static int do_ip_setsockopt(struct sock *sk, int level, * Check the arguments are allowable */ + if (optlen < sizeof(struct in_addr)) + goto e_inval; + err = -EFAULT; if (optlen >= sizeof(struct ip_mreqn)) { if (copy_from_user(&mreq, optval, sizeof(mreq)))