mac80211: correct legacy rates check in ieee80211_calc_rx_airtime
[platform/kernel/linux-rpi.git] / lib / test_overflow.c
index 7a4b6f6..7a5a573 100644 (file)
@@ -588,12 +588,110 @@ static int __init test_overflow_allocation(void)
        return err;
 }
 
+struct __test_flex_array {
+       unsigned long flags;
+       size_t count;
+       unsigned long data[];
+};
+
+static int __init test_overflow_size_helpers(void)
+{
+       struct __test_flex_array *obj;
+       int count = 0;
+       int err = 0;
+       int var;
+
+#define check_one_size_helper(expected, func, args...) ({      \
+       bool __failure = false;                                 \
+       size_t _r;                                              \
+                                                               \
+       _r = func(args);                                        \
+       if (_r != (expected)) {                                 \
+               pr_warn("expected " #func "(" #args ") "        \
+                       "to return %zu but got %zu instead\n",  \
+                       (size_t)(expected), _r);                \
+               __failure = true;                               \
+       }                                                       \
+       count++;                                                \
+       __failure;                                              \
+})
+
+       var = 4;
+       err |= check_one_size_helper(20,       size_mul, var++, 5);
+       err |= check_one_size_helper(20,       size_mul, 4, var++);
+       err |= check_one_size_helper(0,        size_mul, 0, 3);
+       err |= check_one_size_helper(0,        size_mul, 3, 0);
+       err |= check_one_size_helper(6,        size_mul, 2, 3);
+       err |= check_one_size_helper(SIZE_MAX, size_mul, SIZE_MAX,  1);
+       err |= check_one_size_helper(SIZE_MAX, size_mul, SIZE_MAX,  3);
+       err |= check_one_size_helper(SIZE_MAX, size_mul, SIZE_MAX, -3);
+
+       var = 4;
+       err |= check_one_size_helper(9,        size_add, var++, 5);
+       err |= check_one_size_helper(9,        size_add, 4, var++);
+       err |= check_one_size_helper(9,        size_add, 9, 0);
+       err |= check_one_size_helper(9,        size_add, 0, 9);
+       err |= check_one_size_helper(5,        size_add, 2, 3);
+       err |= check_one_size_helper(SIZE_MAX, size_add, SIZE_MAX,  1);
+       err |= check_one_size_helper(SIZE_MAX, size_add, SIZE_MAX,  3);
+       err |= check_one_size_helper(SIZE_MAX, size_add, SIZE_MAX, -3);
+
+       var = 4;
+       err |= check_one_size_helper(1,        size_sub, var--, 3);
+       err |= check_one_size_helper(1,        size_sub, 4, var--);
+       err |= check_one_size_helper(1,        size_sub, 3, 2);
+       err |= check_one_size_helper(9,        size_sub, 9, 0);
+       err |= check_one_size_helper(SIZE_MAX, size_sub, 9, -3);
+       err |= check_one_size_helper(SIZE_MAX, size_sub, 0, 9);
+       err |= check_one_size_helper(SIZE_MAX, size_sub, 2, 3);
+       err |= check_one_size_helper(SIZE_MAX, size_sub, SIZE_MAX,  0);
+       err |= check_one_size_helper(SIZE_MAX, size_sub, SIZE_MAX, 10);
+       err |= check_one_size_helper(SIZE_MAX, size_sub, 0,  SIZE_MAX);
+       err |= check_one_size_helper(SIZE_MAX, size_sub, 14, SIZE_MAX);
+       err |= check_one_size_helper(SIZE_MAX - 2, size_sub, SIZE_MAX - 1,  1);
+       err |= check_one_size_helper(SIZE_MAX - 4, size_sub, SIZE_MAX - 1,  3);
+       err |= check_one_size_helper(1,         size_sub, SIZE_MAX - 1, -3);
+
+       var = 4;
+       err |= check_one_size_helper(4 * sizeof(*obj->data),
+                                    flex_array_size, obj, data, var++);
+       err |= check_one_size_helper(5 * sizeof(*obj->data),
+                                    flex_array_size, obj, data, var++);
+       err |= check_one_size_helper(0, flex_array_size, obj, data, 0);
+       err |= check_one_size_helper(sizeof(*obj->data),
+                                    flex_array_size, obj, data, 1);
+       err |= check_one_size_helper(7 * sizeof(*obj->data),
+                                    flex_array_size, obj, data, 7);
+       err |= check_one_size_helper(SIZE_MAX,
+                                    flex_array_size, obj, data, -1);
+       err |= check_one_size_helper(SIZE_MAX,
+                                    flex_array_size, obj, data, SIZE_MAX - 4);
+
+       var = 4;
+       err |= check_one_size_helper(sizeof(*obj) + (4 * sizeof(*obj->data)),
+                                    struct_size, obj, data, var++);
+       err |= check_one_size_helper(sizeof(*obj) + (5 * sizeof(*obj->data)),
+                                    struct_size, obj, data, var++);
+       err |= check_one_size_helper(sizeof(*obj), struct_size, obj, data, 0);
+       err |= check_one_size_helper(sizeof(*obj) + sizeof(*obj->data),
+                                    struct_size, obj, data, 1);
+       err |= check_one_size_helper(SIZE_MAX,
+                                    struct_size, obj, data, -3);
+       err |= check_one_size_helper(SIZE_MAX,
+                                    struct_size, obj, data, SIZE_MAX - 3);
+
+       pr_info("%d overflow size helper tests finished\n", count);
+
+       return err;
+}
+
 static int __init test_module_init(void)
 {
        int err = 0;
 
        err |= test_overflow_calculation();
        err |= test_overflow_shift();
+       err |= test_overflow_size_helpers();
        err |= test_overflow_allocation();
 
        if (err) {