From patchwork Wed Feb 5 13:11:36 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Peter Seiderer X-Patchwork-Id: 13961016 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 85BD1BA2E; Wed, 5 Feb 2025 13:12:03 +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=1738761125; cv=none; b=k3SyHYC4ILVSWY1//X4IcNPwkISV2AWbiLDxvZTTJOXlnIxhaMEW3QhNl5S6iyBjs6HV0vDlrfavPbQ4/zpWJGMHLqYNix57E5qWoaoGyl1T5+4O85QYcgghg08XvVI82VIKhDOrOrSFUnMpxRZTVTWsutFG/A061aLXgkEHa4U= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1738761125; c=relaxed/simple; bh=WSoxqNtmg8zEwPfTkD4HNUBhxAtqaBV3TiNx1JLfDmU=; h=From:To:Cc:Subject:Date:Message-ID:MIME-Version; b=iqev4khhP/lf36tmF3ZfehMd3ecAltvTSF2aq4rydyt649nG7Fa/6lqnH9UAB6Eb50J1qsYl1Xt953L/5xFwXFAAnqtz1sOTrZs+D8JDMVMcb89nyt4TChE9IKTbVFN7zqX4kO5d9Wx2BjPh4+wEpnbBRF6i2IgyifHQWh/fLjk= 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=XuyKekSV; 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="XuyKekSV" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmx.net; s=s31663417; t=1738761120; x=1739365920; i=ps.report@gmx.net; bh=WSoxqNtmg8zEwPfTkD4HNUBhxAtqaBV3TiNx1JLfDmU=; h=X-UI-Sender-Class:From:To:Cc:Subject:Date:Message-ID: MIME-Version:Content-Transfer-Encoding:cc: content-transfer-encoding:content-type:date:from:message-id: mime-version:reply-to:subject:to; b=XuyKekSVeWLq3LfSV2MG6xqUBgaRJegTnBc32PmW4/R3CfK8VcA5JtT5+2n+y9Sb QeXQbqBAXLVTSUR7rm0Ze39qrbphsIzcUtDcQk60AT3tyFqoH5u3XqRj1VpPsBvSF qaJh1PzlDRr8qTdAyrVjO0omd5gEASbpwGTNAz1As6PloB3uiUZJE1bri81+RauX8 pa57fzX6zpStthC/QhWQwsKereu/qqteje0UdxuNMmhDweGQ4QRvU0N/mDZgCR7Z7 l/g1h4sKR8da1KGITgg5XS+D9G+3n/A0YzaF7C8ozgBYcRixykBAQ+wXgYBWhGmrh bwFNuINP9v9hamdyYw== X-UI-Sender-Class: 724b4f7f-cbec-4199-ad4e-598c01a50d3a Received: from localhost.fritz.box ([82.135.81.162]) by mail.gmx.net (mrgmx004 [212.227.17.190]) with ESMTPSA (Nemesis) id 1MzhnH-1tSH33387N-00rtkB; Wed, 05 Feb 2025 14:12:00 +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 , Peter Seiderer Subject: [PATCH net-next v4 00/17] Some pktgen fixes/improvments Date: Wed, 5 Feb 2025 14:11:36 +0100 Message-ID: <20250205131153.476278-1-ps.report@gmx.net> X-Mailer: git-send-email 2.48.1 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:MrPfFZiHCwTgTTdCV9OOAISmW2MJqI2TN5aynDzVFsLBHkYuahs 4w+8hQ19kng2dMSH0R3u61pK1xaGKuN/diGOwbE6Mxtiy4uiIS/sgkyhsRLxNgeI9WFn9UA l0jeiHtToZuxOlEb1SLUq15Rp9xdwyEGn49ClbApGRa+GZeq9rcnI50+Trls442pUCMJ8Eq tJvBhs5tTw3ODHlOgdfVg== X-Spam-Flag: NO UI-OutboundReport: notjunk:1;M01:P0:nsAyaTolS5M=;hsFyKe1nmXByPzoBMEcN94P8ree d0WVUi9zdNfsKFLHu/LafpIy4yBHFsm6hprT8NYANxQcTfKEnehMG8IoqXuvuduXcgdMRHlDr iJUe1Xj2CJVAypQg0Tiivy6EQmS/YtalgnuNgl/lQr1otwKhuG4E+S3f8/BG0fBdiapJ8fAQ4 Gu6HDXYXE8++8pXPSGgSkgk7y8BTw5h1R/3uoHAAX66CVSr8qoq7fmERWu+/Z9mEbOfc0x9z9 wJQjV7htkHQgx4U1mJyWFjmCDzOYw4Peb5IEVIA4AnT8gWGyBoj0PDuAl/ZA99UusA63rIEmW l2J0RX2+fpjveptDjIzr6rhIJMbuYh/7tFImXtx+l2cHrLrCvxQc/QyCI+Utvpwms4GDE8lsz hub3Lcsbek4XI+wgDlfnHmKmcago+xhyWyUTrHWdtp39zmqDqxeWaYJKrJ2+IEWHzTUwufai+ OzxKhWPZfnosiE33sdR231j6bDpYmjaADhkRt4w1Y1roNyKV3R86pV9Qj8uNB6OYzVwbhpfdK wM4xZksCygrzo9PnReHUxdCNyXF3EKF2tVQRjsWfkSy8ywhTgUX9slXY2Sw336aT/202lD7O+ GVswLLErPDjRIQUo+9t2nXPd5jSbca25YrFoT4kFWQFK900iTX/7feFQp25l7qiE3HfOVRdUi CMJJFlfH8qZQ//QgY/8tFuK9nhQUlUp5BI6ZxrQwg+LQyYJwFonP9i5Xo/bmMopbF/+RZAJa3 ubuzrbtOKps2wTR0geIhiiqMPYjc9wtXMGlvGu2IGcW9YFwwMczYAJcMN3KZ3dy8i/PBaIvjC hexvc7nUzNsfTWNuaLXE82UOb/G12H7ICiRSpPg+Rk8582JNJHtdvVeg/WK9ayvKp+A36rVA4 8neRVUDRYE8FOoJYwAmSNGmUYujIFUTZREowEecODLFMYEUvzYmRvfWVcRziXwyvlF4ZrHoAf xMzdY+CXi51fTQt3Rd1tirTNbaZGCtFzVIb+106uZEp6Ry1RHNVNfXf0REJ8/b8YrbI2+VBQD OwatBmBGz9m+MsBeV+gwQzy2e1KYYYQSMIBB+47yjL9GLPdH342aD1BLj4NxK+BQKf3KFvHq4 gZULkE81/RchbcA2i0PDqJ5VsO8P6FSHGxIwJh2vjdroQUPSumH9V0NeQgtQ7AjX+bpLbSORK 2vEQlx4J2pTWFjkNQv9UPOmI1YQrr17+NZSyDsWXnmjuoyvKv58sKwBLrS0a3he58XuTBqH6E Crdb3lgdnd4HHIwIx/FVjJqGLHd3yyNIKmvQmtQ7VA0qwr+3EC34EMUmPjhPKQ2mv5/fHozZ0 MQVHy+vn0odxJOVrJdlcn2pXpPlZCl9DpZyqmJKjrvRcDM= hile taking a look at '[PATCH net] pktgen: Avoid out-of-range in get_imix_entries' ([1]) and '[PATCH net v2] pktgen: Avoid out-of-bounds access in get_imix_entries' ([2], [3]) and doing some tests and code review I detected that the /proc/net/pktgen/... parsing logic does not honour the user given buffer bounds (resulting in out-of-bounds access). This can be observed e.g. by the following simple test (sometimes the old/'longer' previous value is re-read from the buffer): $ echo add_device lo@0 > /proc/net/pktgen/kpktgend_0 $ echo "min_pkt_size 12345" > /proc/net/pktgen/lo\@0 && grep min_pkt_size /proc/net/pktgen/lo\@0 Params: count 1000 min_pkt_size: 12345 max_pkt_size: 0 Result: OK: min_pkt_size=12345 $ echo -n "min_pkt_size 123" > /proc/net/pktgen/lo\@0 && grep min_pkt_size /proc/net/pktgen/lo\@0 Params: count 1000 min_pkt_size: 12345 max_pkt_size: 0 Result: OK: min_pkt_size=12345 $ echo "min_pkt_size 123" > /proc/net/pktgen/lo\@0 && grep min_pkt_size /proc/net/pktgen/lo\@0 Params: count 1000 min_pkt_size: 123 max_pkt_size: 0 Result: OK: min_pkt_size=123 So fix the out-of-bounds access (and some minor findings) and add a simple proc_net_pktgen selftest... Regards, Peter Changes v3 -> v4: - add rev-by Simon Horman - new patch 'net: pktgen: use defines for the various dec/hex number parsing digits lengths' (suggested by Simon Horman) - replace C99 comment (suggested by Paolo Abeni) - drop available characters check in strn_len() (suggested by Paolo Abeni) - factored out patch 'net: pktgen: align some variable declarations to the most common pattern' (suggested by Paolo Abeni) - factored out patch 'net: pktgen: remove extra tmp variable (re-use len instead)' (suggested by Paolo Abeni) - factored out patch 'net: pktgen: remove some superfluous variable initializing' (suggested by Paolo Abeni) - factored out patch 'net: pktgen: fix mpls maximum labels list parsing' (suggested by Paolo Abeni) - factored out 'net: pktgen: hex32_arg/num_arg error out in case no characters are available' (suggested by Paolo Abeni) - factored out 'net: pktgen: num_arg error out in case no valid character is parsed' (suggested by Paolo Abeni) Changes v2 -> v3: - new patch: 'net: pktgen: fix ctrl interface command parsing' - new patch: 'net: pktgen: fix mpls reset parsing' - tools/testing/selftests/net/proc_net_pktgen.c: - fix typo in change description ('v1 -> v1' and tyop) - rename some vars to better match usage add_loopback_0 -> thr_cmd_add_loopback_0 rm_loopback_0 -> thr_cmd_rm_loopback_0 wrong_ctrl_cmd -> wrong_thr_cmd legacy_ctrl_cmd -> legacy_thr_cmd ctrl_fd -> thr_fd - add ctrl interface tests Changes v1 -> v2: - new patch: 'net: pktgen: fix hex32_arg parsing for short reads' - new patch: 'net: pktgen: fix 'rate 0' error handling (return -EINVAL)' - new patch: 'net: pktgen: fix 'ratep 0' error handling (return -EINVAL)' - net/core/pktgen.c: additional fix get_imix_entries() and get_labels() - tools/testing/selftests/net/proc_net_pktgen.c: - fix tyop not vs. nod (suggested by Jakub Kicinski) - fix misaligned line (suggested by Jakub Kicinski) - enable fomerly commented out CONFIG_XFRM dependent test (command spi), as CONFIG_XFRM is enabled via tools/testing/selftests/net/config CONFIG_XFRM_INTERFACE/CONFIG_XFRM_USER (suggestex by Jakub Kicinski) - add CONFIG_NET_PKTGEN=m to tools/testing/selftests/net/config (suggested by Jakub Kicinski) - add modprobe pktgen to FIXTURE_SETUP() (suggested by Jakub Kicinski) - fix some checkpatch warnings (Missing a blank line after declarations) - shrink line length by re-naming some variables (command -> cmd, device -> dev) - add 'rate 0' testcase - add 'ratep 0' testcase [1] https://lore.kernel.org/netdev/20241006221221.3744995-1-artem.chernyshev@red-soft.ru/ [2] https://lore.kernel.org/netdev/20250109083039.14004-1-pchelkin@ispras.ru/ [3] https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=76201b5979768500bca362871db66d77cb4c225e Peter Seiderer (17): net: pktgen: replace ENOTSUPP with EOPNOTSUPP net: pktgen: enable 'param=value' parsing net: pktgen: fix hex32_arg parsing for short reads net: pktgen: fix 'rate 0' error handling (return -EINVAL) net: pktgen: fix 'ratep 0' error handling (return -EINVAL) net: pktgen: fix ctrl interface command parsing net: pktgen: fix access outside of user given buffer in pktgen_thread_write() net: pktgen: use defines for the various dec/hex number parsing digits lengths net: pktgen: align some variable declarations to the most common pattern net: pktgen: remove extra tmp variable (re-use len instead) net: pktgen: remove some superfluous variable initializing net: pktgen: fix mpls maximum labels list parsing net: pktgen: fix access outside of user given buffer in pktgen_if_write() net: pktgen: hex32_arg/num_arg error out in case no characters are available net: pktgen: num_arg error out in case no valid character is parsed net: pktgen: fix mpls reset parsing selftest: net: add proc_net_pktgen net/core/pktgen.c | 268 +++++--- tools/testing/selftests/net/Makefile | 1 + tools/testing/selftests/net/config | 1 + tools/testing/selftests/net/proc_net_pktgen.c | 650 ++++++++++++++++++ 4 files changed, 828 insertions(+), 92 deletions(-) create mode 100644 tools/testing/selftests/net/proc_net_pktgen.c