0001
0002
0003
0004
0005
0006
0007 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
0008
0009 #include <kunit/test.h>
0010 #include <linux/device.h>
0011 #include <linux/kernel.h>
0012 #include <linux/mm.h>
0013 #include <linux/module.h>
0014 #include <linux/overflow.h>
0015 #include <linux/slab.h>
0016 #include <linux/types.h>
0017 #include <linux/vmalloc.h>
0018
0019 #define DEFINE_TEST_ARRAY(t) \
0020 static const struct test_ ## t { \
0021 t a, b; \
0022 t sum, diff, prod; \
0023 bool s_of, d_of, p_of; \
0024 } t ## _tests[]
0025
0026 DEFINE_TEST_ARRAY(u8) = {
0027 {0, 0, 0, 0, 0, false, false, false},
0028 {1, 1, 2, 0, 1, false, false, false},
0029 {0, 1, 1, U8_MAX, 0, false, true, false},
0030 {1, 0, 1, 1, 0, false, false, false},
0031 {0, U8_MAX, U8_MAX, 1, 0, false, true, false},
0032 {U8_MAX, 0, U8_MAX, U8_MAX, 0, false, false, false},
0033 {1, U8_MAX, 0, 2, U8_MAX, true, true, false},
0034 {U8_MAX, 1, 0, U8_MAX-1, U8_MAX, true, false, false},
0035 {U8_MAX, U8_MAX, U8_MAX-1, 0, 1, true, false, true},
0036
0037 {U8_MAX, U8_MAX-1, U8_MAX-2, 1, 2, true, false, true},
0038 {U8_MAX-1, U8_MAX, U8_MAX-2, U8_MAX, 2, true, true, true},
0039
0040 {1U << 3, 1U << 3, 1U << 4, 0, 1U << 6, false, false, false},
0041 {1U << 4, 1U << 4, 1U << 5, 0, 0, false, false, true},
0042 {1U << 4, 1U << 3, 3*(1U << 3), 1U << 3, 1U << 7, false, false, false},
0043 {1U << 7, 1U << 7, 0, 0, 0, true, false, true},
0044
0045 {48, 32, 80, 16, 0, false, false, true},
0046 {128, 128, 0, 0, 0, true, false, true},
0047 {123, 234, 101, 145, 110, true, true, true},
0048 };
0049 DEFINE_TEST_ARRAY(u16) = {
0050 {0, 0, 0, 0, 0, false, false, false},
0051 {1, 1, 2, 0, 1, false, false, false},
0052 {0, 1, 1, U16_MAX, 0, false, true, false},
0053 {1, 0, 1, 1, 0, false, false, false},
0054 {0, U16_MAX, U16_MAX, 1, 0, false, true, false},
0055 {U16_MAX, 0, U16_MAX, U16_MAX, 0, false, false, false},
0056 {1, U16_MAX, 0, 2, U16_MAX, true, true, false},
0057 {U16_MAX, 1, 0, U16_MAX-1, U16_MAX, true, false, false},
0058 {U16_MAX, U16_MAX, U16_MAX-1, 0, 1, true, false, true},
0059
0060 {U16_MAX, U16_MAX-1, U16_MAX-2, 1, 2, true, false, true},
0061 {U16_MAX-1, U16_MAX, U16_MAX-2, U16_MAX, 2, true, true, true},
0062
0063 {1U << 7, 1U << 7, 1U << 8, 0, 1U << 14, false, false, false},
0064 {1U << 8, 1U << 8, 1U << 9, 0, 0, false, false, true},
0065 {1U << 8, 1U << 7, 3*(1U << 7), 1U << 7, 1U << 15, false, false, false},
0066 {1U << 15, 1U << 15, 0, 0, 0, true, false, true},
0067
0068 {123, 234, 357, 65425, 28782, false, true, false},
0069 {1234, 2345, 3579, 64425, 10146, false, true, true},
0070 };
0071 DEFINE_TEST_ARRAY(u32) = {
0072 {0, 0, 0, 0, 0, false, false, false},
0073 {1, 1, 2, 0, 1, false, false, false},
0074 {0, 1, 1, U32_MAX, 0, false, true, false},
0075 {1, 0, 1, 1, 0, false, false, false},
0076 {0, U32_MAX, U32_MAX, 1, 0, false, true, false},
0077 {U32_MAX, 0, U32_MAX, U32_MAX, 0, false, false, false},
0078 {1, U32_MAX, 0, 2, U32_MAX, true, true, false},
0079 {U32_MAX, 1, 0, U32_MAX-1, U32_MAX, true, false, false},
0080 {U32_MAX, U32_MAX, U32_MAX-1, 0, 1, true, false, true},
0081
0082 {U32_MAX, U32_MAX-1, U32_MAX-2, 1, 2, true, false, true},
0083 {U32_MAX-1, U32_MAX, U32_MAX-2, U32_MAX, 2, true, true, true},
0084
0085 {1U << 15, 1U << 15, 1U << 16, 0, 1U << 30, false, false, false},
0086 {1U << 16, 1U << 16, 1U << 17, 0, 0, false, false, true},
0087 {1U << 16, 1U << 15, 3*(1U << 15), 1U << 15, 1U << 31, false, false, false},
0088 {1U << 31, 1U << 31, 0, 0, 0, true, false, true},
0089
0090 {-2U, 1U, -1U, -3U, -2U, false, false, false},
0091 {-4U, 5U, 1U, -9U, -20U, true, false, true},
0092 };
0093
0094 #if BITS_PER_LONG == 64
0095 DEFINE_TEST_ARRAY(u64) = {
0096 {0, 0, 0, 0, 0, false, false, false},
0097 {1, 1, 2, 0, 1, false, false, false},
0098 {0, 1, 1, U64_MAX, 0, false, true, false},
0099 {1, 0, 1, 1, 0, false, false, false},
0100 {0, U64_MAX, U64_MAX, 1, 0, false, true, false},
0101 {U64_MAX, 0, U64_MAX, U64_MAX, 0, false, false, false},
0102 {1, U64_MAX, 0, 2, U64_MAX, true, true, false},
0103 {U64_MAX, 1, 0, U64_MAX-1, U64_MAX, true, false, false},
0104 {U64_MAX, U64_MAX, U64_MAX-1, 0, 1, true, false, true},
0105
0106 {U64_MAX, U64_MAX-1, U64_MAX-2, 1, 2, true, false, true},
0107 {U64_MAX-1, U64_MAX, U64_MAX-2, U64_MAX, 2, true, true, true},
0108
0109 {1ULL << 31, 1ULL << 31, 1ULL << 32, 0, 1ULL << 62, false, false, false},
0110 {1ULL << 32, 1ULL << 32, 1ULL << 33, 0, 0, false, false, true},
0111 {1ULL << 32, 1ULL << 31, 3*(1ULL << 31), 1ULL << 31, 1ULL << 63, false, false, false},
0112 {1ULL << 63, 1ULL << 63, 0, 0, 0, true, false, true},
0113 {1000000000ULL , 10000000000ULL ,
0114 11000000000ULL, 18446744064709551616ULL, 10000000000000000000ULL,
0115 false, true, false},
0116 {-15ULL, 10ULL, -5ULL, -25ULL, -150ULL, false, false, true},
0117 };
0118 #endif
0119
0120 DEFINE_TEST_ARRAY(s8) = {
0121 {0, 0, 0, 0, 0, false, false, false},
0122
0123 {0, S8_MAX, S8_MAX, -S8_MAX, 0, false, false, false},
0124 {S8_MAX, 0, S8_MAX, S8_MAX, 0, false, false, false},
0125 {0, S8_MIN, S8_MIN, S8_MIN, 0, false, true, false},
0126 {S8_MIN, 0, S8_MIN, S8_MIN, 0, false, false, false},
0127
0128 {-1, S8_MIN, S8_MAX, S8_MAX, S8_MIN, true, false, true},
0129 {S8_MIN, -1, S8_MAX, -S8_MAX, S8_MIN, true, false, true},
0130 {-1, S8_MAX, S8_MAX-1, S8_MIN, -S8_MAX, false, false, false},
0131 {S8_MAX, -1, S8_MAX-1, S8_MIN, -S8_MAX, false, true, false},
0132 {-1, -S8_MAX, S8_MIN, S8_MAX-1, S8_MAX, false, false, false},
0133 {-S8_MAX, -1, S8_MIN, S8_MIN+2, S8_MAX, false, false, false},
0134
0135 {1, S8_MIN, -S8_MAX, -S8_MAX, S8_MIN, false, true, false},
0136 {S8_MIN, 1, -S8_MAX, S8_MAX, S8_MIN, false, true, false},
0137 {1, S8_MAX, S8_MIN, S8_MIN+2, S8_MAX, true, false, false},
0138 {S8_MAX, 1, S8_MIN, S8_MAX-1, S8_MAX, true, false, false},
0139
0140 {S8_MIN, S8_MIN, 0, 0, 0, true, false, true},
0141 {S8_MAX, S8_MAX, -2, 0, 1, true, false, true},
0142
0143 {-4, -32, -36, 28, -128, false, false, true},
0144 {-4, 32, 28, -36, -128, false, false, false},
0145 };
0146
0147 DEFINE_TEST_ARRAY(s16) = {
0148 {0, 0, 0, 0, 0, false, false, false},
0149
0150 {0, S16_MAX, S16_MAX, -S16_MAX, 0, false, false, false},
0151 {S16_MAX, 0, S16_MAX, S16_MAX, 0, false, false, false},
0152 {0, S16_MIN, S16_MIN, S16_MIN, 0, false, true, false},
0153 {S16_MIN, 0, S16_MIN, S16_MIN, 0, false, false, false},
0154
0155 {-1, S16_MIN, S16_MAX, S16_MAX, S16_MIN, true, false, true},
0156 {S16_MIN, -1, S16_MAX, -S16_MAX, S16_MIN, true, false, true},
0157 {-1, S16_MAX, S16_MAX-1, S16_MIN, -S16_MAX, false, false, false},
0158 {S16_MAX, -1, S16_MAX-1, S16_MIN, -S16_MAX, false, true, false},
0159 {-1, -S16_MAX, S16_MIN, S16_MAX-1, S16_MAX, false, false, false},
0160 {-S16_MAX, -1, S16_MIN, S16_MIN+2, S16_MAX, false, false, false},
0161
0162 {1, S16_MIN, -S16_MAX, -S16_MAX, S16_MIN, false, true, false},
0163 {S16_MIN, 1, -S16_MAX, S16_MAX, S16_MIN, false, true, false},
0164 {1, S16_MAX, S16_MIN, S16_MIN+2, S16_MAX, true, false, false},
0165 {S16_MAX, 1, S16_MIN, S16_MAX-1, S16_MAX, true, false, false},
0166
0167 {S16_MIN, S16_MIN, 0, 0, 0, true, false, true},
0168 {S16_MAX, S16_MAX, -2, 0, 1, true, false, true},
0169 };
0170 DEFINE_TEST_ARRAY(s32) = {
0171 {0, 0, 0, 0, 0, false, false, false},
0172
0173 {0, S32_MAX, S32_MAX, -S32_MAX, 0, false, false, false},
0174 {S32_MAX, 0, S32_MAX, S32_MAX, 0, false, false, false},
0175 {0, S32_MIN, S32_MIN, S32_MIN, 0, false, true, false},
0176 {S32_MIN, 0, S32_MIN, S32_MIN, 0, false, false, false},
0177
0178 {-1, S32_MIN, S32_MAX, S32_MAX, S32_MIN, true, false, true},
0179 {S32_MIN, -1, S32_MAX, -S32_MAX, S32_MIN, true, false, true},
0180 {-1, S32_MAX, S32_MAX-1, S32_MIN, -S32_MAX, false, false, false},
0181 {S32_MAX, -1, S32_MAX-1, S32_MIN, -S32_MAX, false, true, false},
0182 {-1, -S32_MAX, S32_MIN, S32_MAX-1, S32_MAX, false, false, false},
0183 {-S32_MAX, -1, S32_MIN, S32_MIN+2, S32_MAX, false, false, false},
0184
0185 {1, S32_MIN, -S32_MAX, -S32_MAX, S32_MIN, false, true, false},
0186 {S32_MIN, 1, -S32_MAX, S32_MAX, S32_MIN, false, true, false},
0187 {1, S32_MAX, S32_MIN, S32_MIN+2, S32_MAX, true, false, false},
0188 {S32_MAX, 1, S32_MIN, S32_MAX-1, S32_MAX, true, false, false},
0189
0190 {S32_MIN, S32_MIN, 0, 0, 0, true, false, true},
0191 {S32_MAX, S32_MAX, -2, 0, 1, true, false, true},
0192 };
0193
0194 #if BITS_PER_LONG == 64
0195 DEFINE_TEST_ARRAY(s64) = {
0196 {0, 0, 0, 0, 0, false, false, false},
0197
0198 {0, S64_MAX, S64_MAX, -S64_MAX, 0, false, false, false},
0199 {S64_MAX, 0, S64_MAX, S64_MAX, 0, false, false, false},
0200 {0, S64_MIN, S64_MIN, S64_MIN, 0, false, true, false},
0201 {S64_MIN, 0, S64_MIN, S64_MIN, 0, false, false, false},
0202
0203 {-1, S64_MIN, S64_MAX, S64_MAX, S64_MIN, true, false, true},
0204 {S64_MIN, -1, S64_MAX, -S64_MAX, S64_MIN, true, false, true},
0205 {-1, S64_MAX, S64_MAX-1, S64_MIN, -S64_MAX, false, false, false},
0206 {S64_MAX, -1, S64_MAX-1, S64_MIN, -S64_MAX, false, true, false},
0207 {-1, -S64_MAX, S64_MIN, S64_MAX-1, S64_MAX, false, false, false},
0208 {-S64_MAX, -1, S64_MIN, S64_MIN+2, S64_MAX, false, false, false},
0209
0210 {1, S64_MIN, -S64_MAX, -S64_MAX, S64_MIN, false, true, false},
0211 {S64_MIN, 1, -S64_MAX, S64_MAX, S64_MIN, false, true, false},
0212 {1, S64_MAX, S64_MIN, S64_MIN+2, S64_MAX, true, false, false},
0213 {S64_MAX, 1, S64_MIN, S64_MAX-1, S64_MAX, true, false, false},
0214
0215 {S64_MIN, S64_MIN, 0, 0, 0, true, false, true},
0216 {S64_MAX, S64_MAX, -2, 0, 1, true, false, true},
0217
0218 {-1, -1, -2, 0, 1, false, false, false},
0219 {-1, -128, -129, 127, 128, false, false, false},
0220 {-128, -1, -129, -127, 128, false, false, false},
0221 {0, -S64_MAX, -S64_MAX, S64_MAX, 0, false, false, false},
0222 };
0223 #endif
0224
0225 #define check_one_op(t, fmt, op, sym, a, b, r, of) do { \
0226 t _r; \
0227 bool _of; \
0228 \
0229 _of = check_ ## op ## _overflow(a, b, &_r); \
0230 KUNIT_EXPECT_EQ_MSG(test, _of, of, \
0231 "expected "fmt" "sym" "fmt" to%s overflow (type %s)\n", \
0232 a, b, of ? "" : " not", #t); \
0233 KUNIT_EXPECT_EQ_MSG(test, _r, r, \
0234 "expected "fmt" "sym" "fmt" == "fmt", got "fmt" (type %s)\n", \
0235 a, b, r, _r, #t); \
0236 } while (0)
0237
0238 #define DEFINE_TEST_FUNC(t, fmt) \
0239 static void do_test_ ## t(struct kunit *test, const struct test_ ## t *p) \
0240 { \
0241 check_one_op(t, fmt, add, "+", p->a, p->b, p->sum, p->s_of); \
0242 check_one_op(t, fmt, add, "+", p->b, p->a, p->sum, p->s_of); \
0243 check_one_op(t, fmt, sub, "-", p->a, p->b, p->diff, p->d_of); \
0244 check_one_op(t, fmt, mul, "*", p->a, p->b, p->prod, p->p_of); \
0245 check_one_op(t, fmt, mul, "*", p->b, p->a, p->prod, p->p_of); \
0246 } \
0247 \
0248 static void t ## _overflow_test(struct kunit *test) { \
0249 unsigned i; \
0250 \
0251 for (i = 0; i < ARRAY_SIZE(t ## _tests); ++i) \
0252 do_test_ ## t(test, &t ## _tests[i]); \
0253 kunit_info(test, "%zu %s arithmetic tests finished\n", \
0254 ARRAY_SIZE(t ## _tests), #t); \
0255 }
0256
0257 DEFINE_TEST_FUNC(u8, "%d");
0258 DEFINE_TEST_FUNC(s8, "%d");
0259 DEFINE_TEST_FUNC(u16, "%d");
0260 DEFINE_TEST_FUNC(s16, "%d");
0261 DEFINE_TEST_FUNC(u32, "%u");
0262 DEFINE_TEST_FUNC(s32, "%d");
0263 #if BITS_PER_LONG == 64
0264 DEFINE_TEST_FUNC(u64, "%llu");
0265 DEFINE_TEST_FUNC(s64, "%lld");
0266 #endif
0267
0268 static void overflow_shift_test(struct kunit *test)
0269 {
0270 int count = 0;
0271
0272
0273 #define TEST_ONE_SHIFT(a, s, t, expect, of) do { \
0274 typeof(a) __a = (a); \
0275 typeof(s) __s = (s); \
0276 t __e = (expect); \
0277 t __d; \
0278 bool __of = check_shl_overflow(__a, __s, &__d); \
0279 if (__of != of) { \
0280 KUNIT_EXPECT_EQ_MSG(test, __of, of, \
0281 "expected (%s)(%s << %s) to%s overflow\n", \
0282 #t, #a, #s, of ? "" : " not"); \
0283 } else if (!__of && __d != __e) { \
0284 KUNIT_EXPECT_EQ_MSG(test, __d, __e, \
0285 "expected (%s)(%s << %s) == %s\n", \
0286 #t, #a, #s, #expect); \
0287 if ((t)-1 < 0) \
0288 kunit_info(test, "got %lld\n", (s64)__d); \
0289 else \
0290 kunit_info(test, "got %llu\n", (u64)__d); \
0291 } \
0292 count++; \
0293 } while (0)
0294
0295
0296 TEST_ONE_SHIFT(1, 0, u8, 1 << 0, false);
0297 TEST_ONE_SHIFT(1, 4, u8, 1 << 4, false);
0298 TEST_ONE_SHIFT(1, 7, u8, 1 << 7, false);
0299 TEST_ONE_SHIFT(0xF, 4, u8, 0xF << 4, false);
0300 TEST_ONE_SHIFT(1, 0, u16, 1 << 0, false);
0301 TEST_ONE_SHIFT(1, 10, u16, 1 << 10, false);
0302 TEST_ONE_SHIFT(1, 15, u16, 1 << 15, false);
0303 TEST_ONE_SHIFT(0xFF, 8, u16, 0xFF << 8, false);
0304 TEST_ONE_SHIFT(1, 0, int, 1 << 0, false);
0305 TEST_ONE_SHIFT(1, 16, int, 1 << 16, false);
0306 TEST_ONE_SHIFT(1, 30, int, 1 << 30, false);
0307 TEST_ONE_SHIFT(1, 0, s32, 1 << 0, false);
0308 TEST_ONE_SHIFT(1, 16, s32, 1 << 16, false);
0309 TEST_ONE_SHIFT(1, 30, s32, 1 << 30, false);
0310 TEST_ONE_SHIFT(1, 0, unsigned int, 1U << 0, false);
0311 TEST_ONE_SHIFT(1, 20, unsigned int, 1U << 20, false);
0312 TEST_ONE_SHIFT(1, 31, unsigned int, 1U << 31, false);
0313 TEST_ONE_SHIFT(0xFFFFU, 16, unsigned int, 0xFFFFU << 16, false);
0314 TEST_ONE_SHIFT(1, 0, u32, 1U << 0, false);
0315 TEST_ONE_SHIFT(1, 20, u32, 1U << 20, false);
0316 TEST_ONE_SHIFT(1, 31, u32, 1U << 31, false);
0317 TEST_ONE_SHIFT(0xFFFFU, 16, u32, 0xFFFFU << 16, false);
0318 TEST_ONE_SHIFT(1, 0, u64, 1ULL << 0, false);
0319 TEST_ONE_SHIFT(1, 40, u64, 1ULL << 40, false);
0320 TEST_ONE_SHIFT(1, 63, u64, 1ULL << 63, false);
0321 TEST_ONE_SHIFT(0xFFFFFFFFULL, 32, u64, 0xFFFFFFFFULL << 32, false);
0322
0323
0324 TEST_ONE_SHIFT(0, 7, u8, 0, false);
0325 TEST_ONE_SHIFT(0, 15, u16, 0, false);
0326 TEST_ONE_SHIFT(0, 31, unsigned int, 0, false);
0327 TEST_ONE_SHIFT(0, 31, u32, 0, false);
0328 TEST_ONE_SHIFT(0, 63, u64, 0, false);
0329
0330
0331 TEST_ONE_SHIFT(0, 6, s8, 0, false);
0332 TEST_ONE_SHIFT(0, 14, s16, 0, false);
0333 TEST_ONE_SHIFT(0, 30, int, 0, false);
0334 TEST_ONE_SHIFT(0, 30, s32, 0, false);
0335 TEST_ONE_SHIFT(0, 62, s64, 0, false);
0336
0337
0338 TEST_ONE_SHIFT(1, 8, u8, 0, true);
0339 TEST_ONE_SHIFT(1, 16, u16, 0, true);
0340 TEST_ONE_SHIFT(1, 32, unsigned int, 0, true);
0341 TEST_ONE_SHIFT(1, 32, u32, 0, true);
0342 TEST_ONE_SHIFT(1, 64, u64, 0, true);
0343
0344
0345 TEST_ONE_SHIFT(1, 7, s8, 0, true);
0346 TEST_ONE_SHIFT(1, 15, s16, 0, true);
0347 TEST_ONE_SHIFT(1, 31, int, 0, true);
0348 TEST_ONE_SHIFT(1, 31, s32, 0, true);
0349 TEST_ONE_SHIFT(1, 63, s64, 0, true);
0350
0351
0352
0353 TEST_ONE_SHIFT(150, 1, u8, 0, true);
0354
0355 TEST_ONE_SHIFT(34966, 1, u16, 0, true);
0356
0357 TEST_ONE_SHIFT(2215151766U, 1, u32, 0, true);
0358 TEST_ONE_SHIFT(2215151766U, 1, unsigned int, 0, true);
0359
0360 TEST_ONE_SHIFT(9372061470395238550ULL, 1, u64, 0, true);
0361
0362
0363
0364 TEST_ONE_SHIFT(75, 1, s8, 0, true);
0365
0366 TEST_ONE_SHIFT(17483, 1, s16, 0, true);
0367
0368 TEST_ONE_SHIFT(1107575883, 1, s32, 0, true);
0369 TEST_ONE_SHIFT(1107575883, 1, int, 0, true);
0370
0371 TEST_ONE_SHIFT(4686030735197619275LL, 1, s64, 0, true);
0372
0373
0374
0375 TEST_ONE_SHIFT(75, 2, s8, 0, true);
0376
0377 TEST_ONE_SHIFT(17483, 2, s16, 0, true);
0378
0379 TEST_ONE_SHIFT(1107575883, 2, s32, 0, true);
0380 TEST_ONE_SHIFT(1107575883, 2, int, 0, true);
0381
0382 TEST_ONE_SHIFT(4686030735197619275LL, 2, s64, 0, true);
0383
0384
0385 TEST_ONE_SHIFT(0x100, 0, u8, 0, true);
0386 TEST_ONE_SHIFT(0xFF, 0, s8, 0, true);
0387 TEST_ONE_SHIFT(0x10000U, 0, u16, 0, true);
0388 TEST_ONE_SHIFT(0xFFFFU, 0, s16, 0, true);
0389 TEST_ONE_SHIFT(0x100000000ULL, 0, u32, 0, true);
0390 TEST_ONE_SHIFT(0x100000000ULL, 0, unsigned int, 0, true);
0391 TEST_ONE_SHIFT(0xFFFFFFFFUL, 0, s32, 0, true);
0392 TEST_ONE_SHIFT(0xFFFFFFFFUL, 0, int, 0, true);
0393 TEST_ONE_SHIFT(0xFFFFFFFFFFFFFFFFULL, 0, s64, 0, true);
0394
0395
0396 TEST_ONE_SHIFT(-1, 0, s8, 0, true);
0397 TEST_ONE_SHIFT(-1, 0, u8, 0, true);
0398 TEST_ONE_SHIFT(-5, 0, s16, 0, true);
0399 TEST_ONE_SHIFT(-5, 0, u16, 0, true);
0400 TEST_ONE_SHIFT(-10, 0, int, 0, true);
0401 TEST_ONE_SHIFT(-10, 0, unsigned int, 0, true);
0402 TEST_ONE_SHIFT(-100, 0, s32, 0, true);
0403 TEST_ONE_SHIFT(-100, 0, u32, 0, true);
0404 TEST_ONE_SHIFT(-10000, 0, s64, 0, true);
0405 TEST_ONE_SHIFT(-10000, 0, u64, 0, true);
0406
0407
0408 TEST_ONE_SHIFT(0, -5, s8, 0, true);
0409 TEST_ONE_SHIFT(0, -5, u8, 0, true);
0410 TEST_ONE_SHIFT(0, -10, s16, 0, true);
0411 TEST_ONE_SHIFT(0, -10, u16, 0, true);
0412 TEST_ONE_SHIFT(0, -15, int, 0, true);
0413 TEST_ONE_SHIFT(0, -15, unsigned int, 0, true);
0414 TEST_ONE_SHIFT(0, -20, s32, 0, true);
0415 TEST_ONE_SHIFT(0, -20, u32, 0, true);
0416 TEST_ONE_SHIFT(0, -30, s64, 0, true);
0417 TEST_ONE_SHIFT(0, -30, u64, 0, true);
0418
0419
0420 TEST_ONE_SHIFT(0, 8, u8, 0, true);
0421 TEST_ONE_SHIFT(0, 9, u8, 0, true);
0422 TEST_ONE_SHIFT(0, 8, s8, 0, true);
0423 TEST_ONE_SHIFT(0, 9, s8, 0, true);
0424 TEST_ONE_SHIFT(0, 16, u16, 0, true);
0425 TEST_ONE_SHIFT(0, 17, u16, 0, true);
0426 TEST_ONE_SHIFT(0, 16, s16, 0, true);
0427 TEST_ONE_SHIFT(0, 17, s16, 0, true);
0428 TEST_ONE_SHIFT(0, 32, u32, 0, true);
0429 TEST_ONE_SHIFT(0, 33, u32, 0, true);
0430 TEST_ONE_SHIFT(0, 32, int, 0, true);
0431 TEST_ONE_SHIFT(0, 33, int, 0, true);
0432 TEST_ONE_SHIFT(0, 32, s32, 0, true);
0433 TEST_ONE_SHIFT(0, 33, s32, 0, true);
0434 TEST_ONE_SHIFT(0, 64, u64, 0, true);
0435 TEST_ONE_SHIFT(0, 65, u64, 0, true);
0436 TEST_ONE_SHIFT(0, 64, s64, 0, true);
0437 TEST_ONE_SHIFT(0, 65, s64, 0, true);
0438
0439
0440
0441
0442
0443
0444
0445
0446
0447
0448 TEST_ONE_SHIFT(0, 7, s8, 0, false);
0449 TEST_ONE_SHIFT(0, 15, s16, 0, false);
0450 TEST_ONE_SHIFT(0, 31, int, 0, false);
0451 TEST_ONE_SHIFT(0, 31, s32, 0, false);
0452 TEST_ONE_SHIFT(0, 63, s64, 0, false);
0453
0454 kunit_info(test, "%d shift tests finished\n", count);
0455 #undef TEST_ONE_SHIFT
0456 }
0457
0458
0459
0460
0461
0462 #define alloc_GFP (GFP_KERNEL | __GFP_NOWARN)
0463 #define alloc010(alloc, arg, sz) alloc(sz, alloc_GFP)
0464 #define alloc011(alloc, arg, sz) alloc(sz, alloc_GFP, NUMA_NO_NODE)
0465 #define alloc000(alloc, arg, sz) alloc(sz)
0466 #define alloc001(alloc, arg, sz) alloc(sz, NUMA_NO_NODE)
0467 #define alloc110(alloc, arg, sz) alloc(arg, sz, alloc_GFP)
0468 #define free0(free, arg, ptr) free(ptr)
0469 #define free1(free, arg, ptr) free(arg, ptr)
0470
0471
0472 #define TEST_SIZE (5 * 4096)
0473
0474 #define DEFINE_TEST_ALLOC(func, free_func, want_arg, want_gfp, want_node)\
0475 static void test_ ## func (struct kunit *test, void *arg) \
0476 { \
0477 volatile size_t a = TEST_SIZE; \
0478 volatile size_t b = (SIZE_MAX / TEST_SIZE) + 1; \
0479 void *ptr; \
0480 \
0481 \
0482 ptr = alloc ## want_arg ## want_gfp ## want_node (func, arg, 1);\
0483 KUNIT_ASSERT_NOT_ERR_OR_NULL_MSG(test, ptr, \
0484 #func " failed regular allocation?!\n"); \
0485 free ## want_arg (free_func, arg, ptr); \
0486 \
0487 \
0488 ptr = alloc ## want_arg ## want_gfp ## want_node (func, arg, \
0489 a * b); \
0490 KUNIT_ASSERT_NOT_ERR_OR_NULL_MSG(test, ptr, \
0491 #func " unexpectedly failed bad wrapping?!\n"); \
0492 free ## want_arg (free_func, arg, ptr); \
0493 \
0494 \
0495 ptr = alloc ## want_arg ## want_gfp ## want_node (func, arg, \
0496 array_size(a, b)); \
0497 if (ptr) { \
0498 KUNIT_FAIL(test, #func " missed saturation!\n"); \
0499 free ## want_arg (free_func, arg, ptr); \
0500 } \
0501 }
0502
0503
0504
0505
0506
0507
0508
0509 DEFINE_TEST_ALLOC(kmalloc, kfree, 0, 1, 0);
0510 DEFINE_TEST_ALLOC(kmalloc_node, kfree, 0, 1, 1);
0511 DEFINE_TEST_ALLOC(kzalloc, kfree, 0, 1, 0);
0512 DEFINE_TEST_ALLOC(kzalloc_node, kfree, 0, 1, 1);
0513 DEFINE_TEST_ALLOC(__vmalloc, vfree, 0, 1, 0);
0514 DEFINE_TEST_ALLOC(kvmalloc, kvfree, 0, 1, 0);
0515 DEFINE_TEST_ALLOC(kvmalloc_node, kvfree, 0, 1, 1);
0516 DEFINE_TEST_ALLOC(kvzalloc, kvfree, 0, 1, 0);
0517 DEFINE_TEST_ALLOC(kvzalloc_node, kvfree, 0, 1, 1);
0518 DEFINE_TEST_ALLOC(devm_kmalloc, devm_kfree, 1, 1, 0);
0519 DEFINE_TEST_ALLOC(devm_kzalloc, devm_kfree, 1, 1, 0);
0520
0521 static void overflow_allocation_test(struct kunit *test)
0522 {
0523 const char device_name[] = "overflow-test";
0524 struct device *dev;
0525 int count = 0;
0526
0527 #define check_allocation_overflow(alloc) do { \
0528 count++; \
0529 test_ ## alloc(test, dev); \
0530 } while (0)
0531
0532
0533 dev = root_device_register(device_name);
0534 KUNIT_ASSERT_FALSE_MSG(test, IS_ERR(dev),
0535 "Cannot register test device\n");
0536
0537 check_allocation_overflow(kmalloc);
0538 check_allocation_overflow(kmalloc_node);
0539 check_allocation_overflow(kzalloc);
0540 check_allocation_overflow(kzalloc_node);
0541 check_allocation_overflow(__vmalloc);
0542 check_allocation_overflow(kvmalloc);
0543 check_allocation_overflow(kvmalloc_node);
0544 check_allocation_overflow(kvzalloc);
0545 check_allocation_overflow(kvzalloc_node);
0546 check_allocation_overflow(devm_kmalloc);
0547 check_allocation_overflow(devm_kzalloc);
0548
0549 device_unregister(dev);
0550
0551 kunit_info(test, "%d allocation overflow tests finished\n", count);
0552 #undef check_allocation_overflow
0553 }
0554
0555 struct __test_flex_array {
0556 unsigned long flags;
0557 size_t count;
0558 unsigned long data[];
0559 };
0560
0561 static void overflow_size_helpers_test(struct kunit *test)
0562 {
0563
0564 u8 ce_array[struct_size((struct __test_flex_array *)0, data, 55)];
0565 struct __test_flex_array *obj;
0566 int count = 0;
0567 int var;
0568 volatile int unconst = 0;
0569
0570
0571 var = 55;
0572 OPTIMIZER_HIDE_VAR(var);
0573 KUNIT_EXPECT_EQ(test, sizeof(ce_array), struct_size(obj, data, var));
0574
0575 #define check_one_size_helper(expected, func, args...) do { \
0576 size_t _r = func(args); \
0577 KUNIT_EXPECT_EQ_MSG(test, _r, expected, \
0578 "expected " #func "(" #args ") to return %zu but got %zu instead\n", \
0579 (size_t)(expected), _r); \
0580 count++; \
0581 } while (0)
0582
0583 var = 4;
0584 check_one_size_helper(20, size_mul, var++, 5);
0585 check_one_size_helper(20, size_mul, 4, var++);
0586 check_one_size_helper(0, size_mul, 0, 3);
0587 check_one_size_helper(0, size_mul, 3, 0);
0588 check_one_size_helper(6, size_mul, 2, 3);
0589 check_one_size_helper(SIZE_MAX, size_mul, SIZE_MAX, 1);
0590 check_one_size_helper(SIZE_MAX, size_mul, SIZE_MAX, 3);
0591 check_one_size_helper(SIZE_MAX, size_mul, SIZE_MAX, -3);
0592
0593 var = 4;
0594 check_one_size_helper(9, size_add, var++, 5);
0595 check_one_size_helper(9, size_add, 4, var++);
0596 check_one_size_helper(9, size_add, 9, 0);
0597 check_one_size_helper(9, size_add, 0, 9);
0598 check_one_size_helper(5, size_add, 2, 3);
0599 check_one_size_helper(SIZE_MAX, size_add, SIZE_MAX, 1);
0600 check_one_size_helper(SIZE_MAX, size_add, SIZE_MAX, 3);
0601 check_one_size_helper(SIZE_MAX, size_add, SIZE_MAX, -3);
0602
0603 var = 4;
0604 check_one_size_helper(1, size_sub, var--, 3);
0605 check_one_size_helper(1, size_sub, 4, var--);
0606 check_one_size_helper(1, size_sub, 3, 2);
0607 check_one_size_helper(9, size_sub, 9, 0);
0608 check_one_size_helper(SIZE_MAX, size_sub, 9, -3);
0609 check_one_size_helper(SIZE_MAX, size_sub, 0, 9);
0610 check_one_size_helper(SIZE_MAX, size_sub, 2, 3);
0611 check_one_size_helper(SIZE_MAX, size_sub, SIZE_MAX, 0);
0612 check_one_size_helper(SIZE_MAX, size_sub, SIZE_MAX, 10);
0613 check_one_size_helper(SIZE_MAX, size_sub, 0, SIZE_MAX);
0614 check_one_size_helper(SIZE_MAX, size_sub, 14, SIZE_MAX);
0615 check_one_size_helper(SIZE_MAX - 2, size_sub, SIZE_MAX - 1, 1);
0616 check_one_size_helper(SIZE_MAX - 4, size_sub, SIZE_MAX - 1, 3);
0617 check_one_size_helper(1, size_sub, SIZE_MAX - 1, -3);
0618
0619 var = 4;
0620 check_one_size_helper(4 * sizeof(*obj->data),
0621 flex_array_size, obj, data, var++);
0622 check_one_size_helper(5 * sizeof(*obj->data),
0623 flex_array_size, obj, data, var++);
0624 check_one_size_helper(0, flex_array_size, obj, data, 0 + unconst);
0625 check_one_size_helper(sizeof(*obj->data),
0626 flex_array_size, obj, data, 1 + unconst);
0627 check_one_size_helper(7 * sizeof(*obj->data),
0628 flex_array_size, obj, data, 7 + unconst);
0629 check_one_size_helper(SIZE_MAX,
0630 flex_array_size, obj, data, -1 + unconst);
0631 check_one_size_helper(SIZE_MAX,
0632 flex_array_size, obj, data, SIZE_MAX - 4 + unconst);
0633
0634 var = 4;
0635 check_one_size_helper(sizeof(*obj) + (4 * sizeof(*obj->data)),
0636 struct_size, obj, data, var++);
0637 check_one_size_helper(sizeof(*obj) + (5 * sizeof(*obj->data)),
0638 struct_size, obj, data, var++);
0639 check_one_size_helper(sizeof(*obj), struct_size, obj, data, 0 + unconst);
0640 check_one_size_helper(sizeof(*obj) + sizeof(*obj->data),
0641 struct_size, obj, data, 1 + unconst);
0642 check_one_size_helper(SIZE_MAX,
0643 struct_size, obj, data, -3 + unconst);
0644 check_one_size_helper(SIZE_MAX,
0645 struct_size, obj, data, SIZE_MAX - 3 + unconst);
0646
0647 kunit_info(test, "%d overflow size helper tests finished\n", count);
0648 #undef check_one_size_helper
0649 }
0650
0651 static struct kunit_case overflow_test_cases[] = {
0652 KUNIT_CASE(u8_overflow_test),
0653 KUNIT_CASE(s8_overflow_test),
0654 KUNIT_CASE(u16_overflow_test),
0655 KUNIT_CASE(s16_overflow_test),
0656 KUNIT_CASE(u32_overflow_test),
0657 KUNIT_CASE(s32_overflow_test),
0658
0659 #if BITS_PER_LONG == 64
0660 KUNIT_CASE(u64_overflow_test),
0661 KUNIT_CASE(s64_overflow_test),
0662 #endif
0663 KUNIT_CASE(overflow_shift_test),
0664 KUNIT_CASE(overflow_allocation_test),
0665 KUNIT_CASE(overflow_size_helpers_test),
0666 {}
0667 };
0668
0669 static struct kunit_suite overflow_test_suite = {
0670 .name = "overflow",
0671 .test_cases = overflow_test_cases,
0672 };
0673
0674 kunit_test_suite(overflow_test_suite);
0675
0676 MODULE_LICENSE("Dual MIT/GPL");