From nobody Tue Feb 10 01:15:00 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 7269A21D596; Thu, 1 Jan 2026 12:57:22 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767272242; cv=none; b=a6/ftBnLuZQqBSVFC8e70/zioTxMk9q6S3QiFst0zfBh4/z1GYSP+W3jiEIB/pRTLYLPfX3JMTF14+zlg0Q6UV+H33O5o1qudgUT3TvkQORGvXRShxBTpvD0mvvaN03IuqB+F/KooYemQZ8XkERdpJvVLlXkW49wUqON6UvHt3g= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767272242; c=relaxed/simple; bh=MfwFhvcQgwESGWC+Nu+uixcRT1E0Tgwr+3WslGED45k=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=q0piL8nG47f9wgnMsL40uWIro+MTQdRggxAzi2sn5/MMbSKLkzV27PrZ3WsWJHt226AyhiSdpuR8Gyb48lu3ewa4YhTTaeLuefuPvVUfahwmHPht1Y/WwlPLBqJX/sYfK0UIL1g5FKfuXihvoA51jsy3bGeYEEXCvd5wvlCAXoo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=TB2mBn6v; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="TB2mBn6v" Received: by smtp.kernel.org (Postfix) with ESMTPS id 1B2E4C19422; Thu, 1 Jan 2026 12:57:22 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1767272242; bh=MfwFhvcQgwESGWC+Nu+uixcRT1E0Tgwr+3WslGED45k=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=TB2mBn6vdnOVbdLwA0UFzaSNygOoME6uDZ/3D7d2k8ZEHIduHgi923pKuYFclKc9v dbun6LMAJ/V9tvdi2Uz3LovlnGScVIMhwVMBM16NlUdMTHoFxtsIAx59ruunb0HeN6 5hjy8PLuvIROZRBxInluivA8mUIK3ALGbi3UYPWw2pebCxQC0aIS3hWKScd0GUXQcH E/MQyuZcCh/y11HGRM9PqgwR7SIIwmunGU7wUwqQwOiZQ+8txJhlXRckdtwswc9lN9 I/uO61dtrWzmd7C3PQKCdUx7xzgSyYvZnHF1rxmuOyUW9S44Wka+uqZGIAfHDGKnaz ZugUVNF4zIShQ== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 094CDEED600; Thu, 1 Jan 2026 12:57:22 +0000 (UTC) From: Joel Granados Date: Thu, 01 Jan 2026 13:57:06 +0100 Subject: [PATCH v2 2/9] sysctl: Replace do_proc_dointvec with a type-generic macro Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260101-jag-dovec_consolidate-v2-2-ff918f753ba9@kernel.org> References: <20260101-jag-dovec_consolidate-v2-0-ff918f753ba9@kernel.org> In-Reply-To: <20260101-jag-dovec_consolidate-v2-0-ff918f753ba9@kernel.org> To: Kees Cook , Alexander Viro , Christian Brauner , Jan Kara Cc: linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, Joel Granados X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=5259; i=joel.granados@kernel.org; h=from:subject:message-id; bh=MfwFhvcQgwESGWC+Nu+uixcRT1E0Tgwr+3WslGED45k=; b=owJ4nAHtARL+kA0DAAoBupfNUreWQU8ByyZiAGlWbyrp75EOe+2gLc2hPbD6r35ilHbCeY305 7A3vWgCgWfm+IkBswQAAQoAHRYhBK5HCVcl5jElzssnkLqXzVK3lkFPBQJpVm8qAAoJELqXzVK3 lkFPV7ML+wUy9hbbmovESRDRANlhSfcLGSUSbrrClGNULVc88aA8ObOYM25i1dTkZlEFp+1pbJ2 nXOOx9rTpzKXQy0X+hRuWUW1i60n8pnfnkdV5NmfZwpCO0N7Hf9XvNig5JwdIRa7SORyYidvZvB kNtlLZvvHx2B+37pkFdB1whl20f7mAX3uNkKNidxZjTEKgW4GwO1BfCbCHdW6TrxX2LkXL/FcX/ DebV5BtE76uhgaggC4rKNdl5pVCIDHKE5sGtIvFWo0+Q2jEW2FtB8cRuTVfiRzBTM0HLOw83cL+ mfPci+ln3YvAOslGAOmVNebFq5bm2WgGx57cfub7yai/Z6RtRZh6qVa0Dg2v8v/Mv17PZdwjdHN Gtoan23y6s9N/5OWj9L/FELaVj8pe/Mizdf6d7q2sk2EIf0PnqgGbb7pdVoAB1mVbShTfigSZ7P o3AN4vuuU5RtZERn8Q7hA6/2QpycVZyouwxbrWoA/xwkgNtv1SF3Tfi01RBRPm5SVcDeUl/Iua9 nw= X-Developer-Key: i=joel.granados@kernel.org; a=openpgp; fpr=F1F8E46D30F0F6C4A45FF4465895FAAC338C6E77 X-Endpoint-Received: by B4 Relay for joel.granados@kernel.org/default with auth_id=239 Replaces do_proc_dointvec with do_proc_dotypevec macro. For now, it only generates the integer function, but it will bring together the logic for int, uint and ulong proc vector functions. It is parametrized on the kernel pointer type being processed and generates a "do_proc_do##T##vec" (where T is the type) function. The parametrization is needed for advancing the for loop with "++" and affects the type of the k_ptr argument in the converter call back function. Initialize the neg variable to false to ensure that unsigned types do not inadvertently assign negative values to user space. Return an -EINVAL when user space tries to assign a negative value to an unsigned variable. Add a comment to clarify that the macro is **not** designed to be exported outside of sysctl.c. Signed-off-by: Joel Granados --- kernel/sysctl.c | 144 ++++++++++++++++++++++++++++++----------------------= ---- 1 file changed, 77 insertions(+), 67 deletions(-) diff --git a/kernel/sysctl.c b/kernel/sysctl.c index 284ad6c277e8b52177cca3153acf02ff39de17f0..64f88c0338987ac9568713dd15d= b99f14553e82b 100644 --- a/kernel/sysctl.c +++ b/kernel/sysctl.c @@ -572,75 +572,85 @@ static int do_proc_int_conv_minmax(bool *negp, unsign= ed long *u_ptr, int *k_ptr, =20 static const char proc_wspace_sep[] =3D { ' ', '\t', '\n' }; =20 -static int do_proc_dointvec(const struct ctl_table *table, int dir, - void *buffer, size_t *lenp, loff_t *ppos, - int (*conv)(bool *negp, unsigned long *u_ptr, int *k_ptr, - int dir, const struct ctl_table *table)) -{ - int *i, vleft, first =3D 1, err =3D 0; - size_t left; - char *p; - - if (!table->data || !table->maxlen || !*lenp || - (*ppos && SYSCTL_KERN_TO_USER(dir))) { - *lenp =3D 0; - return 0; - } - - i =3D (int *) table->data; - vleft =3D table->maxlen / sizeof(*i); - left =3D *lenp; - - if (SYSCTL_USER_TO_KERN(dir)) { - if (proc_first_pos_non_zero_ignore(ppos, table)) - goto out; - - if (left > PAGE_SIZE - 1) - left =3D PAGE_SIZE - 1; - p =3D buffer; - } - - for (; left && vleft--; i++, first=3D0) { - unsigned long lval; - bool neg; - - if (SYSCTL_USER_TO_KERN(dir)) { - proc_skip_spaces(&p, &left); - - if (!left) - break; - err =3D proc_get_long(&p, &left, &lval, &neg, - proc_wspace_sep, - sizeof(proc_wspace_sep), NULL); - if (err) - break; - if (conv(&neg, &lval, i, 1, table)) { - err =3D -EINVAL; - break; - } - } else { - if (conv(&neg, &lval, i, 0, table)) { - err =3D -EINVAL; - break; - } - if (!first) - proc_put_char(&buffer, &left, '\t'); - proc_put_long(&buffer, &left, lval, neg); - } - } - - if (SYSCTL_KERN_TO_USER(dir) && !first && left && !err) - proc_put_char(&buffer, &left, '\n'); - if (SYSCTL_USER_TO_KERN(dir) && !err && left) - proc_skip_spaces(&p, &left); - if (SYSCTL_USER_TO_KERN(dir) && first) - return err ? : -EINVAL; - *lenp -=3D left; -out: - *ppos +=3D *lenp; - return err; +/* + * Do not export this macro outside the sysctl subsys. + * It is meant to generate static functions only + */ +#define do_proc_dotypevec(T) \ +static int do_proc_do##T##vec(const struct ctl_table *table, int dir, \ + void *buffer, size_t *lenp, loff_t *ppos, \ + int (*conv)(bool *negp, ulong *u_ptr, T *k_ptr, \ + int dir, const struct ctl_table *table)) \ +{ \ + T *i; \ + int vleft, first =3D 1, err =3D 0; \ + size_t left; \ + char *p; \ +\ + if (!table->data || !table->maxlen || !*lenp || \ + (*ppos && SYSCTL_KERN_TO_USER(dir))) { \ + *lenp =3D 0; \ + return 0; \ + } \ +\ + i =3D (typeof(i)) table->data; \ + vleft =3D table->maxlen / sizeof(*i); \ + left =3D *lenp; \ +\ + if (SYSCTL_USER_TO_KERN(dir)) { \ + if (proc_first_pos_non_zero_ignore(ppos, table)) \ + goto out; \ +\ + if (left > PAGE_SIZE - 1) \ + left =3D PAGE_SIZE - 1; \ + p =3D buffer; \ + } \ +\ + for (; left && vleft--; i++, first =3D 0) { \ + unsigned long lval; \ + bool neg =3D false; \ +\ + if (SYSCTL_USER_TO_KERN(dir)) { \ + proc_skip_spaces(&p, &left); \ +\ + if (!left) \ + break; \ + err =3D proc_get_long(&p, &left, &lval, &neg, \ + proc_wspace_sep, \ + sizeof(proc_wspace_sep), NULL); \ + if (!err && neg && is_unsigned_type(T)) \ + err =3D -EINVAL; \ + if (err) \ + break; \ + if (conv(&neg, &lval, i, dir, table)) { \ + err =3D -EINVAL; \ + break; \ + } \ + } else { \ + if (conv(&neg, &lval, i, dir, table)) { \ + err =3D -EINVAL; \ + break; \ + } \ + if (!first) \ + proc_put_char(&buffer, &left, '\t'); \ + proc_put_long(&buffer, &left, lval, neg); \ + } \ + } \ +\ + if (SYSCTL_KERN_TO_USER(dir) && !first && left && !err) \ + proc_put_char(&buffer, &left, '\n'); \ + if (SYSCTL_USER_TO_KERN(dir) && !err && left) \ + proc_skip_spaces(&p, &left); \ + if (SYSCTL_USER_TO_KERN(dir) && first) \ + return err ? : -EINVAL; \ + *lenp -=3D left; \ +out: \ + *ppos +=3D *lenp; \ + return err; \ } =20 +do_proc_dotypevec(int) + static int do_proc_douintvec_w(const struct ctl_table *table, void *buffer, size_t *lenp, loff_t *ppos, int (*conv)(unsigned long *u_ptr, --=20 2.50.1