From patchwork Wed Jan 22 14:41:03 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Peter Seiderer X-Patchwork-Id: 859304 Received: from mout.gmx.net (mout.gmx.net [212.227.15.15]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 5340E214805; Wed, 22 Jan 2025 14:41:41 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=212.227.15.15 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1737556904; cv=none; b=ltx2qisKxOmBtG4a1abtSikLpHymh8IEvUGjO+MNKvYxS1UNm95IFIC+ZBPT8DJrphtm+XOEtZsbqrdNCWF8niy6a+9ldhb9Rt/XCWogkds4AV4Q0bkiOt0ckp1BfDdpQ2pcKuTnDN/feyR0wMTTUyp8VK5v60ETPnZlsjB0+Xw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1737556904; c=relaxed/simple; bh=lUzNxOeGI0LuccPLT80V3d8mFbkoLYfx1I9UgEERrPY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=AtDaSyMPPOQMvIbOSB27D0m3ztRKcfp3rNJ+bGs576FpvHBNps1pX1DwHNUO0jYdks21X4LREjsUAG4+/Ne/R5OFhM/dz+356ZCmhWNXB1pwiy4vfpI0xhRiht2tX5TkYyN94MlB+DFR2PNzEWgKBHrXatd4ttSIns+n0z7Er48= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=gmx.net; spf=pass smtp.mailfrom=gmx.net; dkim=pass (2048-bit key) header.d=gmx.net header.i=ps.report@gmx.net header.b=AY8kJAGw; arc=none smtp.client-ip=212.227.15.15 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=gmx.net Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmx.net Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmx.net header.i=ps.report@gmx.net header.b="AY8kJAGw" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmx.net; s=s31663417; t=1737556887; x=1738161687; i=ps.report@gmx.net; bh=lUzNxOeGI0LuccPLT80V3d8mFbkoLYfx1I9UgEERrPY=; h=X-UI-Sender-Class:From:To:Cc:Subject:Date:Message-ID:In-Reply-To: References:MIME-Version:Content-Transfer-Encoding:cc: content-transfer-encoding:content-type:date:from:message-id: mime-version:reply-to:subject:to; b=AY8kJAGw0g72kwm7t9PAq7wJwzM6pvAHh1rAnzi4MavoUnfYaqywX1WtdsJFJDON Gbq7g9KmjIfwLp/2DByRiqfVrN9SlBDFg1qdz/U17K6aZVLqQBJxFoOu+U3qaz91u uiuoWA8C3xias5lqItvdv20777YoexH6wN056g8H80/Pufem5KiZ0xds0SnH778Jo jsdepKpOTsbRylS1h/WDGZQ8bxOqnLulXrejHnKXj8hflZbM52isL4Nrvj952bphf AL0oOvzwgdlD5rLvh+JlJRhQnlbi76ukIMip5dtdOWSe/1W308rwoIv8hBHWHIgSG SqIP3/bzIp6peNOl0Q== X-UI-Sender-Class: 724b4f7f-cbec-4199-ad4e-598c01a50d3a Received: from localhost.fritz.box ([82.135.81.9]) by mail.gmx.net (mrgmx005 [212.227.17.190]) with ESMTPSA (Nemesis) id 1MN5eR-1tt6fq2QKL-00WwbV; Wed, 22 Jan 2025 15:41:27 +0100 From: Peter Seiderer To: netdev@vger.kernel.org Cc: linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, "David S . Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Simon Horman , Shuah Khan , Frederic Weisbecker , Artem Chernyshev , Nam Cao , Peter Seiderer Subject: [PATCH net-next v2 1/8] net: pktgen: replace ENOTSUPP with EOPNOTSUPP Date: Wed, 22 Jan 2025 15:41:03 +0100 Message-ID: <20250122144110.619989-2-ps.report@gmx.net> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250122144110.619989-1-ps.report@gmx.net> References: <20250122144110.619989-1-ps.report@gmx.net> Precedence: bulk X-Mailing-List: linux-kselftest@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Provags-ID: V03:K1:nLWXdbhIuNeJfjk1QrJ3BJLUr8VKVD2O924VQHvWNSy7BB7Dl2L 67cEhD1+nRmK/hYCnmk6sZ8O+d0Exx+WDBgfxVErDU6vZcMlTRMfwyjAMUFI102C+Ds+zCW d5NASfVTBt/tw53Ayz9VNN8Z+UbRaGKC2edHkPGN7jWN3aWMT2YPjzvlCj9cUOV5wgxA1rv eRUyEEJ5CO2XmYEZhtexA== X-Spam-Flag: NO UI-OutboundReport: notjunk:1;M01:P0:NAfkfSU8IN0=;6tIJuGhJguqVl1CeLWYQ+7xr/Y9 OBE+qkDy9egaa79Qq+HNybT6Gs6n+ABOVkKsXnATBx0XfE7R6t88ICWhvp0+C+Uvr82MDI0Z3 VUuAt6RfnhgyKStGhG60XqmSQZW8pJLp82GSYEMhnkY+qLgLrNWGH1o9o66GNfH827sMVS2Tc j1SLFUtgfDBPsT2aUZyETCGqjCL0O/01Nuy8yH2cSsmml3JLuUHWs4AaT6noEYlYmK4W0qxZ/ rowMFuG1Xpe+3+Sz2v7Ku1uiEJW5+V0OyGHAB0hRokm5NyfbpDkRHa21aiF1Qzv8Aun0e4LsH ACBEvgccwit12jNpnebgEibpfy4VHeF6Hi3PEyNS1LvWX9sW9TjnY6/vzLgK99j/oKy01JLr4 PS0v97n/E3DuP0vZE2w7QV/kwswLs0peINcYXCucGlkSVnTODPd8LOIJ7i7fbw8G1YYOj7XnJ 2dcM4Z4TDh4m3cnpbbl30Exa1IJvSW6pr/1uaQO1HlZEzkJIrWA+r3xPXJgrJSUkBgWkg/AG+ zBgtPR3BfSXSDUK7ujciOV0QNMlQo2bQFeQaTDSVZIm3mNQBdcWtoRpMPWEZayw+q3LugIkGg /gfFkmU2fbteMETwHmXWaOmm2O9iYkLCKAww8K4Cu5or5inEJv1C8WxjCHlZgJ5tmimv7l4QT 4Nih3GTXvKJRWv0txj7VsooPdC2Gj72ieI45nuB8+CvErw0yXuwwdcmdNq/4TCnED+XQD5k/4 Wh/wq5vX1D+PnjQ0kblMCJVvmvdeIrMHVRbtys0JGobTxN8voASEsgE16mUSSfqFCJ6UwSAHa FTrx6FfpdG4k/ENlAJB8WRj8YL1lzcJzqWAIVJ1izc5uPsU0dx1yoJNWfZgW+Z4oxLD/PSy5W 7n+udGmKqCdZvNI7HL4ocmLU7xQjHHH7x8uJ4rsIORyCEmMjkijNF7AwyvQcynJ6KFlMob6RS b9wgtSq0ZqEOEcyJ7XhP8uxujTfR2kRjAVKr9YsKr55gkFYZlEh47v6LIynCajh9xXFMvFKzd HyILoixSPa1Za4PRTj1ZgXSYpuxa+liJp2nHHRVLtjehEqOSnfDX/4WrjheWE7f1kkBRS7IYG nxRKGdoGmDthLRGGwVLWlbof0/qY9W+NezQvzYJrgoEVWUI8c+uREjUR18K3hyQ4HsDodCLUb SJFrTa13KukySbnaZKW4/RKLCvmFiPSSXemUU8/3HvA== Replace ENOTSUPP with EOPNOTSUPP, fixes checkpatch hint WARNING: ENOTSUPP is not a SUSV4 error code, prefer EOPNOTSUPP and e.g. $ echo "clone_skb 1" > /proc/net/pktgen/lo\@0 -bash: echo: write error: Unknown error 524 Signed-off-by: Peter Seiderer --- Changes v1 -> v2 - no changes --- net/core/pktgen.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/net/core/pktgen.c b/net/core/pktgen.c index 82b6a2c3c141..496aa16773e7 100644 --- a/net/core/pktgen.c +++ b/net/core/pktgen.c @@ -1198,7 +1198,7 @@ static ssize_t pktgen_if_write(struct file *file, if ((value > 0) && ((pkt_dev->xmit_mode == M_NETIF_RECEIVE) || !(pkt_dev->odev->priv_flags & IFF_TX_SKB_SHARING))) - return -ENOTSUPP; + return -EOPNOTSUPP; if (value > 0 && (pkt_dev->n_imix_entries > 0 || !(pkt_dev->flags & F_SHARED))) return -EINVAL; @@ -1258,7 +1258,7 @@ static ssize_t pktgen_if_write(struct file *file, ((pkt_dev->xmit_mode == M_QUEUE_XMIT) || ((pkt_dev->xmit_mode == M_START_XMIT) && (!(pkt_dev->odev->priv_flags & IFF_TX_SKB_SHARING))))) - return -ENOTSUPP; + return -EOPNOTSUPP; if (value > 1 && !(pkt_dev->flags & F_SHARED)) return -EINVAL; @@ -1303,7 +1303,7 @@ static ssize_t pktgen_if_write(struct file *file, } else if (strcmp(f, "netif_receive") == 0) { /* clone_skb set earlier, not supported in this mode */ if (pkt_dev->clone_skb > 0) - return -ENOTSUPP; + return -EOPNOTSUPP; pkt_dev->xmit_mode = M_NETIF_RECEIVE; From patchwork Wed Jan 22 14:41:05 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Peter Seiderer X-Patchwork-Id: 859306 Received: from mout.gmx.net (mout.gmx.net [212.227.15.18]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id AB4D8214205; Wed, 22 Jan 2025 14:41:34 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=212.227.15.18 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1737556896; cv=none; b=u+PR9fT/cAa5sX58oSTwsal17zOsE9/lpYTTBGKo9OcQzTTuUUcdGNzmF6mulOggqk5vFgX5RGq3WgowQLhGCNHnq591KZ5ISXLcnUEg8xLHOP+S2kDA3VVgpjwRjAebeptWWOzfdlqCPGBFARm3eZcrmmSyd/9TBRvW4FCmhD8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1737556896; c=relaxed/simple; bh=V5UmF8gW4RvXtY10lRp+LF0r3060eq4XPbZN/wKQ6yI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=ErfdyrUN7KRKVkYVmd3NanH0FIubEZ6kPd0RyPGnsYNGs+VUke8q/he2GfiY0htPGkGin7VE0GHa2SaJPSdncsAyeY5xYWO7e9xu7KRLSt9S+bqp2nCU4mZWpMjZ2/kUB8buXJMFPuTTyzY/ocTZ2Sl7ej8WAG9CHCoFaRy0xPA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=gmx.net; spf=pass smtp.mailfrom=gmx.net; dkim=pass (2048-bit key) header.d=gmx.net header.i=ps.report@gmx.net header.b=DvWObkag; arc=none smtp.client-ip=212.227.15.18 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=gmx.net Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmx.net Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmx.net header.i=ps.report@gmx.net header.b="DvWObkag" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmx.net; s=s31663417; t=1737556890; x=1738161690; i=ps.report@gmx.net; bh=V5UmF8gW4RvXtY10lRp+LF0r3060eq4XPbZN/wKQ6yI=; h=X-UI-Sender-Class:From:To:Cc:Subject:Date:Message-ID:In-Reply-To: References:MIME-Version:Content-Transfer-Encoding:cc: content-transfer-encoding:content-type:date:from:message-id: mime-version:reply-to:subject:to; b=DvWObkag++p4MqiVRxNngw+nvfllVXGjV+LzDCSYll9G7w8U7sCSVV+MKTIrL1DM SBF8yDLqNixADGGf6tRvfegqFiN5j88tDxxi8GvSRFVB3CQfYLB2zvbuSUahcopPa GQNqtmnZo/dHdlrtN4N4VlilUACnwADJ+6RNDTEQcsN46lTXndCPeGHOlGwtQqR4b +xjB0VngLjoXZS6qTORnlKBQQ2k25yvNePYYGwUYHDaSf9Y5r3cWZaWyCNoNR/fH+ BdoSirPopUm/RQkqLVx3/j1o16+5ZL3RqYnhjzp4aso0TTj8w4O/O175dk8t8vbLm xcWdKNtVY32GGTRUgw== X-UI-Sender-Class: 724b4f7f-cbec-4199-ad4e-598c01a50d3a Received: from localhost.fritz.box ([82.135.81.9]) by mail.gmx.net (mrgmx005 [212.227.17.190]) with ESMTPSA (Nemesis) id 1MNbkv-1tqNNZ2OCZ-00T62t; Wed, 22 Jan 2025 15:41:30 +0100 From: Peter Seiderer To: netdev@vger.kernel.org Cc: linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, "David S . Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Simon Horman , Shuah Khan , Frederic Weisbecker , Artem Chernyshev , Nam Cao , Peter Seiderer Subject: [PATCH net-next v2 3/8] net: pktgen: fix hex32_arg parsing for short reads Date: Wed, 22 Jan 2025 15:41:05 +0100 Message-ID: <20250122144110.619989-4-ps.report@gmx.net> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250122144110.619989-1-ps.report@gmx.net> References: <20250122144110.619989-1-ps.report@gmx.net> Precedence: bulk X-Mailing-List: linux-kselftest@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Provags-ID: V03:K1:Z9HGwG8S3ratyxebtluKy5iOM0nXJSHOOlfIQYuQsThz6hs8Kt6 bkXSkLQaCQFDQ3CYeNGNHNDuMaMkZac/mDS/7vxVWCKts85tNsMOuA3EeGH1eyNVBbFxout Q5VZ3froBcQ7POSXqRpiMJEFNN3BF29gBLk3kEQvQ0Hfo+rA0OQPCs6lg903WPjRGsyw9Lp x6WAFimHktIBX1dGr+9hg== X-Spam-Flag: NO UI-OutboundReport: notjunk:1;M01:P0:pfo27eJ2jCs=;YuPh8Z3S1TDNvuoGaDRu+xx/U8R LP9yS1UoeTuu2KZzUSecWoLtsOl6bvhtIlx3qAjKrxDWmw8B0VcUPLkEcfDbm30DiiiHnP1Ow 0NlUXou/kzaHkC2afg0Z2byZ9FHyFyCapcqwV9IsrOFn1fd7GiM8Lu/Dh47fYLZVg/ScFoldt +ObcPAhyPW9ZQ8BrmTCJgpF3aQJprRgGQs1RM1EjirIQXs3KrwH4yuTLnDVameNvXiQqU0GpT MWhN7ZbZNg/cHCxuKrAefErnuapcHq95lBXnrWtp7DQ2O/7vKSmTnxRZvKvWO+doY+FtO5XJ4 5NYg8WIUuO7bcUUcxzJ2f9oVazrB14pt9pI4PEFSWCsXJ6DcLh9qI4C2g1ni1lXGvcSn3MKlN 2/gyyadNyxEph3Cqq2HloA6b6igUwhxiav/Ctu6TKHN2GFC8uhGvTSni7oprxB8AXVfwZ+tvi zPkRGYfpa06L3fpSi1p1mBrisLzJFFTKmK6LCRQqZ8S2yC3ZAWt9kOpFmnz2+rOF+VlcQBol3 S5DAGjzyalvkC9T+OnPmx3fvcYYwq+LfSKi6MsMmGHU3upW2pGkU5WG9YDhl+IVBvHDo54Hqs +QMDR0QbnFflUSmeRL9CnhSXSg6lz4sKRxigIHEWFBxNZzeqyJ3KLW/5uiCkkehmnrwWd1Q5c ADgEaLlrf+A3Ya4KX+qKSU8KahDbXCciFtK15e3t0xERQcjTjLLxkChoYeyiTbFHnATYjw4az Nfwf5UO2Oi7ogEcJCRX1zJO9eXnafIfop7sgBMJuQw4+Fyaizo4gWeb0Im0xdfx4I6LDdyMKi P7gYVSa0bazXPSg0J7SPknJwen2n3CNitvxbiLa3k7vrNv1Ezk5RWeg+igayH0VKkNEdR9dJ2 90dqK2iILxnrn5koSbcGTXnsMMsELP/tw299xQo0XUsftEjErfIw59jQnV4Ky0SdwTr9jAULC vwF13gXDlQucuv++EwA+sR/Fq2X0kLqVEIZItHbGXXNwWjU1MUTDLfefrjvijSmu8lYnC88is 6IPXxj/CeEOuogcogCxMbeuQvnzbIonhnWfGCJH5opEz1VJe9p1b0vSJNZ8kIfK7yMQFVr8g6 /U81k46rqGQ/FfSzwQZSuxurfcf2PBDgn+eJN5wCax6Fg4NVcLdHcgN+qzZeqrWOG83Byueq3 bzCoOTN4UADpYO5BUQ+jNi2x+WLjki3RpkPeVuCYb6PfqZHc9JATvfowLk431LXZkHzc+33Jp yGFNDB0ueTDZFK+F7CU3jf9NJQ0HJcyhhbkKFUWWXITYqW3Y6TJaRfZENbooP8ampkcVVVr1E 79dYVq5BFwPafLcpSqfMRGjmvhElxoQ1HqHwoAt2Mo7EnU= Fix hex32_arg parsing for short reads (here 7 hex digits instead of the expected 8), shift result only on successful input parsing. - before the patch $ echo "mpls 0000123" > /proc/net/pktgen/lo\@0 $ grep mpls /proc/net/pktgen/lo\@0 mpls: 00001230 Result: OK: mpls=00001230 - with patch applied $ echo "mpls 0000123" > /proc/net/pktgen/lo\@0 $ grep mpls /proc/net/pktgen/lo\@0 mpls: 00000123 Result: OK: mpls=00000123 Signed-off-by: Peter Seiderer --- Changes v1 -> v2: - new patch --- net/core/pktgen.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/net/core/pktgen.c b/net/core/pktgen.c index 4f8ec6c9bed4..28dbbf70e142 100644 --- a/net/core/pktgen.c +++ b/net/core/pktgen.c @@ -753,14 +753,15 @@ static int hex32_arg(const char __user *user_buffer, unsigned long maxlen, for (; i < maxlen; i++) { int value; char c; - *num <<= 4; if (get_user(c, &user_buffer[i])) return -EFAULT; value = hex_to_bin(c); - if (value >= 0) + if (value >= 0) { + *num <<= 4; *num |= value; - else + } else { break; + } } return i; } From patchwork Wed Jan 22 14:41:07 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Peter Seiderer X-Patchwork-Id: 859305 Received: from mout.gmx.net (mout.gmx.net [212.227.15.15]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 39C4E214205; Wed, 22 Jan 2025 14:41:39 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=212.227.15.15 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1737556902; cv=none; b=uJlrOhyP7EYfqNkoJokQtZeB+PYpKyTZwlskWwHM9DCb3k/SkdxrGjvnhbO4oZoMaaxJcIkS5GE6+X8c5MKgp97q/hP7KCfVXdYp+iVgQLCbeBPdrm5iB6xdN6/M4vBZAV0z1xQ3jjThcIykwSRldrMVLFMld9lquyq3wh/VYIc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1737556902; c=relaxed/simple; bh=q+DeEF53Y/cb5V9LljwFbWurT4RT/qgfwLs4GI4NwU0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=cwnIvFfwq0a6iyO1Ld3Oh2+KO/xtNCfwgoreuO8GHwBA7PIBGd229V13JhwwOU7Bwg7xhnHx3mFJtjTxdzy3dxBEjlSqPV99LUY3Pn7BkNbPDbVqoRUbdN/m90xVIp43do8/bKeg0dKM2aP6s3BgFNfEMNmAlMhCiZIEEdy9j2o= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=gmx.net; spf=pass smtp.mailfrom=gmx.net; dkim=pass (2048-bit key) header.d=gmx.net header.i=ps.report@gmx.net header.b=VYzHMR1F; arc=none smtp.client-ip=212.227.15.15 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=gmx.net Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmx.net Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmx.net header.i=ps.report@gmx.net header.b="VYzHMR1F" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmx.net; s=s31663417; t=1737556893; x=1738161693; i=ps.report@gmx.net; bh=q+DeEF53Y/cb5V9LljwFbWurT4RT/qgfwLs4GI4NwU0=; h=X-UI-Sender-Class:From:To:Cc:Subject:Date:Message-ID:In-Reply-To: References:MIME-Version:Content-Transfer-Encoding:cc: content-transfer-encoding:content-type:date:from:message-id: mime-version:reply-to:subject:to; b=VYzHMR1FFcAvBOXpzl/wd99I2bF9vrlTo3u+31KbAcDg3HS+uNbcZeWY65wsMi/R x5bLycmIwMZRRxV/imVe4tt6I+LNSrhTxq0o91SS/aaGIxrGhqjydUOAfr9BIMllg PUtxZEOgxnsL32AsOTV2RoBdaAZO2nUuG2+L7J7K42isj2U9fqqEj45P5wUtv1HXm /hnoVXUz7fOzehb/vH3PYxncA9dwLyxSdweFNImWAuUgvpeU4uR2vDXoZxwkdzayE bJy28AKt4ZKwE3sncTo3IEDjUFHqbAU3+kUPTe9lKtMIBlBbyro4sBiRO6IbA/77L QzNFykAaPIJ+M8aLoA== X-UI-Sender-Class: 724b4f7f-cbec-4199-ad4e-598c01a50d3a Received: from localhost.fritz.box ([82.135.81.9]) by mail.gmx.net (mrgmx005 [212.227.17.190]) with ESMTPSA (Nemesis) id 1Mof5H-1t7vwS0yz3-00cH7x; Wed, 22 Jan 2025 15:41:33 +0100 From: Peter Seiderer To: netdev@vger.kernel.org Cc: linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, "David S . Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Simon Horman , Shuah Khan , Frederic Weisbecker , Artem Chernyshev , Nam Cao , Peter Seiderer Subject: [PATCH net-next v2 5/8] net: pktgen: fix 'ratep 0' error handling (return -EINVAL) Date: Wed, 22 Jan 2025 15:41:07 +0100 Message-ID: <20250122144110.619989-6-ps.report@gmx.net> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250122144110.619989-1-ps.report@gmx.net> References: <20250122144110.619989-1-ps.report@gmx.net> Precedence: bulk X-Mailing-List: linux-kselftest@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Provags-ID: V03:K1:91nyc8Mk0+LSRJLOCCiqwDh5f4HOyh8aQNJS20GMLH7RYoh1W9g H9Q3jNVjw17Y8G55O4RD+k2qL9VP1A9+l5mIaHs/IbkiD6x/Dl2WkdXQCeQAN0h2iaIc71i 1JntLAgLX6RKOCeSjtFk2xuWGifYF3MDpkoSM3oFdBB7iK9IpwTvjM/q7BYryZQxaxDYkoY ULpUPcdXH/vX7ndNdkhtQ== X-Spam-Flag: NO UI-OutboundReport: notjunk:1;M01:P0:wBbKBw/Q5DY=;m4EOd4EHHmXp2eqYmDu0XITgk7i iKUNzrOz/YQ4LN8+QcXdZ+pvEp2TP+OuiKQWyQnUuGu5Ro1SXG2dcm6N37Z2FC7yApa/zOjIX srt2nJiK+KydBfhDXw//OijgW+qyOYDkH7D7PulVkOtIRR03hC/YEvdzdZ3O1+kDsta7kC+BL 7eavYJ4r3UYn7Ml4hcuQo0AuDvob7gEoBsNQXWQiQRASvtKGIQo6FubbVT5qLaavYQ6hE5wz+ zNwH4JKEWA7caJ96a95ZwBHOF1YsnoQBLj+irvgQWOR8TYktzIs2C89aG6tbb9Q5rSoU7qJ2J zcQLmZYxvVxNnWYlg8NFqo2RPKK4JNnE5Zp2Q+uRIqOzUHRpNuBRYKzrzv8Iv8A7ZD6N7HCRO gSAhPqTTTKYyImBC1QC8WgsPces0fS9cK2qBfCCxXHiFdj/BUAhffzizkCpwmlOLuqCw6PPZw ni8MqF+akxje6unfKMbGnTnqyA6iThukyRHJfy4c5m8Yf0Y7cict/kcOscvry4SSFGXurKSCX iUs4GSrSN8LT26RFYkNijxEoNv9Si51pxXmXqqTxuUIkZ8ct1XdScpAKbCs/T5FDOwkOO5pcb ooeX6HZX9FS9e/UwzM5yt6kzAMEu93eEaMMKLwYToALtSpU+P9i7ZVOQNfj/SrIwK6ISkdui+ en7EsNO6FbMx2733bBfiUKYOMQ2VboE84Um4For0cbdwaXCEiT0arMj0bs50bmUX3zp8CpwAB fmcf7qiv5UgiTiz6LCz5jX40zy+KxZHVkyzsTXE0xQ2QhhpTfmpMPIU1gHkj3iKDRlK1IheuA 2AqKL+rS3HpoPxpHCAEPBHGTmYOtPMNhRf0FIPoDv1y1zwguORTQOxJ1O91kolnsRpLJ/Jer1 IUu+D84S1BsFu7WWJQO5f5XtK0K3Wufqh4i5Srr5RgUgcHa/Ar6ClI5ZDRNh5KPC8iS2raDDl /bgrftbY9R6BNznbw2QGzdvBk/PNn7opfUTLvVasB7XsDUvq8b8b2D8pz7NKnZ80kxakse3pB uk4wFFIJbsopCFWSRk9eriZ8RhAZMYPULXFKs/0nEfUQ2LGOKwR+qjEc2YLNQmlQBo3tA/B7A AWKPSIFn073m3mEII9r0yEAPEzmleluRMoQ92fnuWDF8HdK3lOj8QTfV6O3DsOgVEdek0/vG5 yngMHluKNLfAmWZOpyUDOBWX+k8gGt6I/p9YULrLJyA== Given an invalid 'ratep' command e.g. 'ratep 0' the return value is '1', leading to the following misleading output: - the good case $ echo "ratep 100" > /proc/net/pktgen/lo\@0 $ grep "Result:" /proc/net/pktgen/lo\@0 Result: OK: ratep=100 - the bad case (before the patch) $ echo "ratep 0" > /proc/net/pktgen/lo\@0" -bash: echo: write error: Invalid argument $ grep "Result:" /proc/net/pktgen/lo\@0 Result: No such parameter "atep" - with patch applied $ echo "ratep 0" > /proc/net/pktgen/lo\@0 -bash: echo: write error: Invalid argument $ grep "Result:" /proc/net/pktgen/lo\@0 Result: Idle Signed-off-by: Peter Seiderer --- Changes v1 -> v2: - new patch --- net/core/pktgen.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/net/core/pktgen.c b/net/core/pktgen.c index 75c7511bf492..c8a5b4d17407 100644 --- a/net/core/pktgen.c +++ b/net/core/pktgen.c @@ -1130,7 +1130,7 @@ static ssize_t pktgen_if_write(struct file *file, i += len; if (!value) - return len; + return -EINVAL; pkt_dev->delay = NSEC_PER_SEC/value; if (debug) pr_info("Delay set at: %llu ns\n", pkt_dev->delay); From patchwork Wed Jan 22 14:41:09 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Peter Seiderer X-Patchwork-Id: 859303 Received: from mout.gmx.net (mout.gmx.net [212.227.15.15]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B6B15215072; Wed, 22 Jan 2025 14:41:48 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=212.227.15.15 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1737556911; cv=none; b=V19Af0PC+vjDIDjKarQk4QVzI8yXMHg9P1ulRSyqZd+DEDoYHSnjx6LBRHMcY7dYMsvTOceCOMqmHP2Y+QEdw15LBsMsp+dpn8VMSQ0+0PTjRUgr8f8VdldPzqtWjiBxifGk98A2401FeYoPAkKMY9hVRmhk3ylQuZJvWdCNvMY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1737556911; c=relaxed/simple; bh=bFRmCxcDRw4P/M46YqZ3qFTwpdewh/L9b10ZMVqQxXU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=XOHswIQCTwwri/D61DfzgbaIp02E+rhiGuyQFfjaxTaY3bxgnsPRw3yhGR1fmTh+B2X+gG0I4YG/frEQMdBtol3pJs0DJsZpdTYhTME5UPYIVpd5IFCJPPMkBXXiZOYwDmpLP2EXuzlGXyhG580JRUInyvxnYQ9/kpmFsfLF4KI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=gmx.net; spf=pass smtp.mailfrom=gmx.net; dkim=pass (2048-bit key) header.d=gmx.net header.i=ps.report@gmx.net header.b=Bk13AtR9; arc=none smtp.client-ip=212.227.15.15 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=gmx.net Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmx.net Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmx.net header.i=ps.report@gmx.net header.b="Bk13AtR9" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmx.net; s=s31663417; t=1737556896; x=1738161696; i=ps.report@gmx.net; bh=bFRmCxcDRw4P/M46YqZ3qFTwpdewh/L9b10ZMVqQxXU=; h=X-UI-Sender-Class:From:To:Cc:Subject:Date:Message-ID:In-Reply-To: References:MIME-Version:Content-Transfer-Encoding:cc: content-transfer-encoding:content-type:date:from:message-id: mime-version:reply-to:subject:to; b=Bk13AtR9q2tm4y0cLP0XiSBYJ9nAsVWnsD7P4zhN5ySGjHecux4gSohfF+imBWnH /EW5RUSYOsw+plAUxypC/Bgedyp1hTs7XMQ0/2fNajURa86AmROyVYAUlSo8zsX1g 1dHK/3HE/ZsaUC76M9Yb26fFJlU6JCJL/pWUsbwEPBnj/fAC8E9jmFFfo2QLPa+OE D/oZmqalGphcF+uNh2Pmnz7SLAmLl7XEah0D1yJoA0emGqYfY/G04i0gIfPygBlq3 Qr8NVHljh7zBzKJsC4LVBwcZ+qsWmJANKtRO4DVNdiDm7iYpsMu2KqlH5q490bR5t wmTVHXt9Hp5bY7gfbA== X-UI-Sender-Class: 724b4f7f-cbec-4199-ad4e-598c01a50d3a Received: from localhost.fritz.box ([82.135.81.9]) by mail.gmx.net (mrgmx005 [212.227.17.190]) with ESMTPSA (Nemesis) id 1Mirna-1syGtP3l80-00jgC4; Wed, 22 Jan 2025 15:41:36 +0100 From: Peter Seiderer To: netdev@vger.kernel.org Cc: linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, "David S . Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Simon Horman , Shuah Khan , Frederic Weisbecker , Artem Chernyshev , Nam Cao , Peter Seiderer Subject: [PATCH net-next v2 7/8] net: pktgen: fix access outside of user given buffer in pktgen_if_write() Date: Wed, 22 Jan 2025 15:41:09 +0100 Message-ID: <20250122144110.619989-8-ps.report@gmx.net> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250122144110.619989-1-ps.report@gmx.net> References: <20250122144110.619989-1-ps.report@gmx.net> Precedence: bulk X-Mailing-List: linux-kselftest@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Provags-ID: V03:K1:me8HBN71d8jSdZY23NV4wmfROuotuHwNloLCxbL1IVfYuOKhOF0 dz4zqAn68qSB+9bEdL46WcUrG7lDC2PGLwpjO5/5cSLTo4vTKw6gfJAFXCtYcD9RsPZcwy8 1Gt3tkPoOhsC1DI1UTaTAjHU6R0JqDnkP4lVrzhqoln7r47CyxFAAYPESoWBGrxbpdFEcpp iDtIQZy66A9j5GUrqhLrg== X-Spam-Flag: NO UI-OutboundReport: notjunk:1;M01:P0:IbPIFGcAjfs=;shPOiddkJm91Zf+Kq1rZGaeM910 fKyKu10sTZ3XXKXeFZ0oiT5/gpwe/QTtIxBlkkIuaYJZlhEkztEvtxmpZ9ee1VY4EzJd1Azyh xbnxGaX66v4pk0YubecoKVhjDllSgKHeu4n/+NDn7mWsjS1ABrlnvsDHJbhN1PfBHubRtgjSa NdFWtZGRLZDYaPKErB/ojnTg7RtJlahIacktoz9sSqMWYS7dslfjbbRoxH2xdRT52vryos1Zl hCYgjQEB9QbpGD27fN90k6W+6QxFSDbSvX/uOyKmGMWJ+b2KbWLMf/oPlCsZpR+/F+FWJVlpw DSc3cS+vGNkGMTA+WK6f82WIdVOk+Q3Gkcdy7+IpPQUKJwBt5rMzWRZVdMk5GyEEYr3mVBiM3 6FaBRKsgaQL2SQV7YQWFNSm7KkwIxAThsDOgj98G5XrM9v0eakFPWw41ocMLIsDG860PLWm0y FydyCBwdV2+pTjMRkpmYmj9SeJd79JqBInuvRHCHZK6xw7c4rK+noqeeCkqqkx4y3bRvXtyCO ujtiZvWnMywPG8qdnxsSIpo83BTISrmH6afZ8Sh3dNAk65QyxbF78aF+Vx02tnIDOnpUxMVwO CMCmv6k3pvcJSjpsRisnoVQRJt2aGSdFwCB0nFLtXPmsB14PxNTvJ1X6pNBToCnvRZ/96FzbC Q7MaLnH/5rS3BmAJ+x9Ef/JBq/YGkWFZ1jtfOSyJKHg1Kh97WM3CDUgC0tYIE2q9RdIdhDVin vblbdAiSaG5sigz/xxjtzawg5HM670WDU8ZNF0dIqZbm4nw+QaHpCdHx/SucMxqhZuwtyq1Sd aCd1kzAsEKD8SoX1hCk8oiGaK4Ig5Vmi1k/ylRA1bpFa3TYvgcWOkq1bVP1JIs9Rh6TBSn7tz TL6s7kls/+0j6EhDr9luAT/ylnjyJXhygNewXDKue7GyeW3vCieaQ242OPC2nC0noPaT/qrWo eyOkz5YsVD/wN66MNrtrCPkGOxx5RiB0Z3Zy8jnqwkrhlv7cyQV/PayXVxaFwvWJTtxLD2+y3 J9Ra7dg1Bl22Otm1sc0RMEv5bsqoYGIwIs41oB3BzmRvHwd3OnXG7tlPOq9pm1vWXEUhRu/v+ nK7B70xpGSVKpXFwRkreR/Bn6BKx9dTWRFw+zm0EUi0UHtlbs+0h2lXrqPm3chqQZMwAityYo y9golyiPMqe/bEVPNZ1jv8UaculGKXkXq5RK0JsKdVivl4JbDzQl1wRZ/yiFqG+g= Honour the user given buffer size for the hex32_arg(), num_arg(), strn_len(), get_imix_entries() and get_labels() calls (otherwise they will access memory outside of the user given buffer). In hex32_arg(), num_arg(), strn_len() error out in case no characters are available (maxlen = 0), in num_arg() additional error out in case no valid character is parsed. In get_labels() additional enable parsing labels up to MAX_IMIX_ENTRIES instead of (MAX_IMIX_ENTRIES - 1). Additional remove some superfluous variable initializing and align some variable declarations to the most common pattern. Signed-off-by: Peter Seiderer --- Changes v1 -> v2: - additional fix get_imix_entries() and get_labels() --- net/core/pktgen.c | 213 ++++++++++++++++++++++++++++++---------------- 1 file changed, 140 insertions(+), 73 deletions(-) diff --git a/net/core/pktgen.c b/net/core/pktgen.c index 9fe2a2db0d34..1fc037641610 100644 --- a/net/core/pktgen.c +++ b/net/core/pktgen.c @@ -750,6 +750,9 @@ static int hex32_arg(const char __user *user_buffer, unsigned long maxlen, int i = 0; *num = 0; + if (!maxlen) + return -EINVAL; + for (; i < maxlen; i++) { int value; char c; @@ -797,6 +800,9 @@ static long num_arg(const char __user *user_buffer, unsigned long maxlen, int i; *num = 0; + if (!maxlen) + return -EINVAL; + for (i = 0; i < maxlen; i++) { char c; if (get_user(c, &user_buffer[i])) @@ -804,6 +810,9 @@ static long num_arg(const char __user *user_buffer, unsigned long maxlen, if ((c >= '0') && (c <= '9')) { *num *= 10; *num += c - '0'; + } else if (i == 0) { + // no valid character parsed, error out + return -EINVAL; } else break; } @@ -814,6 +823,9 @@ static int strn_len(const char __user * user_buffer, unsigned int maxlen) { int i; + if (!maxlen) + return -EINVAL; + for (i = 0; i < maxlen; i++) { char c; if (get_user(c, &user_buffer[i])) @@ -840,11 +852,10 @@ static int strn_len(const char __user * user_buffer, unsigned int maxlen) * "size1,weight_1 size2,weight_2 ... size_n,weight_n" for example. */ static ssize_t get_imix_entries(const char __user *buffer, + unsigned int maxlen, struct pktgen_dev *pkt_dev) { - const int max_digits = 10; - int i = 0; - long len; + int i = 0, max, len; char c; pkt_dev->n_imix_entries = 0; @@ -856,10 +867,13 @@ static ssize_t get_imix_entries(const char __user *buffer, if (pkt_dev->n_imix_entries >= MAX_IMIX_ENTRIES) return -E2BIG; - len = num_arg(&buffer[i], max_digits, &size); + max = min(10, maxlen - i); + len = num_arg(&buffer[i], max, &size); if (len < 0) return len; i += len; + if (i >= maxlen) + return -EINVAL; if (get_user(c, &buffer[i])) return -EFAULT; /* Check for comma between size_i and weight_i */ @@ -870,7 +884,8 @@ static ssize_t get_imix_entries(const char __user *buffer, if (size < 14 + 20 + 8) size = 14 + 20 + 8; - len = num_arg(&buffer[i], max_digits, &weight); + max = min(10, maxlen - i); + len = num_arg(&buffer[i], max, &weight); if (len < 0) return len; if (weight <= 0) @@ -880,39 +895,45 @@ static ssize_t get_imix_entries(const char __user *buffer, pkt_dev->imix_entries[pkt_dev->n_imix_entries].weight = weight; i += len; + pkt_dev->n_imix_entries++; + + if (i >= maxlen) + break; if (get_user(c, &buffer[i])) return -EFAULT; - i++; - pkt_dev->n_imix_entries++; } while (c == ' '); return i; } -static ssize_t get_labels(const char __user *buffer, struct pktgen_dev *pkt_dev) +static ssize_t get_labels(const char __user *buffer, int maxlen, struct pktgen_dev *pkt_dev) { unsigned int n = 0; char c; - ssize_t i = 0; - int len; + int i = 0, max, len; pkt_dev->nr_labels = 0; do { __u32 tmp; - len = hex32_arg(&buffer[i], 8, &tmp); - if (len <= 0) + + if (n >= MAX_MPLS_LABELS) + return -E2BIG; + + max = min(8, maxlen - i); + len = hex32_arg(&buffer[i], max, &tmp); + if (len < 0) return len; pkt_dev->labels[n] = htonl(tmp); if (pkt_dev->labels[n] & MPLS_STACK_BOTTOM) pkt_dev->flags |= F_MPLS_RND; i += len; + n++; + if (i >= maxlen) + break; if (get_user(c, &buffer[i])) return -EFAULT; i++; - n++; - if (n >= MAX_MPLS_LABELS) - return -E2BIG; } while (c == ','); pkt_dev->nr_labels = n; @@ -958,7 +979,6 @@ static ssize_t pktgen_if_write(struct file *file, char name[16], valstr[32]; unsigned long value = 0; char *pg_result = NULL; - int tmp = 0; char buf[128]; pg_result = &(pkt_dev->result[0]); @@ -968,17 +988,16 @@ static ssize_t pktgen_if_write(struct file *file, return -EINVAL; } - max = count; - tmp = count_trail_chars(user_buffer, max); - if (tmp < 0) { + len = count_trail_chars(user_buffer, count); + if (len < 0) { pr_warn("illegal format\n"); - return tmp; + return len; } - i = tmp; + i = len; /* Read variable name */ - - len = strn_len(&user_buffer[i], sizeof(name) - 1); + max = min(sizeof(name) - 1, count - i); + len = strn_len(&user_buffer[i], max); if (len < 0) return len; @@ -1006,7 +1025,8 @@ static ssize_t pktgen_if_write(struct file *file, } if (!strcmp(name, "min_pkt_size")) { - len = num_arg(&user_buffer[i], 10, &value); + max = min(10, count - i); + len = num_arg(&user_buffer[i], max, &value); if (len < 0) return len; @@ -1023,7 +1043,8 @@ static ssize_t pktgen_if_write(struct file *file, } if (!strcmp(name, "max_pkt_size")) { - len = num_arg(&user_buffer[i], 10, &value); + max = min(10, count - i); + len = num_arg(&user_buffer[i], max, &value); if (len < 0) return len; @@ -1042,7 +1063,8 @@ static ssize_t pktgen_if_write(struct file *file, /* Shortcut for min = max */ if (!strcmp(name, "pkt_size")) { - len = num_arg(&user_buffer[i], 10, &value); + max = min(10, count - i); + len = num_arg(&user_buffer[i], max, &value); if (len < 0) return len; @@ -1062,7 +1084,8 @@ static ssize_t pktgen_if_write(struct file *file, if (pkt_dev->clone_skb > 0) return -EINVAL; - len = get_imix_entries(&user_buffer[i], pkt_dev); + max = count - i; + len = get_imix_entries(&user_buffer[i], max, pkt_dev); if (len < 0) return len; @@ -1073,7 +1096,8 @@ static ssize_t pktgen_if_write(struct file *file, } if (!strcmp(name, "debug")) { - len = num_arg(&user_buffer[i], 10, &value); + max = min(10, count - i); + len = num_arg(&user_buffer[i], max, &value); if (len < 0) return len; @@ -1084,7 +1108,8 @@ static ssize_t pktgen_if_write(struct file *file, } if (!strcmp(name, "frags")) { - len = num_arg(&user_buffer[i], 10, &value); + max = min(10, count - i); + len = num_arg(&user_buffer[i], max, &value); if (len < 0) return len; @@ -1094,7 +1119,8 @@ static ssize_t pktgen_if_write(struct file *file, return count; } if (!strcmp(name, "delay")) { - len = num_arg(&user_buffer[i], 10, &value); + max = min(10, count - i); + len = num_arg(&user_buffer[i], max, &value); if (len < 0) return len; @@ -1109,7 +1135,8 @@ static ssize_t pktgen_if_write(struct file *file, return count; } if (!strcmp(name, "rate")) { - len = num_arg(&user_buffer[i], 10, &value); + max = min(10, count - i); + len = num_arg(&user_buffer[i], max, &value); if (len < 0) return len; @@ -1124,7 +1151,8 @@ static ssize_t pktgen_if_write(struct file *file, return count; } if (!strcmp(name, "ratep")) { - len = num_arg(&user_buffer[i], 10, &value); + max = min(10, count - i); + len = num_arg(&user_buffer[i], max, &value); if (len < 0) return len; @@ -1139,7 +1167,8 @@ static ssize_t pktgen_if_write(struct file *file, return count; } if (!strcmp(name, "udp_src_min")) { - len = num_arg(&user_buffer[i], 10, &value); + max = min(10, count - i); + len = num_arg(&user_buffer[i], max, &value); if (len < 0) return len; @@ -1152,7 +1181,8 @@ static ssize_t pktgen_if_write(struct file *file, return count; } if (!strcmp(name, "udp_dst_min")) { - len = num_arg(&user_buffer[i], 10, &value); + max = min(10, count - i); + len = num_arg(&user_buffer[i], max, &value); if (len < 0) return len; @@ -1165,7 +1195,8 @@ static ssize_t pktgen_if_write(struct file *file, return count; } if (!strcmp(name, "udp_src_max")) { - len = num_arg(&user_buffer[i], 10, &value); + max = min(10, count - i); + len = num_arg(&user_buffer[i], max, &value); if (len < 0) return len; @@ -1178,7 +1209,8 @@ static ssize_t pktgen_if_write(struct file *file, return count; } if (!strcmp(name, "udp_dst_max")) { - len = num_arg(&user_buffer[i], 10, &value); + max = min(10, count - i); + len = num_arg(&user_buffer[i], max, &value); if (len < 0) return len; @@ -1191,7 +1223,8 @@ static ssize_t pktgen_if_write(struct file *file, return count; } if (!strcmp(name, "clone_skb")) { - len = num_arg(&user_buffer[i], 10, &value); + max = min(10, count - i); + len = num_arg(&user_buffer[i], max, &value); if (len < 0) return len; /* clone_skb is not supported for netif_receive xmit_mode and @@ -1212,7 +1245,8 @@ static ssize_t pktgen_if_write(struct file *file, return count; } if (!strcmp(name, "count")) { - len = num_arg(&user_buffer[i], 10, &value); + max = min(10, count - i); + len = num_arg(&user_buffer[i], max, &value); if (len < 0) return len; @@ -1223,7 +1257,8 @@ static ssize_t pktgen_if_write(struct file *file, return count; } if (!strcmp(name, "src_mac_count")) { - len = num_arg(&user_buffer[i], 10, &value); + max = min(10, count - i); + len = num_arg(&user_buffer[i], max, &value); if (len < 0) return len; @@ -1237,7 +1272,8 @@ static ssize_t pktgen_if_write(struct file *file, return count; } if (!strcmp(name, "dst_mac_count")) { - len = num_arg(&user_buffer[i], 10, &value); + max = min(10, count - i); + len = num_arg(&user_buffer[i], max, &value); if (len < 0) return len; @@ -1251,7 +1287,8 @@ static ssize_t pktgen_if_write(struct file *file, return count; } if (!strcmp(name, "burst")) { - len = num_arg(&user_buffer[i], 10, &value); + max = min(10, count - i); + len = num_arg(&user_buffer[i], max, &value); if (len < 0) return len; @@ -1270,7 +1307,8 @@ static ssize_t pktgen_if_write(struct file *file, return count; } if (!strcmp(name, "node")) { - len = num_arg(&user_buffer[i], 10, &value); + max = min(10, count - i); + len = num_arg(&user_buffer[i], max, &value); if (len < 0) return len; @@ -1291,11 +1329,12 @@ static ssize_t pktgen_if_write(struct file *file, if (!strcmp(name, "xmit_mode")) { char f[32]; - memset(f, 0, 32); - len = strn_len(&user_buffer[i], sizeof(f) - 1); + max = min(sizeof(f) - 1, count - i); + len = strn_len(&user_buffer[i], max); if (len < 0) return len; + memset(f, 0, sizeof(f)); if (copy_from_user(f, &user_buffer[i], len)) return -EFAULT; i += len; @@ -1331,11 +1370,12 @@ static ssize_t pktgen_if_write(struct file *file, char f[32]; char *end; - memset(f, 0, 32); - len = strn_len(&user_buffer[i], sizeof(f) - 1); + max = min(sizeof(f) - 1, count - i); + len = strn_len(&user_buffer[i], max); if (len < 0) return len; + memset(f, 0, 32); if (copy_from_user(f, &user_buffer[i], len)) return -EFAULT; i += len; @@ -1380,7 +1420,8 @@ static ssize_t pktgen_if_write(struct file *file, return count; } if (!strcmp(name, "dst_min") || !strcmp(name, "dst")) { - len = strn_len(&user_buffer[i], sizeof(pkt_dev->dst_min) - 1); + max = min(sizeof(pkt_dev->dst_min) - 1, count - i); + len = strn_len(&user_buffer[i], max); if (len < 0) return len; @@ -1400,7 +1441,8 @@ static ssize_t pktgen_if_write(struct file *file, return count; } if (!strcmp(name, "dst_max")) { - len = strn_len(&user_buffer[i], sizeof(pkt_dev->dst_max) - 1); + max = min(sizeof(pkt_dev->dst_max) - 1, count - i); + len = strn_len(&user_buffer[i], max); if (len < 0) return len; @@ -1420,7 +1462,8 @@ static ssize_t pktgen_if_write(struct file *file, return count; } if (!strcmp(name, "dst6")) { - len = strn_len(&user_buffer[i], sizeof(buf) - 1); + max = min(sizeof(buf) - 1, count - i); + len = strn_len(&user_buffer[i], max); if (len < 0) return len; @@ -1443,7 +1486,8 @@ static ssize_t pktgen_if_write(struct file *file, return count; } if (!strcmp(name, "dst6_min")) { - len = strn_len(&user_buffer[i], sizeof(buf) - 1); + max = min(sizeof(buf) - 1, count - i); + len = strn_len(&user_buffer[i], max); if (len < 0) return len; @@ -1465,7 +1509,8 @@ static ssize_t pktgen_if_write(struct file *file, return count; } if (!strcmp(name, "dst6_max")) { - len = strn_len(&user_buffer[i], sizeof(buf) - 1); + max = min(sizeof(buf) - 1, count - i); + len = strn_len(&user_buffer[i], max); if (len < 0) return len; @@ -1486,7 +1531,8 @@ static ssize_t pktgen_if_write(struct file *file, return count; } if (!strcmp(name, "src6")) { - len = strn_len(&user_buffer[i], sizeof(buf) - 1); + max = min(sizeof(buf) - 1, count - i); + len = strn_len(&user_buffer[i], max); if (len < 0) return len; @@ -1509,7 +1555,8 @@ static ssize_t pktgen_if_write(struct file *file, return count; } if (!strcmp(name, "src_min")) { - len = strn_len(&user_buffer[i], sizeof(pkt_dev->src_min) - 1); + max = min(sizeof(pkt_dev->src_min) - 1, count - i); + len = strn_len(&user_buffer[i], max); if (len < 0) return len; @@ -1529,7 +1576,8 @@ static ssize_t pktgen_if_write(struct file *file, return count; } if (!strcmp(name, "src_max")) { - len = strn_len(&user_buffer[i], sizeof(pkt_dev->src_max) - 1); + max = min(sizeof(pkt_dev->src_max) - 1, count - i); + len = strn_len(&user_buffer[i], max); if (len < 0) return len; @@ -1549,7 +1597,8 @@ static ssize_t pktgen_if_write(struct file *file, return count; } if (!strcmp(name, "dst_mac")) { - len = strn_len(&user_buffer[i], sizeof(valstr) - 1); + max = min(sizeof(valstr) - 1, count - i); + len = strn_len(&user_buffer[i], max); if (len < 0) return len; @@ -1566,7 +1615,8 @@ static ssize_t pktgen_if_write(struct file *file, return count; } if (!strcmp(name, "src_mac")) { - len = strn_len(&user_buffer[i], sizeof(valstr) - 1); + max = min(sizeof(valstr) - 1, count - i); + len = strn_len(&user_buffer[i], max); if (len < 0) return len; @@ -1590,7 +1640,8 @@ static ssize_t pktgen_if_write(struct file *file, } if (!strcmp(name, "flows")) { - len = num_arg(&user_buffer[i], 10, &value); + max = min(10, count - i); + len = num_arg(&user_buffer[i], max, &value); if (len < 0) return len; @@ -1604,7 +1655,8 @@ static ssize_t pktgen_if_write(struct file *file, } #ifdef CONFIG_XFRM if (!strcmp(name, "spi")) { - len = num_arg(&user_buffer[i], 10, &value); + max = min(10, count - i); + len = num_arg(&user_buffer[i], max, &value); if (len < 0) return len; @@ -1615,7 +1667,8 @@ static ssize_t pktgen_if_write(struct file *file, } #endif if (!strcmp(name, "flowlen")) { - len = num_arg(&user_buffer[i], 10, &value); + max = min(10, count - i); + len = num_arg(&user_buffer[i], max, &value); if (len < 0) return len; @@ -1626,7 +1679,8 @@ static ssize_t pktgen_if_write(struct file *file, } if (!strcmp(name, "queue_map_min")) { - len = num_arg(&user_buffer[i], 5, &value); + max = min(5, count - i); + len = num_arg(&user_buffer[i], max, &value); if (len < 0) return len; @@ -1637,7 +1691,8 @@ static ssize_t pktgen_if_write(struct file *file, } if (!strcmp(name, "queue_map_max")) { - len = num_arg(&user_buffer[i], 5, &value); + max = min(5, count - i); + len = num_arg(&user_buffer[i], max, &value); if (len < 0) return len; @@ -1650,7 +1705,8 @@ static ssize_t pktgen_if_write(struct file *file, if (!strcmp(name, "mpls")) { unsigned int n, cnt; - len = get_labels(&user_buffer[i], pkt_dev); + max = count - i; + len = get_labels(&user_buffer[i], max, pkt_dev); if (len < 0) return len; i += len; @@ -1671,7 +1727,8 @@ static ssize_t pktgen_if_write(struct file *file, } if (!strcmp(name, "vlan_id")) { - len = num_arg(&user_buffer[i], 4, &value); + max = min(4, count - i); + len = num_arg(&user_buffer[i], max, &value); if (len < 0) return len; @@ -1698,7 +1755,8 @@ static ssize_t pktgen_if_write(struct file *file, } if (!strcmp(name, "vlan_p")) { - len = num_arg(&user_buffer[i], 1, &value); + max = min(1, count - i); + len = num_arg(&user_buffer[i], max, &value); if (len < 0) return len; @@ -1713,7 +1771,8 @@ static ssize_t pktgen_if_write(struct file *file, } if (!strcmp(name, "vlan_cfi")) { - len = num_arg(&user_buffer[i], 1, &value); + max = min(1, count - i); + len = num_arg(&user_buffer[i], max, &value); if (len < 0) return len; @@ -1728,7 +1787,8 @@ static ssize_t pktgen_if_write(struct file *file, } if (!strcmp(name, "svlan_id")) { - len = num_arg(&user_buffer[i], 4, &value); + max = min(4, count - i); + len = num_arg(&user_buffer[i], max, &value); if (len < 0) return len; @@ -1755,7 +1815,8 @@ static ssize_t pktgen_if_write(struct file *file, } if (!strcmp(name, "svlan_p")) { - len = num_arg(&user_buffer[i], 1, &value); + max = min(1, count - i); + len = num_arg(&user_buffer[i], max, &value); if (len < 0) return len; @@ -1770,7 +1831,8 @@ static ssize_t pktgen_if_write(struct file *file, } if (!strcmp(name, "svlan_cfi")) { - len = num_arg(&user_buffer[i], 1, &value); + max = min(1, count - i); + len = num_arg(&user_buffer[i], max, &value); if (len < 0) return len; @@ -1785,8 +1847,10 @@ static ssize_t pktgen_if_write(struct file *file, } if (!strcmp(name, "tos")) { - __u32 tmp_value = 0; - len = hex32_arg(&user_buffer[i], 2, &tmp_value); + __u32 tmp_value; + + max = min(2, count - i); + len = hex32_arg(&user_buffer[i], max, &tmp_value); if (len < 0) return len; @@ -1801,8 +1865,10 @@ static ssize_t pktgen_if_write(struct file *file, } if (!strcmp(name, "traffic_class")) { - __u32 tmp_value = 0; - len = hex32_arg(&user_buffer[i], 2, &tmp_value); + __u32 tmp_value; + + max = min(2, count - i); + len = hex32_arg(&user_buffer[i], max, &tmp_value); if (len < 0) return len; @@ -1817,7 +1883,8 @@ static ssize_t pktgen_if_write(struct file *file, } if (!strcmp(name, "skb_priority")) { - len = num_arg(&user_buffer[i], 9, &value); + max = min(9, count - i); + len = num_arg(&user_buffer[i], max, &value); if (len < 0) return len;