++ uaf_printk("UAF: to free 0x%p/%d\n", addr, size);
++
++ /* calculate placement in bitmap */
++ i = (unsigned) addr - (unsigned) uaf_area->addr;
++ UAF_ASSERT(i >= 0);
++ i = i / PAGE_SIZE;
++
++ /* check against double-free */
++ spin_lock_irqsave(&uaf_lock, flags);
++ for (j = 0; j < size; j++) {
++ /* now check is correspondend bit set */
++ unsigned long address;
++ UAF_ASSERT(i+j >= 0 && i+j < uaf_max);
++ BUG_ON(!test_bit(i+j, uaf_bitmap));
++
++ address = ((unsigned long) addr) + (PAGE_SIZE * j);
++ pages[j] = vmalloc_to_page((void *) address);
++ BUG_ON(pages[j] == NULL);
++
++ /* now free space in UAF */
++ clear_bit(i+j, uaf_bitmap);
++ uaf_used--;
++ }
++ spin_unlock_irqrestore(&uaf_lock, flags);
++
++ /* check poison bytes */