~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/kernel/sysctl-test.c

Version: ~ [ linux-6.12-rc7 ] ~ [ linux-6.11.7 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.60 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.116 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.171 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.229 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.285 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.323 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.12 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

Diff markup

Differences between /kernel/sysctl-test.c (Version linux-6.12-rc7) and /kernel/sysctl-test.c (Version linux-5.4.285)


  1 // SPDX-License-Identifier: GPL-2.0                 1 // SPDX-License-Identifier: GPL-2.0
  2 /*                                                  2 /*
  3  * KUnit test of proc sysctl.                       3  * KUnit test of proc sysctl.
  4  */                                                 4  */
  5                                                     5 
  6 #include <kunit/test.h>                             6 #include <kunit/test.h>
  7 #include <linux/sysctl.h>                           7 #include <linux/sysctl.h>
  8                                                     8 
  9 #define KUNIT_PROC_READ 0                           9 #define KUNIT_PROC_READ 0
 10 #define KUNIT_PROC_WRITE 1                         10 #define KUNIT_PROC_WRITE 1
 11                                                    11 
                                                   >>  12 static int i_zero;
                                                   >>  13 static int i_one_hundred = 100;
                                                   >>  14 
 12 /*                                                 15 /*
 13  * Test that proc_dointvec will not try to use     16  * Test that proc_dointvec will not try to use a NULL .data field even when the
 14  * length is non-zero.                             17  * length is non-zero.
 15  */                                                18  */
 16 static void sysctl_test_api_dointvec_null_tbl_     19 static void sysctl_test_api_dointvec_null_tbl_data(struct kunit *test)
 17 {                                                  20 {
 18         struct ctl_table null_data_table = {       21         struct ctl_table null_data_table = {
 19                 .procname = "foo",                 22                 .procname = "foo",
 20                 /*                                 23                 /*
 21                  * Here we are testing that pr     24                  * Here we are testing that proc_dointvec behaves correctly when
 22                  * we give it a NULL .data fie     25                  * we give it a NULL .data field. Normally this would point to a
 23                  * piece of memory where the v     26                  * piece of memory where the value would be stored.
 24                  */                                27                  */
 25                 .data           = NULL,            28                 .data           = NULL,
 26                 .maxlen         = sizeof(int),     29                 .maxlen         = sizeof(int),
 27                 .mode           = 0644,            30                 .mode           = 0644,
 28                 .proc_handler   = proc_dointve     31                 .proc_handler   = proc_dointvec,
 29                 .extra1         = SYSCTL_ZERO, !!  32                 .extra1         = &i_zero,
 30                 .extra2         = SYSCTL_ONE_H !!  33                 .extra2         = &i_one_hundred,
 31         };                                         34         };
 32         /*                                         35         /*
 33          * proc_dointvec expects a buffer in u     36          * proc_dointvec expects a buffer in user space, so we allocate one. We
 34          * also need to cast it to __user so s     37          * also need to cast it to __user so sparse doesn't get mad.
 35          */                                        38          */
 36         void __user *buffer = (void __user *)k     39         void __user *buffer = (void __user *)kunit_kzalloc(test, sizeof(int),
 37                                                    40                                                            GFP_USER);
 38         size_t len;                                41         size_t len;
 39         loff_t pos;                                42         loff_t pos;
 40                                                    43 
 41         /*                                         44         /*
 42          * We don't care what the starting len     45          * We don't care what the starting length is since proc_dointvec should
 43          * not try to read because .data is NU     46          * not try to read because .data is NULL.
 44          */                                        47          */
 45         len = 1234;                                48         len = 1234;
 46         KUNIT_EXPECT_EQ(test, 0, proc_dointvec     49         KUNIT_EXPECT_EQ(test, 0, proc_dointvec(&null_data_table,
 47                                                    50                                                KUNIT_PROC_READ, buffer, &len,
 48                                                    51                                                &pos));
 49         KUNIT_EXPECT_EQ(test, 0, len);         !!  52         KUNIT_EXPECT_EQ(test, (size_t)0, len);
 50                                                    53 
 51         /*                                         54         /*
 52          * See above.                              55          * See above.
 53          */                                        56          */
 54         len = 1234;                                57         len = 1234;
 55         KUNIT_EXPECT_EQ(test, 0, proc_dointvec     58         KUNIT_EXPECT_EQ(test, 0, proc_dointvec(&null_data_table,
 56                                                    59                                                KUNIT_PROC_WRITE, buffer, &len,
 57                                                    60                                                &pos));
 58         KUNIT_EXPECT_EQ(test, 0, len);         !!  61         KUNIT_EXPECT_EQ(test, (size_t)0, len);
 59 }                                                  62 }
 60                                                    63 
 61 /*                                                 64 /*
 62  * Similar to the previous test, we create a s     65  * Similar to the previous test, we create a struct ctrl_table that has a .data
 63  * field that proc_dointvec cannot do anything     66  * field that proc_dointvec cannot do anything with; however, this time it is
 64  * because we tell proc_dointvec that the size     67  * because we tell proc_dointvec that the size is 0.
 65  */                                                68  */
 66 static void sysctl_test_api_dointvec_table_max     69 static void sysctl_test_api_dointvec_table_maxlen_unset(struct kunit *test)
 67 {                                                  70 {
 68         int data = 0;                              71         int data = 0;
 69         struct ctl_table data_maxlen_unset_tab     72         struct ctl_table data_maxlen_unset_table = {
 70                 .procname = "foo",                 73                 .procname = "foo",
 71                 .data           = &data,           74                 .data           = &data,
 72                 /*                                 75                 /*
 73                  * So .data is no longer NULL,     76                  * So .data is no longer NULL, but we tell proc_dointvec its
 74                  * length is 0, so it still sh     77                  * length is 0, so it still shouldn't try to use it.
 75                  */                                78                  */
 76                 .maxlen         = 0,               79                 .maxlen         = 0,
 77                 .mode           = 0644,            80                 .mode           = 0644,
 78                 .proc_handler   = proc_dointve     81                 .proc_handler   = proc_dointvec,
 79                 .extra1         = SYSCTL_ZERO, !!  82                 .extra1         = &i_zero,
 80                 .extra2         = SYSCTL_ONE_H !!  83                 .extra2         = &i_one_hundred,
 81         };                                         84         };
 82         void __user *buffer = (void __user *)k     85         void __user *buffer = (void __user *)kunit_kzalloc(test, sizeof(int),
 83                                                    86                                                            GFP_USER);
 84         size_t len;                                87         size_t len;
 85         loff_t pos;                                88         loff_t pos;
 86                                                    89 
 87         /*                                         90         /*
 88          * As before, we don't care what buffe     91          * As before, we don't care what buffer length is because proc_dointvec
 89          * cannot do anything because its inte     92          * cannot do anything because its internal .data buffer has zero length.
 90          */                                        93          */
 91         len = 1234;                                94         len = 1234;
 92         KUNIT_EXPECT_EQ(test, 0, proc_dointvec     95         KUNIT_EXPECT_EQ(test, 0, proc_dointvec(&data_maxlen_unset_table,
 93                                                    96                                                KUNIT_PROC_READ, buffer, &len,
 94                                                    97                                                &pos));
 95         KUNIT_EXPECT_EQ(test, 0, len);         !!  98         KUNIT_EXPECT_EQ(test, (size_t)0, len);
 96                                                    99 
 97         /*                                        100         /*
 98          * See previous comment.                  101          * See previous comment.
 99          */                                       102          */
100         len = 1234;                               103         len = 1234;
101         KUNIT_EXPECT_EQ(test, 0, proc_dointvec    104         KUNIT_EXPECT_EQ(test, 0, proc_dointvec(&data_maxlen_unset_table,
102                                                   105                                                KUNIT_PROC_WRITE, buffer, &len,
103                                                   106                                                &pos));
104         KUNIT_EXPECT_EQ(test, 0, len);         !! 107         KUNIT_EXPECT_EQ(test, (size_t)0, len);
105 }                                                 108 }
106                                                   109 
107 /*                                                110 /*
108  * Here we provide a valid struct ctl_table, b    111  * Here we provide a valid struct ctl_table, but we try to read and write from
109  * it using a buffer of zero length, so it sho    112  * it using a buffer of zero length, so it should still fail in a similar way as
110  * before.                                        113  * before.
111  */                                               114  */
112 static void sysctl_test_api_dointvec_table_len    115 static void sysctl_test_api_dointvec_table_len_is_zero(struct kunit *test)
113 {                                                 116 {
114         int data = 0;                             117         int data = 0;
115         /* Good table. */                         118         /* Good table. */
116         struct ctl_table table = {                119         struct ctl_table table = {
117                 .procname = "foo",                120                 .procname = "foo",
118                 .data           = &data,          121                 .data           = &data,
119                 .maxlen         = sizeof(int),    122                 .maxlen         = sizeof(int),
120                 .mode           = 0644,           123                 .mode           = 0644,
121                 .proc_handler   = proc_dointve    124                 .proc_handler   = proc_dointvec,
122                 .extra1         = SYSCTL_ZERO, !! 125                 .extra1         = &i_zero,
123                 .extra2         = SYSCTL_ONE_H !! 126                 .extra2         = &i_one_hundred,
124         };                                        127         };
125         void __user *buffer = (void __user *)k    128         void __user *buffer = (void __user *)kunit_kzalloc(test, sizeof(int),
126                                                   129                                                            GFP_USER);
127         /*                                        130         /*
128          * However, now our read/write buffer     131          * However, now our read/write buffer has zero length.
129          */                                       132          */
130         size_t len = 0;                           133         size_t len = 0;
131         loff_t pos;                               134         loff_t pos;
132                                                   135 
133         KUNIT_EXPECT_EQ(test, 0, proc_dointvec    136         KUNIT_EXPECT_EQ(test, 0, proc_dointvec(&table, KUNIT_PROC_READ, buffer,
134                                                   137                                                &len, &pos));
135         KUNIT_EXPECT_EQ(test, 0, len);         !! 138         KUNIT_EXPECT_EQ(test, (size_t)0, len);
136                                                   139 
137         KUNIT_EXPECT_EQ(test, 0, proc_dointvec    140         KUNIT_EXPECT_EQ(test, 0, proc_dointvec(&table, KUNIT_PROC_WRITE, buffer,
138                                                   141                                                &len, &pos));
139         KUNIT_EXPECT_EQ(test, 0, len);         !! 142         KUNIT_EXPECT_EQ(test, (size_t)0, len);
140 }                                                 143 }
141                                                   144 
142 /*                                                145 /*
143  * Test that proc_dointvec refuses to read whe    146  * Test that proc_dointvec refuses to read when the file position is non-zero.
144  */                                               147  */
145 static void sysctl_test_api_dointvec_table_rea    148 static void sysctl_test_api_dointvec_table_read_but_position_set(
146                 struct kunit *test)               149                 struct kunit *test)
147 {                                                 150 {
148         int data = 0;                             151         int data = 0;
149         /* Good table. */                         152         /* Good table. */
150         struct ctl_table table = {                153         struct ctl_table table = {
151                 .procname = "foo",                154                 .procname = "foo",
152                 .data           = &data,          155                 .data           = &data,
153                 .maxlen         = sizeof(int),    156                 .maxlen         = sizeof(int),
154                 .mode           = 0644,           157                 .mode           = 0644,
155                 .proc_handler   = proc_dointve    158                 .proc_handler   = proc_dointvec,
156                 .extra1         = SYSCTL_ZERO, !! 159                 .extra1         = &i_zero,
157                 .extra2         = SYSCTL_ONE_H !! 160                 .extra2         = &i_one_hundred,
158         };                                        161         };
159         void __user *buffer = (void __user *)k    162         void __user *buffer = (void __user *)kunit_kzalloc(test, sizeof(int),
160                                                   163                                                            GFP_USER);
161         /*                                        164         /*
162          * We don't care about our buffer leng    165          * We don't care about our buffer length because we start off with a
163          * non-zero file position.                166          * non-zero file position.
164          */                                       167          */
165         size_t len = 1234;                        168         size_t len = 1234;
166         /*                                        169         /*
167          * proc_dointvec should refuse to read    170          * proc_dointvec should refuse to read into the buffer since the file
168          * pos is non-zero.                       171          * pos is non-zero.
169          */                                       172          */
170         loff_t pos = 1;                           173         loff_t pos = 1;
171                                                   174 
172         KUNIT_EXPECT_EQ(test, 0, proc_dointvec    175         KUNIT_EXPECT_EQ(test, 0, proc_dointvec(&table, KUNIT_PROC_READ, buffer,
173                                                   176                                                &len, &pos));
174         KUNIT_EXPECT_EQ(test, 0, len);         !! 177         KUNIT_EXPECT_EQ(test, (size_t)0, len);
175 }                                                 178 }
176                                                   179 
177 /*                                                180 /*
178  * Test that we can read a two digit number in    181  * Test that we can read a two digit number in a sufficiently size buffer.
179  * Nothing fancy.                                 182  * Nothing fancy.
180  */                                               183  */
181 static void sysctl_test_dointvec_read_happy_si    184 static void sysctl_test_dointvec_read_happy_single_positive(struct kunit *test)
182 {                                                 185 {
183         int data = 0;                             186         int data = 0;
184         /* Good table. */                         187         /* Good table. */
185         struct ctl_table table = {                188         struct ctl_table table = {
186                 .procname = "foo",                189                 .procname = "foo",
187                 .data           = &data,          190                 .data           = &data,
188                 .maxlen         = sizeof(int),    191                 .maxlen         = sizeof(int),
189                 .mode           = 0644,           192                 .mode           = 0644,
190                 .proc_handler   = proc_dointve    193                 .proc_handler   = proc_dointvec,
191                 .extra1         = SYSCTL_ZERO, !! 194                 .extra1         = &i_zero,
192                 .extra2         = SYSCTL_ONE_H !! 195                 .extra2         = &i_one_hundred,
193         };                                        196         };
194         size_t len = 4;                           197         size_t len = 4;
195         loff_t pos = 0;                           198         loff_t pos = 0;
196         char *buffer = kunit_kzalloc(test, len    199         char *buffer = kunit_kzalloc(test, len, GFP_USER);
197         char __user *user_buffer = (char __use    200         char __user *user_buffer = (char __user *)buffer;
198         /* Store 13 in the data field. */         201         /* Store 13 in the data field. */
199         *((int *)table.data) = 13;                202         *((int *)table.data) = 13;
200                                                   203 
201         KUNIT_EXPECT_EQ(test, 0, proc_dointvec    204         KUNIT_EXPECT_EQ(test, 0, proc_dointvec(&table, KUNIT_PROC_READ,
202                                                   205                                                user_buffer, &len, &pos));
203         KUNIT_ASSERT_EQ(test, 3, len);         !! 206         KUNIT_ASSERT_EQ(test, (size_t)3, len);
204         buffer[len] = '\0';                       207         buffer[len] = '\0';
205         /* And we read 13 back out. */            208         /* And we read 13 back out. */
206         KUNIT_EXPECT_STREQ(test, "13\n", buffe    209         KUNIT_EXPECT_STREQ(test, "13\n", buffer);
207 }                                                 210 }
208                                                   211 
209 /*                                                212 /*
210  * Same as previous test, just now with negati    213  * Same as previous test, just now with negative numbers.
211  */                                               214  */
212 static void sysctl_test_dointvec_read_happy_si    215 static void sysctl_test_dointvec_read_happy_single_negative(struct kunit *test)
213 {                                                 216 {
214         int data = 0;                             217         int data = 0;
215         /* Good table. */                         218         /* Good table. */
216         struct ctl_table table = {                219         struct ctl_table table = {
217                 .procname = "foo",                220                 .procname = "foo",
218                 .data           = &data,          221                 .data           = &data,
219                 .maxlen         = sizeof(int),    222                 .maxlen         = sizeof(int),
220                 .mode           = 0644,           223                 .mode           = 0644,
221                 .proc_handler   = proc_dointve    224                 .proc_handler   = proc_dointvec,
222                 .extra1         = SYSCTL_ZERO, !! 225                 .extra1         = &i_zero,
223                 .extra2         = SYSCTL_ONE_H !! 226                 .extra2         = &i_one_hundred,
224         };                                        227         };
225         size_t len = 5;                           228         size_t len = 5;
226         loff_t pos = 0;                           229         loff_t pos = 0;
227         char *buffer = kunit_kzalloc(test, len    230         char *buffer = kunit_kzalloc(test, len, GFP_USER);
228         char __user *user_buffer = (char __use    231         char __user *user_buffer = (char __user *)buffer;
229         *((int *)table.data) = -16;               232         *((int *)table.data) = -16;
230                                                   233 
231         KUNIT_EXPECT_EQ(test, 0, proc_dointvec    234         KUNIT_EXPECT_EQ(test, 0, proc_dointvec(&table, KUNIT_PROC_READ,
232                                                   235                                                user_buffer, &len, &pos));
233         KUNIT_ASSERT_EQ(test, 4, len);         !! 236         KUNIT_ASSERT_EQ(test, (size_t)4, len);
234         buffer[len] = '\0';                       237         buffer[len] = '\0';
235         KUNIT_EXPECT_STREQ(test, "-16\n", buff !! 238         KUNIT_EXPECT_STREQ(test, "-16\n", (char *)buffer);
236 }                                                 239 }
237                                                   240 
238 /*                                                241 /*
239  * Test that a simple positive write works.       242  * Test that a simple positive write works.
240  */                                               243  */
241 static void sysctl_test_dointvec_write_happy_s    244 static void sysctl_test_dointvec_write_happy_single_positive(struct kunit *test)
242 {                                                 245 {
243         int data = 0;                             246         int data = 0;
244         /* Good table. */                         247         /* Good table. */
245         struct ctl_table table = {                248         struct ctl_table table = {
246                 .procname = "foo",                249                 .procname = "foo",
247                 .data           = &data,          250                 .data           = &data,
248                 .maxlen         = sizeof(int),    251                 .maxlen         = sizeof(int),
249                 .mode           = 0644,           252                 .mode           = 0644,
250                 .proc_handler   = proc_dointve    253                 .proc_handler   = proc_dointvec,
251                 .extra1         = SYSCTL_ZERO, !! 254                 .extra1         = &i_zero,
252                 .extra2         = SYSCTL_ONE_H !! 255                 .extra2         = &i_one_hundred,
253         };                                        256         };
254         char input[] = "9";                       257         char input[] = "9";
255         size_t len = sizeof(input) - 1;           258         size_t len = sizeof(input) - 1;
256         loff_t pos = 0;                           259         loff_t pos = 0;
257         char *buffer = kunit_kzalloc(test, len    260         char *buffer = kunit_kzalloc(test, len, GFP_USER);
258         char __user *user_buffer = (char __use    261         char __user *user_buffer = (char __user *)buffer;
259                                                   262 
260         memcpy(buffer, input, len);               263         memcpy(buffer, input, len);
261                                                   264 
262         KUNIT_EXPECT_EQ(test, 0, proc_dointvec    265         KUNIT_EXPECT_EQ(test, 0, proc_dointvec(&table, KUNIT_PROC_WRITE,
263                                                   266                                                user_buffer, &len, &pos));
264         KUNIT_EXPECT_EQ(test, sizeof(input) -     267         KUNIT_EXPECT_EQ(test, sizeof(input) - 1, len);
265         KUNIT_EXPECT_EQ(test, sizeof(input) -  !! 268         KUNIT_EXPECT_EQ(test, sizeof(input) - 1, (size_t)pos);
266         KUNIT_EXPECT_EQ(test, 9, *((int *)tabl    269         KUNIT_EXPECT_EQ(test, 9, *((int *)table.data));
267 }                                                 270 }
268                                                   271 
269 /*                                                272 /*
270  * Same as previous test, but now with negativ    273  * Same as previous test, but now with negative numbers.
271  */                                               274  */
272 static void sysctl_test_dointvec_write_happy_s    275 static void sysctl_test_dointvec_write_happy_single_negative(struct kunit *test)
273 {                                                 276 {
274         int data = 0;                             277         int data = 0;
275         struct ctl_table table = {                278         struct ctl_table table = {
276                 .procname = "foo",                279                 .procname = "foo",
277                 .data           = &data,          280                 .data           = &data,
278                 .maxlen         = sizeof(int),    281                 .maxlen         = sizeof(int),
279                 .mode           = 0644,           282                 .mode           = 0644,
280                 .proc_handler   = proc_dointve    283                 .proc_handler   = proc_dointvec,
281                 .extra1         = SYSCTL_ZERO, !! 284                 .extra1         = &i_zero,
282                 .extra2         = SYSCTL_ONE_H !! 285                 .extra2         = &i_one_hundred,
283         };                                        286         };
284         char input[] = "-9";                      287         char input[] = "-9";
285         size_t len = sizeof(input) - 1;           288         size_t len = sizeof(input) - 1;
286         loff_t pos = 0;                           289         loff_t pos = 0;
287         char *buffer = kunit_kzalloc(test, len    290         char *buffer = kunit_kzalloc(test, len, GFP_USER);
288         char __user *user_buffer = (char __use    291         char __user *user_buffer = (char __user *)buffer;
289                                                   292 
290         memcpy(buffer, input, len);               293         memcpy(buffer, input, len);
291                                                   294 
292         KUNIT_EXPECT_EQ(test, 0, proc_dointvec    295         KUNIT_EXPECT_EQ(test, 0, proc_dointvec(&table, KUNIT_PROC_WRITE,
293                                                   296                                                user_buffer, &len, &pos));
294         KUNIT_EXPECT_EQ(test, sizeof(input) -     297         KUNIT_EXPECT_EQ(test, sizeof(input) - 1, len);
295         KUNIT_EXPECT_EQ(test, sizeof(input) -  !! 298         KUNIT_EXPECT_EQ(test, sizeof(input) - 1, (size_t)pos);
296         KUNIT_EXPECT_EQ(test, -9, *((int *)tab    299         KUNIT_EXPECT_EQ(test, -9, *((int *)table.data));
297 }                                                 300 }
298                                                   301 
299 /*                                                302 /*
300  * Test that writing a value smaller than the     303  * Test that writing a value smaller than the minimum possible value is not
301  * allowed.                                       304  * allowed.
302  */                                               305  */
303 static void sysctl_test_api_dointvec_write_sin    306 static void sysctl_test_api_dointvec_write_single_less_int_min(
304                 struct kunit *test)               307                 struct kunit *test)
305 {                                                 308 {
306         int data = 0;                             309         int data = 0;
307         struct ctl_table table = {                310         struct ctl_table table = {
308                 .procname = "foo",                311                 .procname = "foo",
309                 .data           = &data,          312                 .data           = &data,
310                 .maxlen         = sizeof(int),    313                 .maxlen         = sizeof(int),
311                 .mode           = 0644,           314                 .mode           = 0644,
312                 .proc_handler   = proc_dointve    315                 .proc_handler   = proc_dointvec,
313                 .extra1         = SYSCTL_ZERO, !! 316                 .extra1         = &i_zero,
314                 .extra2         = SYSCTL_ONE_H !! 317                 .extra2         = &i_one_hundred,
315         };                                        318         };
316         size_t max_len = 32, len = max_len;       319         size_t max_len = 32, len = max_len;
317         loff_t pos = 0;                           320         loff_t pos = 0;
318         char *buffer = kunit_kzalloc(test, max    321         char *buffer = kunit_kzalloc(test, max_len, GFP_USER);
319         char __user *user_buffer = (char __use    322         char __user *user_buffer = (char __user *)buffer;
320         unsigned long abs_of_less_than_min = (    323         unsigned long abs_of_less_than_min = (unsigned long)INT_MAX
321                                              -    324                                              - (INT_MAX + INT_MIN) + 1;
322                                                   325 
323         /*                                        326         /*
324          * We use this rigmarole to create a s    327          * We use this rigmarole to create a string that contains a value one
325          * less than the minimum accepted valu    328          * less than the minimum accepted value.
326          */                                       329          */
327         KUNIT_ASSERT_LT(test,                     330         KUNIT_ASSERT_LT(test,
328                         (size_t)snprintf(buffe    331                         (size_t)snprintf(buffer, max_len, "-%lu",
329                                          abs_o    332                                          abs_of_less_than_min),
330                         max_len);                 333                         max_len);
331                                                   334 
332         KUNIT_EXPECT_EQ(test, -EINVAL, proc_do    335         KUNIT_EXPECT_EQ(test, -EINVAL, proc_dointvec(&table, KUNIT_PROC_WRITE,
333                                                   336                                                      user_buffer, &len, &pos));
334         KUNIT_EXPECT_EQ(test, max_len, len);      337         KUNIT_EXPECT_EQ(test, max_len, len);
335         KUNIT_EXPECT_EQ(test, 0, *((int *)tabl    338         KUNIT_EXPECT_EQ(test, 0, *((int *)table.data));
336 }                                                 339 }
337                                                   340 
338 /*                                                341 /*
339  * Test that writing the maximum possible valu    342  * Test that writing the maximum possible value works.
340  */                                               343  */
341 static void sysctl_test_api_dointvec_write_sin    344 static void sysctl_test_api_dointvec_write_single_greater_int_max(
342                 struct kunit *test)               345                 struct kunit *test)
343 {                                                 346 {
344         int data = 0;                             347         int data = 0;
345         struct ctl_table table = {                348         struct ctl_table table = {
346                 .procname = "foo",                349                 .procname = "foo",
347                 .data           = &data,          350                 .data           = &data,
348                 .maxlen         = sizeof(int),    351                 .maxlen         = sizeof(int),
349                 .mode           = 0644,           352                 .mode           = 0644,
350                 .proc_handler   = proc_dointve    353                 .proc_handler   = proc_dointvec,
351                 .extra1         = SYSCTL_ZERO, !! 354                 .extra1         = &i_zero,
352                 .extra2         = SYSCTL_ONE_H !! 355                 .extra2         = &i_one_hundred,
353         };                                        356         };
354         size_t max_len = 32, len = max_len;       357         size_t max_len = 32, len = max_len;
355         loff_t pos = 0;                           358         loff_t pos = 0;
356         char *buffer = kunit_kzalloc(test, max    359         char *buffer = kunit_kzalloc(test, max_len, GFP_USER);
357         char __user *user_buffer = (char __use    360         char __user *user_buffer = (char __user *)buffer;
358         unsigned long greater_than_max = (unsi    361         unsigned long greater_than_max = (unsigned long)INT_MAX + 1;
359                                                   362 
360         KUNIT_ASSERT_GT(test, greater_than_max    363         KUNIT_ASSERT_GT(test, greater_than_max, (unsigned long)INT_MAX);
361         KUNIT_ASSERT_LT(test, (size_t)snprintf    364         KUNIT_ASSERT_LT(test, (size_t)snprintf(buffer, max_len, "%lu",
362                                                   365                                                greater_than_max),
363                         max_len);                 366                         max_len);
364         KUNIT_EXPECT_EQ(test, -EINVAL, proc_do    367         KUNIT_EXPECT_EQ(test, -EINVAL, proc_dointvec(&table, KUNIT_PROC_WRITE,
365                                                   368                                                      user_buffer, &len, &pos));
366         KUNIT_ASSERT_EQ(test, max_len, len);      369         KUNIT_ASSERT_EQ(test, max_len, len);
367         KUNIT_EXPECT_EQ(test, 0, *((int *)tabl    370         KUNIT_EXPECT_EQ(test, 0, *((int *)table.data));
368 }                                                 371 }
369                                                   372 
370 /*                                             << 
371  * Test that registering an invalid extra valu << 
372  */                                            << 
373 static void sysctl_test_register_sysctl_sz_inv << 
374                 struct kunit *test)            << 
375 {                                              << 
376         unsigned char data = 0;                << 
377         struct ctl_table table_foo[] = {       << 
378                 {                              << 
379                         .procname       = "foo << 
380                         .data           = &dat << 
381                         .maxlen         = size << 
382                         .mode           = 0644 << 
383                         .proc_handler   = proc << 
384                         .extra1         = SYSC << 
385                         .extra2         = SYSC << 
386                 },                             << 
387         };                                     << 
388                                                << 
389         struct ctl_table table_bar[] = {       << 
390                 {                              << 
391                         .procname       = "bar << 
392                         .data           = &dat << 
393                         .maxlen         = size << 
394                         .mode           = 0644 << 
395                         .proc_handler   = proc << 
396                         .extra1         = SYSC << 
397                         .extra2         = SYSC << 
398                 },                             << 
399         };                                     << 
400                                                << 
401         struct ctl_table table_qux[] = {       << 
402                 {                              << 
403                         .procname       = "qux << 
404                         .data           = &dat << 
405                         .maxlen         = size << 
406                         .mode           = 0644 << 
407                         .proc_handler   = proc << 
408                         .extra1         = SYSC << 
409                         .extra2         = SYSC << 
410                 },                             << 
411         };                                     << 
412                                                << 
413         KUNIT_EXPECT_NULL(test, register_sysct << 
414         KUNIT_EXPECT_NULL(test, register_sysct << 
415         KUNIT_EXPECT_NOT_NULL(test, register_s << 
416 }                                              << 
417                                                << 
418 static struct kunit_case sysctl_test_cases[] =    373 static struct kunit_case sysctl_test_cases[] = {
419         KUNIT_CASE(sysctl_test_api_dointvec_nu    374         KUNIT_CASE(sysctl_test_api_dointvec_null_tbl_data),
420         KUNIT_CASE(sysctl_test_api_dointvec_ta    375         KUNIT_CASE(sysctl_test_api_dointvec_table_maxlen_unset),
421         KUNIT_CASE(sysctl_test_api_dointvec_ta    376         KUNIT_CASE(sysctl_test_api_dointvec_table_len_is_zero),
422         KUNIT_CASE(sysctl_test_api_dointvec_ta    377         KUNIT_CASE(sysctl_test_api_dointvec_table_read_but_position_set),
423         KUNIT_CASE(sysctl_test_dointvec_read_h    378         KUNIT_CASE(sysctl_test_dointvec_read_happy_single_positive),
424         KUNIT_CASE(sysctl_test_dointvec_read_h    379         KUNIT_CASE(sysctl_test_dointvec_read_happy_single_negative),
425         KUNIT_CASE(sysctl_test_dointvec_write_    380         KUNIT_CASE(sysctl_test_dointvec_write_happy_single_positive),
426         KUNIT_CASE(sysctl_test_dointvec_write_    381         KUNIT_CASE(sysctl_test_dointvec_write_happy_single_negative),
427         KUNIT_CASE(sysctl_test_api_dointvec_wr    382         KUNIT_CASE(sysctl_test_api_dointvec_write_single_less_int_min),
428         KUNIT_CASE(sysctl_test_api_dointvec_wr    383         KUNIT_CASE(sysctl_test_api_dointvec_write_single_greater_int_max),
429         KUNIT_CASE(sysctl_test_register_sysctl << 
430         {}                                        384         {}
431 };                                                385 };
432                                                   386 
433 static struct kunit_suite sysctl_test_suite =     387 static struct kunit_suite sysctl_test_suite = {
434         .name = "sysctl_test",                    388         .name = "sysctl_test",
435         .test_cases = sysctl_test_cases,          389         .test_cases = sysctl_test_cases,
436 };                                                390 };
437                                                   391 
438 kunit_test_suites(&sysctl_test_suite);         !! 392 kunit_test_suite(sysctl_test_suite);
439                                                << 
440 MODULE_DESCRIPTION("KUnit test of proc sysctl" << 
441 MODULE_LICENSE("GPL v2");                      << 
442                                                   393 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php