* [linux-next:master 3459/9043] kernel/sysctl-test.c:46:9: sparse: sparse: incorrect type in argument 3 (different address spaces)
@ 2026-07-26 4:09 kernel test robot
0 siblings, 0 replies; only message in thread
From: kernel test robot @ 2026-07-26 4:09 UTC (permalink / raw)
To: Joel Granados; +Cc: oe-kbuild-all
tree: https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git master
head: 9eebf259d5352b87080d67758f483583d9e763d7
commit: e433c7d7fca0b2c9787648e8f0bd658578c375b4 [3459/9043] sysctl: Group proc_handler declarations and document
config: alpha-randconfig-r132-20260725 (https://download.01.org/0day-ci/archive/20260726/202607261257.2AECxOah-lkp@intel.com/config)
compiler: alpha-linux-gcc (GCC) 15.2.0
sparse: v0.6.5-rc1
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20260726/202607261257.2AECxOah-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202607261257.2AECxOah-lkp@intel.com/
sparse warnings: (new ones prefixed by >>)
>> kernel/sysctl-test.c:46:9: sparse: sparse: incorrect type in argument 3 (different address spaces) @@ expected void *buf @@ got void [noderef] __user *buffer @@
kernel/sysctl-test.c:46:9: sparse: expected void *buf
kernel/sysctl-test.c:46:9: sparse: got void [noderef] __user *buffer
>> kernel/sysctl-test.c:46:9: sparse: sparse: incorrect type in argument 3 (different address spaces) @@ expected void *buf @@ got void [noderef] __user *buffer @@
kernel/sysctl-test.c:46:9: sparse: expected void *buf
kernel/sysctl-test.c:46:9: sparse: got void [noderef] __user *buffer
kernel/sysctl-test.c:55:9: sparse: sparse: incorrect type in argument 3 (different address spaces) @@ expected void *buf @@ got void [noderef] __user *buffer @@
kernel/sysctl-test.c:55:9: sparse: expected void *buf
kernel/sysctl-test.c:55:9: sparse: got void [noderef] __user *buffer
kernel/sysctl-test.c:55:9: sparse: sparse: incorrect type in argument 3 (different address spaces) @@ expected void *buf @@ got void [noderef] __user *buffer @@
kernel/sysctl-test.c:55:9: sparse: expected void *buf
kernel/sysctl-test.c:55:9: sparse: got void [noderef] __user *buffer
kernel/sysctl-test.c:92:9: sparse: sparse: incorrect type in argument 3 (different address spaces) @@ expected void *buf @@ got void [noderef] __user *buffer @@
kernel/sysctl-test.c:92:9: sparse: expected void *buf
kernel/sysctl-test.c:92:9: sparse: got void [noderef] __user *buffer
kernel/sysctl-test.c:92:9: sparse: sparse: incorrect type in argument 3 (different address spaces) @@ expected void *buf @@ got void [noderef] __user *buffer @@
kernel/sysctl-test.c:92:9: sparse: expected void *buf
kernel/sysctl-test.c:92:9: sparse: got void [noderef] __user *buffer
kernel/sysctl-test.c:101:9: sparse: sparse: incorrect type in argument 3 (different address spaces) @@ expected void *buf @@ got void [noderef] __user *buffer @@
kernel/sysctl-test.c:101:9: sparse: expected void *buf
kernel/sysctl-test.c:101:9: sparse: got void [noderef] __user *buffer
kernel/sysctl-test.c:101:9: sparse: sparse: incorrect type in argument 3 (different address spaces) @@ expected void *buf @@ got void [noderef] __user *buffer @@
kernel/sysctl-test.c:101:9: sparse: expected void *buf
kernel/sysctl-test.c:101:9: sparse: got void [noderef] __user *buffer
kernel/sysctl-test.c:133:9: sparse: sparse: incorrect type in argument 3 (different address spaces) @@ expected void *buf @@ got void [noderef] __user *buffer @@
kernel/sysctl-test.c:133:9: sparse: expected void *buf
kernel/sysctl-test.c:133:9: sparse: got void [noderef] __user *buffer
kernel/sysctl-test.c:133:9: sparse: sparse: incorrect type in argument 3 (different address spaces) @@ expected void *buf @@ got void [noderef] __user *buffer @@
kernel/sysctl-test.c:133:9: sparse: expected void *buf
kernel/sysctl-test.c:133:9: sparse: got void [noderef] __user *buffer
kernel/sysctl-test.c:137:9: sparse: sparse: incorrect type in argument 3 (different address spaces) @@ expected void *buf @@ got void [noderef] __user *buffer @@
kernel/sysctl-test.c:137:9: sparse: expected void *buf
kernel/sysctl-test.c:137:9: sparse: got void [noderef] __user *buffer
kernel/sysctl-test.c:137:9: sparse: sparse: incorrect type in argument 3 (different address spaces) @@ expected void *buf @@ got void [noderef] __user *buffer @@
kernel/sysctl-test.c:137:9: sparse: expected void *buf
kernel/sysctl-test.c:137:9: sparse: got void [noderef] __user *buffer
kernel/sysctl-test.c:172:9: sparse: sparse: incorrect type in argument 3 (different address spaces) @@ expected void *buf @@ got void [noderef] __user *buffer @@
kernel/sysctl-test.c:172:9: sparse: expected void *buf
kernel/sysctl-test.c:172:9: sparse: got void [noderef] __user *buffer
kernel/sysctl-test.c:172:9: sparse: sparse: incorrect type in argument 3 (different address spaces) @@ expected void *buf @@ got void [noderef] __user *buffer @@
kernel/sysctl-test.c:172:9: sparse: expected void *buf
kernel/sysctl-test.c:172:9: sparse: got void [noderef] __user *buffer
>> kernel/sysctl-test.c:201:9: sparse: sparse: incorrect type in argument 3 (different address spaces) @@ expected void *buf @@ got char [noderef] __user *user_buffer @@
kernel/sysctl-test.c:201:9: sparse: expected void *buf
kernel/sysctl-test.c:201:9: sparse: got char [noderef] __user *user_buffer
>> kernel/sysctl-test.c:201:9: sparse: sparse: incorrect type in argument 3 (different address spaces) @@ expected void *buf @@ got char [noderef] __user *user_buffer @@
kernel/sysctl-test.c:201:9: sparse: expected void *buf
kernel/sysctl-test.c:201:9: sparse: got char [noderef] __user *user_buffer
kernel/sysctl-test.c:231:9: sparse: sparse: incorrect type in argument 3 (different address spaces) @@ expected void *buf @@ got char [noderef] __user *user_buffer @@
kernel/sysctl-test.c:231:9: sparse: expected void *buf
kernel/sysctl-test.c:231:9: sparse: got char [noderef] __user *user_buffer
kernel/sysctl-test.c:231:9: sparse: sparse: incorrect type in argument 3 (different address spaces) @@ expected void *buf @@ got char [noderef] __user *user_buffer @@
kernel/sysctl-test.c:231:9: sparse: expected void *buf
kernel/sysctl-test.c:231:9: sparse: got char [noderef] __user *user_buffer
kernel/sysctl-test.c:262:9: sparse: sparse: incorrect type in argument 3 (different address spaces) @@ expected void *buf @@ got char [noderef] __user *user_buffer @@
kernel/sysctl-test.c:262:9: sparse: expected void *buf
kernel/sysctl-test.c:262:9: sparse: got char [noderef] __user *user_buffer
kernel/sysctl-test.c:262:9: sparse: sparse: incorrect type in argument 3 (different address spaces) @@ expected void *buf @@ got char [noderef] __user *user_buffer @@
kernel/sysctl-test.c:262:9: sparse: expected void *buf
kernel/sysctl-test.c:262:9: sparse: got char [noderef] __user *user_buffer
kernel/sysctl-test.c:292:9: sparse: sparse: incorrect type in argument 3 (different address spaces) @@ expected void *buf @@ got char [noderef] __user *user_buffer @@
kernel/sysctl-test.c:292:9: sparse: expected void *buf
kernel/sysctl-test.c:292:9: sparse: got char [noderef] __user *user_buffer
kernel/sysctl-test.c:292:9: sparse: sparse: incorrect type in argument 3 (different address spaces) @@ expected void *buf @@ got char [noderef] __user *user_buffer @@
kernel/sysctl-test.c:292:9: sparse: expected void *buf
kernel/sysctl-test.c:292:9: sparse: got char [noderef] __user *user_buffer
kernel/sysctl-test.c:332:9: sparse: sparse: incorrect type in argument 3 (different address spaces) @@ expected void *buf @@ got char [noderef] __user *user_buffer @@
kernel/sysctl-test.c:332:9: sparse: expected void *buf
kernel/sysctl-test.c:332:9: sparse: got char [noderef] __user *user_buffer
kernel/sysctl-test.c:332:9: sparse: sparse: incorrect type in argument 3 (different address spaces) @@ expected void *buf @@ got char [noderef] __user *user_buffer @@
kernel/sysctl-test.c:332:9: sparse: expected void *buf
kernel/sysctl-test.c:332:9: sparse: got char [noderef] __user *user_buffer
kernel/sysctl-test.c:364:9: sparse: sparse: incorrect type in argument 3 (different address spaces) @@ expected void *buf @@ got char [noderef] __user *user_buffer @@
kernel/sysctl-test.c:364:9: sparse: expected void *buf
kernel/sysctl-test.c:364:9: sparse: got char [noderef] __user *user_buffer
kernel/sysctl-test.c:364:9: sparse: sparse: incorrect type in argument 3 (different address spaces) @@ expected void *buf @@ got char [noderef] __user *user_buffer @@
kernel/sysctl-test.c:364:9: sparse: expected void *buf
kernel/sysctl-test.c:364:9: sparse: got char [noderef] __user *user_buffer
vim +46 kernel/sysctl-test.c
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 11
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 12 /*
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 13 * Test that proc_dointvec will not try to use a NULL .data field even when the
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 14 * length is non-zero.
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 15 */
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 16 static void sysctl_test_api_dointvec_null_tbl_data(struct kunit *test)
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 17 {
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 18 struct ctl_table null_data_table = {
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 19 .procname = "foo",
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 20 /*
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 21 * Here we are testing that proc_dointvec behaves correctly when
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 22 * we give it a NULL .data field. Normally this would point to a
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 23 * piece of memory where the value would be stored.
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 24 */
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 25 .data = NULL,
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 26 .maxlen = sizeof(int),
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 27 .mode = 0644,
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 28 .proc_handler = proc_dointvec,
c06a17fe056b84 Liu Shixin 2022-09-08 29 .extra1 = SYSCTL_ZERO,
c06a17fe056b84 Liu Shixin 2022-09-08 30 .extra2 = SYSCTL_ONE_HUNDRED,
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 31 };
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 32 /*
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 33 * proc_dointvec expects a buffer in user space, so we allocate one. We
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 34 * also need to cast it to __user so sparse doesn't get mad.
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 35 */
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 36 void __user *buffer = (void __user *)kunit_kzalloc(test, sizeof(int),
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 37 GFP_USER);
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 38 size_t len;
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 39 loff_t pos;
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 40
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 41 /*
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 42 * We don't care what the starting length is since proc_dointvec should
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 43 * not try to read because .data is NULL.
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 44 */
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 45 len = 1234;
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 @46 KUNIT_EXPECT_EQ(test, 0, proc_dointvec(&null_data_table,
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 47 KUNIT_PROC_READ, buffer, &len,
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 48 &pos));
388ca2e024dd5e David Gow 2021-05-13 49 KUNIT_EXPECT_EQ(test, 0, len);
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 50
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 51 /*
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 52 * See above.
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 53 */
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 54 len = 1234;
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 55 KUNIT_EXPECT_EQ(test, 0, proc_dointvec(&null_data_table,
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 56 KUNIT_PROC_WRITE, buffer, &len,
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 57 &pos));
388ca2e024dd5e David Gow 2021-05-13 58 KUNIT_EXPECT_EQ(test, 0, len);
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 59 }
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 60
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 61 /*
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 62 * Similar to the previous test, we create a struct ctrl_table that has a .data
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 63 * field that proc_dointvec cannot do anything with; however, this time it is
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 64 * because we tell proc_dointvec that the size is 0.
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 65 */
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 66 static void sysctl_test_api_dointvec_table_maxlen_unset(struct kunit *test)
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 67 {
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 68 int data = 0;
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 69 struct ctl_table data_maxlen_unset_table = {
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 70 .procname = "foo",
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 71 .data = &data,
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 72 /*
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 73 * So .data is no longer NULL, but we tell proc_dointvec its
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 74 * length is 0, so it still shouldn't try to use it.
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 75 */
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 76 .maxlen = 0,
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 77 .mode = 0644,
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 78 .proc_handler = proc_dointvec,
c06a17fe056b84 Liu Shixin 2022-09-08 79 .extra1 = SYSCTL_ZERO,
c06a17fe056b84 Liu Shixin 2022-09-08 80 .extra2 = SYSCTL_ONE_HUNDRED,
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 81 };
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 82 void __user *buffer = (void __user *)kunit_kzalloc(test, sizeof(int),
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 83 GFP_USER);
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 84 size_t len;
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 85 loff_t pos;
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 86
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 87 /*
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 88 * As before, we don't care what buffer length is because proc_dointvec
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 89 * cannot do anything because its internal .data buffer has zero length.
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 90 */
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 91 len = 1234;
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 92 KUNIT_EXPECT_EQ(test, 0, proc_dointvec(&data_maxlen_unset_table,
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 93 KUNIT_PROC_READ, buffer, &len,
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 94 &pos));
388ca2e024dd5e David Gow 2021-05-13 95 KUNIT_EXPECT_EQ(test, 0, len);
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 96
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 97 /*
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 98 * See previous comment.
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 99 */
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 100 len = 1234;
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 101 KUNIT_EXPECT_EQ(test, 0, proc_dointvec(&data_maxlen_unset_table,
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 102 KUNIT_PROC_WRITE, buffer, &len,
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 103 &pos));
388ca2e024dd5e David Gow 2021-05-13 104 KUNIT_EXPECT_EQ(test, 0, len);
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 105 }
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 106
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 107 /*
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 108 * Here we provide a valid struct ctl_table, but we try to read and write from
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 109 * it using a buffer of zero length, so it should still fail in a similar way as
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 110 * before.
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 111 */
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 112 static void sysctl_test_api_dointvec_table_len_is_zero(struct kunit *test)
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 113 {
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 114 int data = 0;
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 115 /* Good table. */
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 116 struct ctl_table table = {
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 117 .procname = "foo",
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 118 .data = &data,
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 119 .maxlen = sizeof(int),
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 120 .mode = 0644,
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 121 .proc_handler = proc_dointvec,
c06a17fe056b84 Liu Shixin 2022-09-08 122 .extra1 = SYSCTL_ZERO,
c06a17fe056b84 Liu Shixin 2022-09-08 123 .extra2 = SYSCTL_ONE_HUNDRED,
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 124 };
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 125 void __user *buffer = (void __user *)kunit_kzalloc(test, sizeof(int),
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 126 GFP_USER);
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 127 /*
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 128 * However, now our read/write buffer has zero length.
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 129 */
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 130 size_t len = 0;
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 131 loff_t pos;
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 132
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 133 KUNIT_EXPECT_EQ(test, 0, proc_dointvec(&table, KUNIT_PROC_READ, buffer,
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 134 &len, &pos));
388ca2e024dd5e David Gow 2021-05-13 135 KUNIT_EXPECT_EQ(test, 0, len);
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 136
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 137 KUNIT_EXPECT_EQ(test, 0, proc_dointvec(&table, KUNIT_PROC_WRITE, buffer,
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 138 &len, &pos));
388ca2e024dd5e David Gow 2021-05-13 139 KUNIT_EXPECT_EQ(test, 0, len);
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 140 }
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 141
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 142 /*
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 143 * Test that proc_dointvec refuses to read when the file position is non-zero.
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 144 */
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 145 static void sysctl_test_api_dointvec_table_read_but_position_set(
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 146 struct kunit *test)
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 147 {
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 148 int data = 0;
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 149 /* Good table. */
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 150 struct ctl_table table = {
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 151 .procname = "foo",
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 152 .data = &data,
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 153 .maxlen = sizeof(int),
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 154 .mode = 0644,
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 155 .proc_handler = proc_dointvec,
c06a17fe056b84 Liu Shixin 2022-09-08 156 .extra1 = SYSCTL_ZERO,
c06a17fe056b84 Liu Shixin 2022-09-08 157 .extra2 = SYSCTL_ONE_HUNDRED,
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 158 };
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 159 void __user *buffer = (void __user *)kunit_kzalloc(test, sizeof(int),
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 160 GFP_USER);
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 161 /*
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 162 * We don't care about our buffer length because we start off with a
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 163 * non-zero file position.
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 164 */
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 165 size_t len = 1234;
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 166 /*
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 167 * proc_dointvec should refuse to read into the buffer since the file
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 168 * pos is non-zero.
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 169 */
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 170 loff_t pos = 1;
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 171
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 172 KUNIT_EXPECT_EQ(test, 0, proc_dointvec(&table, KUNIT_PROC_READ, buffer,
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 173 &len, &pos));
388ca2e024dd5e David Gow 2021-05-13 174 KUNIT_EXPECT_EQ(test, 0, len);
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 175 }
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 176
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 177 /*
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 178 * Test that we can read a two digit number in a sufficiently size buffer.
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 179 * Nothing fancy.
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 180 */
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 181 static void sysctl_test_dointvec_read_happy_single_positive(struct kunit *test)
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 182 {
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 183 int data = 0;
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 184 /* Good table. */
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 185 struct ctl_table table = {
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 186 .procname = "foo",
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 187 .data = &data,
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 188 .maxlen = sizeof(int),
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 189 .mode = 0644,
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 190 .proc_handler = proc_dointvec,
c06a17fe056b84 Liu Shixin 2022-09-08 191 .extra1 = SYSCTL_ZERO,
c06a17fe056b84 Liu Shixin 2022-09-08 192 .extra2 = SYSCTL_ONE_HUNDRED,
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 193 };
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 194 size_t len = 4;
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 195 loff_t pos = 0;
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 196 char *buffer = kunit_kzalloc(test, len, GFP_USER);
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 197 char __user *user_buffer = (char __user *)buffer;
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 198 /* Store 13 in the data field. */
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 199 *((int *)table.data) = 13;
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 200
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 @201 KUNIT_EXPECT_EQ(test, 0, proc_dointvec(&table, KUNIT_PROC_READ,
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 202 user_buffer, &len, &pos));
388ca2e024dd5e David Gow 2021-05-13 203 KUNIT_ASSERT_EQ(test, 3, len);
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 204 buffer[len] = '\0';
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 205 /* And we read 13 back out. */
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 206 KUNIT_EXPECT_STREQ(test, "13\n", buffer);
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 207 }
2cb80dbbbaba4f Iurii Zaikin 2019-09-23 208
:::::: The code at line 46 was first introduced by commit
:::::: 2cb80dbbbaba4f2f86f686c34cb79ea5cbfb0edb kernel/sysctl-test: Add null pointer test for sysctl.c:proc_dointvec()
:::::: TO: Iurii Zaikin <yzaikin@google.com>
:::::: CC: Shuah Khan <skhan@linuxfoundation.org>
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2026-07-26 4:10 UTC | newest]
Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-07-26 4:09 [linux-next:master 3459/9043] kernel/sysctl-test.c:46:9: sparse: sparse: incorrect type in argument 3 (different address spaces) kernel test robot
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.