2006-09-29 01:59:00 -07:00
/*
* Copyright 2006 , Red Hat , Inc . , Dave Jones
* Released under the General Public License ( GPL ) .
*
2016-08-17 14:42:08 -07:00
* This file contains the linked list validation for DEBUG_LIST .
2006-09-29 01:59:00 -07:00
*/
2011-11-16 21:29:17 -05:00
# include <linux/export.h>
2006-09-29 01:59:00 -07:00
# include <linux/list.h>
2012-01-20 18:35:53 -05:00
# include <linux/bug.h>
2012-01-20 18:46:49 -05:00
# include <linux/kernel.h>
2012-03-14 22:17:39 -04:00
# include <linux/rculist.h>
2006-09-29 01:59:00 -07:00
/*
2016-08-17 14:42:08 -07:00
* Check that the data structures for the list manipulations are reasonably
* valid . Failures here indicate memory corruption ( and possibly an exploit
* attempt ) .
2006-09-29 01:59:00 -07:00
*/
2016-08-17 14:42:08 -07:00
bool __list_add_valid ( struct list_head * new , struct list_head * prev ,
struct list_head * next )
2006-09-29 01:59:00 -07:00
{
2017-02-24 15:00:38 -08:00
if ( CHECK_DATA_CORRUPTION ( next - > prev ! = prev ,
2018-04-10 16:33:06 -07:00
" list_add corruption. next->prev should be prev (%px), but was %px. (next=%px). \n " ,
2017-02-24 15:00:38 -08:00
prev , next - > prev , next ) | |
CHECK_DATA_CORRUPTION ( prev - > next ! = next ,
2018-04-10 16:33:06 -07:00
" list_add corruption. prev->next should be next (%px), but was %px. (prev=%px). \n " ,
2017-02-24 15:00:38 -08:00
next , prev - > next , prev ) | |
CHECK_DATA_CORRUPTION ( new = = prev | | new = = next ,
2018-04-10 16:33:06 -07:00
" list_add double add: new=%px, prev=%px, next=%px. \n " ,
2017-02-24 15:00:38 -08:00
new , prev , next ) )
return false ;
2016-08-17 14:42:11 -07:00
2016-08-17 14:42:08 -07:00
return true ;
2006-09-29 01:59:00 -07:00
}
2016-08-17 14:42:08 -07:00
EXPORT_SYMBOL ( __list_add_valid ) ;
2006-09-29 01:59:00 -07:00
2016-08-17 14:42:10 -07:00
bool __list_del_entry_valid ( struct list_head * entry )
2011-02-18 11:32:28 -08:00
{
struct list_head * prev , * next ;
prev = entry - > prev ;
next = entry - > next ;
2017-02-24 15:00:38 -08:00
if ( CHECK_DATA_CORRUPTION ( next = = LIST_POISON1 ,
2018-04-10 16:33:06 -07:00
" list_del corruption, %px->next is LIST_POISON1 (%px) \n " ,
2017-02-24 15:00:38 -08:00
entry , LIST_POISON1 ) | |
CHECK_DATA_CORRUPTION ( prev = = LIST_POISON2 ,
2018-04-10 16:33:06 -07:00
" list_del corruption, %px->prev is LIST_POISON2 (%px) \n " ,
2017-02-24 15:00:38 -08:00
entry , LIST_POISON2 ) | |
CHECK_DATA_CORRUPTION ( prev - > next ! = entry ,
2018-04-10 16:33:06 -07:00
" list_del corruption. prev->next should be %px, but was %px \n " ,
2017-02-24 15:00:38 -08:00
entry , prev - > next ) | |
CHECK_DATA_CORRUPTION ( next - > prev ! = entry ,
2018-04-10 16:33:06 -07:00
" list_del corruption. next->prev should be %px, but was %px \n " ,
2017-02-24 15:00:38 -08:00
entry , next - > prev ) )
return false ;
2016-08-17 14:42:10 -07:00
return true ;
2011-02-18 11:32:28 -08:00
2006-09-29 01:59:00 -07:00
}
2016-08-17 14:42:10 -07:00
EXPORT_SYMBOL ( __list_del_entry_valid ) ;