Example #1
0
static void
test_size_mul(void)
{
    const size_t half_size = SIZE_MAX / 2;
    const size_t half_double_size = (SIZE_MAX % 2) ? (SIZE_MAX - 1) : SIZE_MAX;
    size_t out;

    ASSERT(sol_util_size_mul(half_size, 2, &out) == 0);
    ASSERT_INT_EQ(out, half_double_size);

    ASSERT_INT_EQ(sol_util_size_mul(half_size, 4, &out), -EOVERFLOW);
}
Example #2
0
static int
sol_vector_grow(struct sol_vector *v, uint16_t amount)
{
    size_t new_cap, old_cap;
    uint16_t new_len;

    if (v->len > UINT16_MAX - amount)
        return -EOVERFLOW;

    new_len = v->len + amount;
    old_cap = align_power2(v->len);
    new_cap = align_power2(new_len);

    if (new_cap != old_cap) {
        void *data;
        int r;
        size_t data_size;

        r = sol_util_size_mul(v->elem_size, new_cap, &data_size);
        SOL_INT_CHECK(r, < 0, r);

        data = realloc(v->data, data_size);
        if (!data)
            return -ENOMEM;
        v->data = data;
    }