Received: by 10.223.148.5 with SMTP id 5csp7953818wrq; Thu, 18 Jan 2018 11:39:36 -0800 (PST) X-Google-Smtp-Source: ACJfBou0wIpds9OZ9/RrmZbtUSlCyDdkxfOu5SBPslvn8C7puS/9kxENgSvDRIoehmbF0ojp/5ry X-Received: by 2002:a17:902:8f98:: with SMTP id z24-v6mr310857plo.311.1516304376568; Thu, 18 Jan 2018 11:39:36 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1516304376; cv=none; d=google.com; s=arc-20160816; b=ga1LJOGJNwGJCxz05hX7vm7s2bD3s0Iq7IF3l0x/+y+87ctZQEbuP/y3QCEmZ3P4+p Oy9eA+Pri9lcGhfNWuanm/3BivE+5XEh1ysJF3MoXwoAAKOBgftBPI2v52GMbo20IgZy WbSNxlgXwaVyDJGdJgt+aN6mlJ7lZ1s6bRNhg30YKE8O37neHmSmz+1keX59sB6+IQMs Y1QUvuk7buEUuFyFjAgLniORd74MhMW59r9a77asCkXgcHT1FaiF5Ask1OtYn/14CuWU SAkR63BOCqnSoqE7zBqq2qdng022RXoe2bPZlLq7aUE43Pc3dQM/dwf28ibRGPVN8rI9 +iOg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:arc-authentication-results; bh=KqAgQ8UfnxAE86YB/7zFajuw0FRlP/e1sKPa1pnYEoE=; b=zQ2l4IkGJ8nJdaU72OcnMLGBeGtnvQUluxBp0QVwLRpyOgg37s1t04G7XKgzenwVbb YFiFuzm772jpJJ3QdgrS6kwoJPvS64EKPXpNaTsTZlOisbpB7TRpppfGrafCFfEpRgN4 Ac9NT20NWfrO4p8/4SFjDdd6PcmvpTpjnVbta3SiiLVFDOVMUkvzXbmDXcCZfYW/wg8l 2gg7EhZJr0AVOimNJnQ2FwnaX6w+Fr+CQwzYkUbi246fRyaI/G5y6xN0qyE2UMNQ53Y3 Qbfz6Hih7sMaNR0bRI2QjhozmUxM9ejidVM33T+vMqBaevDC8MghTZEiPLiCPJaNJsVE CjTg== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id b6-v6si144852plx.507.2018.01.18.11.39.22; Thu, 18 Jan 2018 11:39:36 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932687AbeARTiq (ORCPT + 99 others); Thu, 18 Jan 2018 14:38:46 -0500 Received: from zeniv.linux.org.uk ([195.92.253.2]:55694 "EHLO ZenIV.linux.org.uk" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932493AbeARTio (ORCPT ); Thu, 18 Jan 2018 14:38:44 -0500 Received: from viro by ZenIV.linux.org.uk with local (Exim 4.87 #1 (Red Hat Linux)) id 1ecG0t-0005EN-Ub; Thu, 18 Jan 2018 19:38:15 +0000 From: Al Viro To: netdev@vger.kernel.org Cc: "David S. Miller" , Linus Torvalds , linux-kernel@vger.kernel.org, Christoph Hellwig , Al Viro Subject: [PATCH 07/10] lift handling of SIOCIW... out of dev_ioctl() Date: Thu, 18 Jan 2018 19:37:52 +0000 Message-Id: <20180118193755.19997-7-viro@ZenIV.linux.org.uk> X-Mailer: git-send-email 2.9.5 In-Reply-To: <20180118193755.19997-1-viro@ZenIV.linux.org.uk> References: <20180118193156.GC13338@ZenIV.linux.org.uk> <20180118193755.19997-1-viro@ZenIV.linux.org.uk> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Al Viro Signed-off-by: Al Viro --- include/net/wext.h | 4 ++-- net/core/dev_ioctl.c | 18 ------------------ net/socket.c | 2 +- net/wireless/wext-core.c | 13 +++++++++---- 4 files changed, 12 insertions(+), 25 deletions(-) diff --git a/include/net/wext.h b/include/net/wext.h index e51f067fdb3a..aa192a670304 100644 --- a/include/net/wext.h +++ b/include/net/wext.h @@ -7,7 +7,7 @@ struct net; #ifdef CONFIG_WEXT_CORE -int wext_handle_ioctl(struct net *net, struct iwreq *iwr, unsigned int cmd, +int wext_handle_ioctl(struct net *net, unsigned int cmd, void __user *arg); int compat_wext_handle_ioctl(struct net *net, unsigned int cmd, unsigned long arg); @@ -15,7 +15,7 @@ int compat_wext_handle_ioctl(struct net *net, unsigned int cmd, struct iw_statistics *get_wireless_stats(struct net_device *dev); int call_commit_handler(struct net_device *dev); #else -static inline int wext_handle_ioctl(struct net *net, struct iwreq *iwr, unsigned int cmd, +static inline int wext_handle_ioctl(struct net *net, unsigned int cmd, void __user *arg) { return -EINVAL; diff --git a/net/core/dev_ioctl.c b/net/core/dev_ioctl.c index 5cdec23dd28e..d262f159f9fd 100644 --- a/net/core/dev_ioctl.c +++ b/net/core/dev_ioctl.c @@ -411,24 +411,6 @@ int dev_ioctl(struct net *net, unsigned int cmd, void __user *arg) if (cmd == SIOCGIFNAME) return dev_ifname(net, (struct ifreq __user *)arg); - /* - * Take care of Wireless Extensions. Unfortunately struct iwreq - * isn't a proper subset of struct ifreq (it's 8 byte shorter) - * so we need to treat it specially, otherwise applications may - * fault if the struct they're passing happens to land at the - * end of a mapped page. - */ - if (cmd >= SIOCIWFIRST && cmd <= SIOCIWLAST) { - struct iwreq iwr; - - if (copy_from_user(&iwr, arg, sizeof(iwr))) - return -EFAULT; - - iwr.ifr_name[sizeof(iwr.ifr_name) - 1] = 0; - - return wext_handle_ioctl(net, &iwr, cmd, arg); - } - if (copy_from_user(&ifr, arg, sizeof(struct ifreq))) return -EFAULT; diff --git a/net/socket.c b/net/socket.c index 6d29ebce93dd..d0e24f6ec1a9 100644 --- a/net/socket.c +++ b/net/socket.c @@ -1005,7 +1005,7 @@ static long sock_ioctl(struct file *file, unsigned cmd, unsigned long arg) } else #ifdef CONFIG_WEXT_CORE if (cmd >= SIOCIWFIRST && cmd <= SIOCIWLAST) { - err = dev_ioctl(net, cmd, argp); + err = wext_handle_ioctl(net, cmd, argp); } else #endif switch (cmd) { diff --git a/net/wireless/wext-core.c b/net/wireless/wext-core.c index 6cdb054484d6..9efbfc753347 100644 --- a/net/wireless/wext-core.c +++ b/net/wireless/wext-core.c @@ -1035,18 +1035,23 @@ static int ioctl_standard_call(struct net_device * dev, } -int wext_handle_ioctl(struct net *net, struct iwreq *iwr, unsigned int cmd, - void __user *arg) +int wext_handle_ioctl(struct net *net, unsigned int cmd, void __user *arg) { struct iw_request_info info = { .cmd = cmd, .flags = 0 }; + struct iwreq iwr; int ret; - ret = wext_ioctl_dispatch(net, iwr, cmd, &info, + if (copy_from_user(&iwr, arg, sizeof(iwr))) + return -EFAULT; + + iwr.ifr_name[sizeof(iwr.ifr_name) - 1] = 0; + + ret = wext_ioctl_dispatch(net, &iwr, cmd, &info, ioctl_standard_call, ioctl_private_call); if (ret >= 0 && IW_IS_GET(cmd) && - copy_to_user(arg, iwr, sizeof(struct iwreq))) + copy_to_user(arg, &iwr, sizeof(struct iwreq))) return -EFAULT; return ret; -- 2.11.0