|
@@ -1053,24 +1053,25 @@ static noinline int free_debug_processing(
|
|
|
void *object = head;
|
|
|
int cnt = 0;
|
|
|
unsigned long uninitialized_var(flags);
|
|
|
+ int ret = 0;
|
|
|
|
|
|
spin_lock_irqsave(&n->list_lock, flags);
|
|
|
slab_lock(page);
|
|
|
|
|
|
if (!check_slab(s, page))
|
|
|
- goto fail;
|
|
|
+ goto out;
|
|
|
|
|
|
next_object:
|
|
|
cnt++;
|
|
|
|
|
|
if (!check_valid_pointer(s, page, object)) {
|
|
|
slab_err(s, page, "Invalid object pointer 0x%p", object);
|
|
|
- goto fail;
|
|
|
+ goto out;
|
|
|
}
|
|
|
|
|
|
if (on_freelist(s, page, object)) {
|
|
|
object_err(s, page, object, "Object already free");
|
|
|
- goto fail;
|
|
|
+ goto out;
|
|
|
}
|
|
|
|
|
|
if (!check_object(s, page, object, SLUB_RED_ACTIVE))
|
|
@@ -1087,7 +1088,7 @@ next_object:
|
|
|
} else
|
|
|
object_err(s, page, object,
|
|
|
"page slab pointer corrupt.");
|
|
|
- goto fail;
|
|
|
+ goto out;
|
|
|
}
|
|
|
|
|
|
if (s->flags & SLAB_STORE_USER)
|
|
@@ -1101,6 +1102,8 @@ next_object:
|
|
|
object = get_freepointer(s, object);
|
|
|
goto next_object;
|
|
|
}
|
|
|
+ ret = 1;
|
|
|
+
|
|
|
out:
|
|
|
if (cnt != bulk_cnt)
|
|
|
slab_err(s, page, "Bulk freelist count(%d) invalid(%d)\n",
|
|
@@ -1108,13 +1111,9 @@ out:
|
|
|
|
|
|
slab_unlock(page);
|
|
|
spin_unlock_irqrestore(&n->list_lock, flags);
|
|
|
- return 1;
|
|
|
-
|
|
|
-fail:
|
|
|
- slab_unlock(page);
|
|
|
- spin_unlock_irqrestore(&n->list_lock, flags);
|
|
|
- slab_fix(s, "Object at 0x%p not freed", object);
|
|
|
- return 0;
|
|
|
+ if (!ret)
|
|
|
+ slab_fix(s, "Object at 0x%p not freed", object);
|
|
|
+ return ret;
|
|
|
}
|
|
|
|
|
|
static int __init setup_slub_debug(char *str)
|