From patchwork Thu Feb 13 11:00:17 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Peter Seiderer X-Patchwork-Id: 864976 Received: from mout.gmx.net (mout.gmx.net [212.227.17.20]) (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 91DD6213E8C; Thu, 13 Feb 2025 11:00:52 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=212.227.17.20 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1739444454; cv=none; b=CYS44XqE8HjeFfprbA1bm/nswxiG+Au1Yl+jG4oXV93T94pcz2AGZkrTDWVaZdBayKxAsOpdXFZ9E9K2HvLjeZQC7k72tfDgp4CBRr9L7Btm8zupQPvfh9p/A4y8rV3T02DWbsNUJ+5/P0dpfvh84VZ+vSHaSCPGiAuv9pU0naI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1739444454; c=relaxed/simple; bh=DK01VuL3SNHgRUaaTedq64fnA5VlDYZ276JiVZFXL/s=; h=From:To:Cc:Subject:Date:Message-ID:MIME-Version; b=payAXm2C7jpNRizndFfxBaHR5fVl/lDBs7YunEwzxtAb19YJdRZvZMmL0Ies97C53vfQ0spi+yCw3wrK7BPF4AVesldDUOI3JLXsNfSQywcs/R+90rYmVMlSpoVz1XOa309KvbvKsTae3SjU9wWcDA2aRa/LEaShz1Sqb0EVWt4= 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=kZjpH33e; arc=none smtp.client-ip=212.227.17.20 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="kZjpH33e" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmx.net; s=s31663417; t=1739444429; x=1740049229; i=ps.report@gmx.net; bh=DK01VuL3SNHgRUaaTedq64fnA5VlDYZ276JiVZFXL/s=; 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=kZjpH33eyQM0GOWJuxplSGFWWSAE0erjKXxNDqRh1P+CZVMF4BUSCFlnoVoK6bvh C/45cqaNPKWn4F0IfMTUa7GYx481ESaUZR6hFs+puwRUXHNf51t6vHgUsUw6UCWla LhUgxm17uCM6eG979CyINFjRihYMFqt/Bx2t9PjcPPBBWH6+88hrFX5ykvsQ4qoLy nkH/b17XHwm2sxNzSgz+3WIlU9PuTxlK1bvP1vYUprL8X2uMc+g/1E0teONWL/UpM HCNlACXXFq/iNMv4bXsjXrpbD2PCMI/EYYzSxlzS1JGthRDhT5c48i53jLzGFw33v eo7BsU81vP1KVSs9kg== X-UI-Sender-Class: 724b4f7f-cbec-4199-ad4e-598c01a50d3a Received: from localhost.fritz.box ([82.135.81.197]) by mail.gmx.net (mrgmx105 [212.227.17.168]) with ESMTPSA (Nemesis) id 1MWzfl-1ttDG82S0P-00KHjn; Thu, 13 Feb 2025 12:00:29 +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 , Artem Chernyshev , Nam Cao , Frederic Weisbecker Subject: [PATCH net-next v5 0/8] Some pktgen fixes/improvments (part I) Date: Thu, 13 Feb 2025 12:00:17 +0100 Message-ID: <20250213110025.1436160-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:0RKKkaFCYHcOsYPx3wRmKPuiqcqLXH9VUhVYvVGT+mHo5Xi4Ts0 /hBE3TqPKsvD3ikc9np4lSCHF3CKMrXGOrchjdm7BIH6xPIc6mWB3CkYEwStlYZL9lgIht7 L9Xmno61t+A4aYPcTxsaTVBrrwMo8HHWG9iW5j6clj5x0ZtxSGk5f4X835pWIcE81cni/gr pc4SxgDRdGUL66Baey5fA== X-Spam-Flag: NO UI-OutboundReport: notjunk:1;M01:P0:N0cC7s0P9H4=;Zx6okiOEtIpBvU9itWFSOUMW5yT W8ZnztnQ2QxorqSBZFS553iqvSpltA05Cixs5sYm2rLwkUJvVy+69EF+WoY7xrdIok8iG1RbQ ATFQCZQy9hwZnrY2avr1OdpFGzUTEyhuvWXhQ41TvmSYtm8hzD9qRNi/BlhQr1aOlzJE6DUnf QF4/Lcg5NJ1vne3gkZzdDlI5BXMksMFh/oSP9p887sFuJopRpLgWg5//Sk9O832CCQiPCQF71 Vr2fHTS3LHC+yokjLEersAh1DzWxWGkf6NR202uRvJH8pYbNbGasL2c6i1qxf6qtjBWL3SQTL LLxZKN8FErZA3SrPf/J6oK//pSSLzgNn9ijD2bLzmOP7qATfjWCMDuDB4k05LhGbjC9h1pseG XuFlUvwgPDCb3ihdijI2dVOMGt337HqKbzVXxIj4J+m/MuwyngQhWKfdRdfiZitopdtEoOgX2 6HNiJNJM7Y8IW/6kJlKerVPJLiaznODOj5P85sV0580C/79kimhqXIVNMWj3z9Ih1Y2nvqymQ L0fpJBfNR+svXwExiTRxSBvHK9T+y+w39fc+Z9H39Zaq9RO861+SbOdtbKfyyrBwMgTtP7Bwm fap05rZK1BZXa2FFmSeIUl1qNE9CM+AF5i9gjMq1XKTqjKYKV8slTIC9f+r93d2oQ4EzMnsqq spkLfdHRqZQsggWblNwT3M9VaPseHAEi/CLAsTUVZd5dbOHozrNF6r2EW1MXVnoRZE17C+MdB Z+dyc1mrtNib1THwOxNVchhwF/coUi3o/XLqTKZE7i6JLVjWRwbn1VxBvirRFVIy2qOuwBaZO ThtzTMUmoLRyd+5sxfLn+JerG1pepeVc6Esemwf4mzUqodvicgS1vkGy5cDFicCbV5BaE9Kt/ 6P2vY88EL7S8kVkeNMhRYAHWDEi9EzKWByBZ1gXbD9oQqgpA3zsCrR3yKZqNuApoVkjHg11NY JDLlWt9yL+TWP6I8l8s1om+Al2cM+1grh61pOM3Lsvo3lsAvSO0qkOB0AdxPIdPiExMrOch+A 8ler6BiDSGU5HkAn1pdShhd8+D2WC0BDsSf+1TjJ2z7jQDQGQQsZ2SXgFdEs61qOaQMLAmgE4 98y+t8dMcewobhVlz+67j3DcsWn5uwlR7csgPhkq63cnyCu5JjBOmNOVdGuJcPQN591xZ+Wr8 ACRt5i9UTyyExUqVJKD8vqbK08zs6EDeNLOfXcXL22T3Kq8XiKlDubWCwxjCQGCR6PUONw6JJ tnY8EgftXFly83lJW/8kUzMsgadExCv22/TPuYEpV51QbLCzI/rh8JTt4st2TN5GiN2Qpyg0B Adu/GgOkUQwReeUfyD1r/KM9dUhWgMiDQvl5y2SbiRihnoYgcgg6Fnq61ZmHbXabgt0f29Eit EiTV+OSbSwplXWNsrU62sF98YuXmZtPHQcTE1X4FRsY6PxeACEF5NT2C+tThhN94/dbHNErgZ vm0eS/A== While 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... Patch set splited into part I (this one) - 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() And part II (will follow): - net: pktgen: use defines for the various dec/hex number parsing digits lengths - net: pktgen: fix mix of int/long - 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: fix mpls reset parsing - net: pktgen: remove all superfluous index assignements - selftest: net: add proc_net_pktgen Regards, Peter Changes v4 -> v5: - split up patchset into part i/ii (suggested by Simon Horman) 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 (8): 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/core/pktgen.c | 119 +++++++++++++++++++++++++--------------------- 1 file changed, 66 insertions(+), 53 deletions(-)