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
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.