/*
 * Copyright 2006, Red Hat, Inc., Dave Jones
 * Released under the General Public License (GPL).
 *
 * This file contains the linked list validation for DEBUG_LIST.
 */

#include <linux/export.h>
#include <linux/list.h>
#include <linux/bug.h>
#include <linux/kernel.h>
#include <linux/rculist.h>

/*
 * Check that the data structures for the list manipulations are reasonably
 * valid. Failures here indicate memory corruption (and possibly an exploit
 * attempt).
 */

bool __list_add_valid(struct list_head *new, struct list_head *prev,
		      struct list_head *next)
{
	CHECK_DATA_CORRUPTION(next->prev != prev,
		"list_add corruption. next->prev should be prev (%p), but was %p. (next=%p).\n",
		prev, next->prev, next);
	CHECK_DATA_CORRUPTION(prev->next != next,
		"list_add corruption. prev->next should be next (%p), but was %p. (prev=%p).\n",
		next, prev->next, prev);
	CHECK_DATA_CORRUPTION(new == prev || new == next,
		"list_add double add: new=%p, prev=%p, next=%p.\n",
		new, prev, next);

	return true;
}
EXPORT_SYMBOL(__list_add_valid);

bool __list_del_entry_valid(struct list_head *entry)
{
	struct list_head *prev, *next;

	prev = entry->prev;
	next = entry->next;

	CHECK_DATA_CORRUPTION(next == LIST_POISON1,
		"list_del corruption, %p->next is LIST_POISON1 (%p)\n",
		entry, LIST_POISON1);
	CHECK_DATA_CORRUPTION(prev == LIST_POISON2,
		"list_del corruption, %p->prev is LIST_POISON2 (%p)\n",
		entry, LIST_POISON2);
	CHECK_DATA_CORRUPTION(prev->next != entry,
		"list_del corruption. prev->next should be %p, but was %p\n",
		entry, prev->next);
	CHECK_DATA_CORRUPTION(next->prev != entry,
		"list_del corruption. next->prev should be %p, but was %p\n",
		entry, next->prev);
	return true;

}
EXPORT_SYMBOL(__list_del_entry_valid);
 href='/cgit.cgi/linux/net-next.git/tree/tools/build/feature/test-libunwind.c?id=966d2b04e070bc040319aaebfec09e0144dc3341'>tree</a><a href='/cgit.cgi/linux/net-next.git/commit/tools/build/feature/test-libunwind.c?id=966d2b04e070bc040319aaebfec09e0144dc3341'>commit</a><a class='active' href='/cgit.cgi/linux/net-next.git/diff/tools/build/feature/test-libunwind.c?id=966d2b04e070bc040319aaebfec09e0144dc3341'>diff</a></td><td class='form'><form class='right' method='get' action='/cgit.cgi/linux/net-next.git/log/tools/build/feature/test-libunwind.c'>
<input type='hidden' name='id' value='966d2b04e070bc040319aaebfec09e0144dc3341'/><select name='qt'>
<option value='grep'>log msg</option>
<option value='author'>author</option>
<option value='committer'>committer</option>
<option value='range'>range</option>
</select>
<input class='txt' type='search' size='10' name='q' value=''/>
<input type='submit' value='search'/>
</form>
</td></tr></table>
<div class='path'>path: <a href='/cgit.cgi/linux/net-next.git/diff/?id=966d2b04e070bc040319aaebfec09e0144dc3341'>root</a>/<a href='/cgit.cgi/linux/net-next.git/diff/tools?id=966d2b04e070bc040319aaebfec09e0144dc3341'>tools</a>/<a href='/cgit.cgi/linux/net-next.git/diff/tools/build?id=966d2b04e070bc040319aaebfec09e0144dc3341'>build</a>/<a href='/cgit.cgi/linux/net-next.git/diff/tools/build/feature?id=966d2b04e070bc040319aaebfec09e0144dc3341'>feature</a>/<a href='/cgit.cgi/linux/net-next.git/diff/tools/build/feature/test-libunwind.c?id=966d2b04e070bc040319aaebfec09e0144dc3341'>test-libunwind.c</a></div><div class='content'><div class='cgit-panel'><b>diff options</b><form method='get'><input type='hidden' name='id' value='966d2b04e070bc040319aaebfec09e0144dc3341'/><table><tr><td colspan='2'/></tr><tr><td class='label'>context:</td><td class='ctrl'><select name='context' onchange='this.form.submit();'><option value='1'>1</option><option value='2'>2</option><option value='3' selected='selected'>3</option><option value='4'>4</option><option value='5'>5</option><option value='6'>6</option><option value='7'>7</option><option value='8'>8</option><option value='9'>9</option><option value='10'>10</option><option value='15'>15</option><option value='20'>20</option><option value='25'>25</option><option value='30'>30</option><option value='35'>35</option><option value='40'>40</option></select></td></tr><tr><td class='label'>space:</td><td class='ctrl'><select name='ignorews' onchange='this.form.submit();'><option value='0' selected='selected'>include</option><option value='1'>ignore</option></select></td></tr><tr><td class='label'>mode:</td><td class='ctrl'><select name='dt' onchange='this.form.submit();'><option value='0' selected='selected'>unified</option><option value='1'>ssdiff</option><option value='2'>stat only</option></select></td></tr><tr><td/><td class='ctrl'><noscript><input type='submit' value='reload'/></noscript></td></tr></table></form></div><div class='diffstat-header'><a href='/cgit.cgi/linux/net-next.git/diff/?id=966d2b04e070bc040319aaebfec09e0144dc3341'>Diffstat</a> (limited to 'tools/build/feature/test-libunwind.c')</div><table summary='diffstat' class='diffstat'>