From nobody Wed Feb 11 07:50:14 2026 Received: from out-186.mta1.migadu.com (out-186.mta1.migadu.com [95.215.58.186]) (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 C8CD33921C0 for ; Tue, 13 Jan 2026 17:41:01 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=95.215.58.186 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768326063; cv=none; b=Dep3mmJJ4dIUeVMlE/ohGugCvDGwUQVbTawqIGyAxcGaXOHnUTuvvAVrAhQs9GyzsDooMBRhP4loTuyUrdntUMwll/x80G5fc8mI2CbW666xHV8739v6cnk9ptrPFj4QDvex/5EuthivigDBjegSiUNA/JcewQMQb0eMHQjcxag= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768326063; c=relaxed/simple; bh=9r5bUSwFXgwDwXbYoF5UNPZxb7XdgMlrcpWBnWHrgqM=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=hWI6r+mpqxC/Tj0jcGk9hOgIrmRKj6wto3mhlxJN5T+AVt2czNowlMLq3bmYcx0L2Bpsm49MWyawEc9ljC2lUym6KW61wUNfUMmcDNTbzD1YgB9xoEpCVgDMSKlmoatkXQd4cDra/odOEFwviG9ouCeTyWg+6jcB/67DIm23fE4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev; spf=pass smtp.mailfrom=linux.dev; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b=c9hU5k9j; arc=none smtp.client-ip=95.215.58.186 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.dev Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b="c9hU5k9j" X-Report-Abuse: Please report any abuse attempt to abuse@migadu.com and include these headers. DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.dev; s=key1; t=1768326060; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=oe3qKWHteBxzE4yfo0khrmbu7CoLF1rmgSJExh6X4EU=; b=c9hU5k9jFPimzJuXoygWhHgDcrxYxydjhuCTZRVya7n8D1OXoKoz60yInBBBnynzEz6E3u bErK90lUX7VeMvswqFgmbgE5vOw2vztpvgoH+BfIN4CPjTOAH/FGwR/cVrDa5E01zuvjy2 zmDLUFznEiBeV5wVdSOI4fsAgqGG5F8= From: wen.yang@linux.dev To: Joel Granados Cc: linux-kernel@vger.kernel.org, Wen Yang Subject: [RFC PATCH 2/4] sysctl: add helper functions to extract table->extra1/extra2 Date: Wed, 14 Jan 2026 01:40:31 +0800 Message-Id: <9ebbce66874c884f7112476bfd4132510d06854c.1768324215.git.wen.yang@linux.dev> In-Reply-To: References: Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Migadu-Flow: FLOW_OUT Content-Type: text/plain; charset="utf-8" From: Wen Yang Add some sysctl helper functions to avoid direct access to table->extra1/extra2. No functional change intended. Selftest were also made: [14:52:13] =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D sysctl_test (10= subtests) =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D [14:52:13] [PASSED] sysctl_test_api_dointvec_null_tbl_data [14:52:13] [PASSED] sysctl_test_api_dointvec_table_maxlen_unset [14:52:13] [PASSED] sysctl_test_api_dointvec_table_len_is_zero [14:52:13] [PASSED] sysctl_test_api_dointvec_table_read_but_position_set [14:52:13] [PASSED] sysctl_test_dointvec_read_happy_single_positive [14:52:13] [PASSED] sysctl_test_dointvec_read_happy_single_negative [14:52:13] [PASSED] sysctl_test_dointvec_write_happy_single_positive [14:52:13] [PASSED] sysctl_test_dointvec_write_happy_single_negative [14:52:13] [PASSED] sysctl_test_api_dointvec_write_single_less_int_min [14:52:13] [PASSED] sysctl_test_api_dointvec_write_single_greater_int_max [14:52:13] =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D [PASSE= D] sysctl_test =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D [14:52:13] =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D [14:52:13] Testing complete. Ran 10 tests: passed: 10 Suggested-by: Joel Granados Signed-off-by: Wen Yang --- include/linux/sysctl.h | 10 ++++++++++ kernel/sysctl.c | 14 ++++---------- 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/include/linux/sysctl.h b/include/linux/sysctl.h index 683422bc3e7f..9690740885ab 100644 --- a/include/linux/sysctl.h +++ b/include/linux/sysctl.h @@ -164,6 +164,16 @@ static inline void *proc_sys_poll_event(struct ctl_tab= le_poll *poll) #define DEFINE_CTL_TABLE_POLL(name) \ struct ctl_table_poll name =3D __CTL_TABLE_POLL_INITIALIZER(name) =20 +#define SYSCTL_IN_RANGE(tbl, val, type) \ + ((tbl) && \ + (!(tbl)->extra1 || (*(type *)(tbl)->extra1 <=3D (type)(val))) && \ + (!(tbl)->extra2 || (*(type *)(tbl)->extra2 >=3D (type)(val)))) + +#define SYSCTL_IN_RANGE_INT(tbl, val) SYSCTL_IN_RANGE(tbl, val, = int) +#define SYSCTL_IN_RANGE_LONG(tbl, val) SYSCTL_IN_RANGE(tbl, val, = long) +#define SYSCTL_IN_RANGE_UINT(tbl, val) SYSCTL_IN_RANGE(tbl, val, = unsigned int) +#define SYSCTL_IN_RANGE_ULONG(tbl, val) SYSCTL_IN_RANGE(tbl, val, = unsigned long) + /* A sysctl table is an array of struct ctl_table: */ struct ctl_table { const char *procname; /* Text ID for /proc/sys */ diff --git a/kernel/sysctl.c b/kernel/sysctl.c index 2e769550b268..990e692f626b 100644 --- a/kernel/sysctl.c +++ b/kernel/sysctl.c @@ -428,10 +428,7 @@ int proc_uint_conv(ulong *u_ptr, uint *k_ptr, int dir, ret =3D user_to_kern(u_ptr, &tmp_k); if (ret) return ret; - if ((tbl->extra1 && - *(uint *)tbl->extra1 > tmp_k) || - (tbl->extra2 && - *(uint *)tbl->extra2 < tmp_k)) + if (!SYSCTL_IN_RANGE_UINT(tbl, tmp_k)) return -ERANGE; WRITE_ONCE(*k_ptr, tmp_k); } else @@ -531,8 +528,7 @@ int proc_int_conv(bool *negp, ulong *u_ptr, int *k_ptr,= int dir, ret =3D user_to_kern(negp, u_ptr, &tmp_k); if (ret) return ret; - if ((tbl->extra1 && *(int *)tbl->extra1 > tmp_k) || - (tbl->extra2 && *(int *)tbl->extra2 < tmp_k)) + if (!SYSCTL_IN_RANGE_INT(tbl, tmp_k)) return -EINVAL; WRITE_ONCE(*k_ptr, tmp_k); } else @@ -969,7 +965,7 @@ static int do_proc_doulongvec_minmax(const struct ctl_t= able *table, int dir, unsigned long convmul, unsigned long convdiv) { - unsigned long *i, *min, *max; + unsigned long *i ; int vleft, first =3D 1, err =3D 0; size_t left; char *p; @@ -981,8 +977,6 @@ static int do_proc_doulongvec_minmax(const struct ctl_t= able *table, int dir, } =20 i =3D table->data; - min =3D table->extra1; - max =3D table->extra2; vleft =3D table->maxlen / sizeof(unsigned long); left =3D *lenp; =20 @@ -1014,7 +1008,7 @@ static int do_proc_doulongvec_minmax(const struct ctl= _table *table, int dir, } =20 val =3D convmul * val / convdiv; - if ((min && val < *min) || (max && val > *max)) { + if (!SYSCTL_IN_RANGE_ULONG(table, val)) { err =3D -EINVAL; break; } --=20 2.25.1