list_debug.c (b16c42c8fde808b4f047d94f1f2aeda93487670d) | list_debug.c (aebc7b0d8d91bbc69e976909963046bc48bca4fd) |
---|---|
1/* 2 * Copyright 2006, Red Hat, Inc., Dave Jones 3 * Released under the General Public License (GPL). 4 * | 1/* 2 * Copyright 2006, Red Hat, Inc., Dave Jones 3 * Released under the General Public License (GPL). 4 * |
5 * This file contains the linked list validation for DEBUG_LIST. | 5 * This file contains the linked list validation and error reporting for 6 * LIST_HARDENED and DEBUG_LIST. |
6 */ 7 8#include <linux/export.h> 9#include <linux/list.h> 10#include <linux/bug.h> 11#include <linux/kernel.h> 12#include <linux/rculist.h> 13 14/* 15 * Check that the data structures for the list manipulations are reasonably 16 * valid. Failures here indicate memory corruption (and possibly an exploit 17 * attempt). 18 */ 19 | 7 */ 8 9#include <linux/export.h> 10#include <linux/list.h> 11#include <linux/bug.h> 12#include <linux/kernel.h> 13#include <linux/rculist.h> 14 15/* 16 * Check that the data structures for the list manipulations are reasonably 17 * valid. Failures here indicate memory corruption (and possibly an exploit 18 * attempt). 19 */ 20 |
21__list_valid_slowpath |
|
20bool __list_add_valid_or_report(struct list_head *new, struct list_head *prev, 21 struct list_head *next) 22{ 23 if (CHECK_DATA_CORRUPTION(prev == NULL, 24 "list_add corruption. prev is NULL.\n") || 25 CHECK_DATA_CORRUPTION(next == NULL, 26 "list_add corruption. next is NULL.\n") || 27 CHECK_DATA_CORRUPTION(next->prev != prev, --- 6 unchanged lines hidden (view full) --- 34 "list_add double add: new=%px, prev=%px, next=%px.\n", 35 new, prev, next)) 36 return false; 37 38 return true; 39} 40EXPORT_SYMBOL(__list_add_valid_or_report); 41 | 22bool __list_add_valid_or_report(struct list_head *new, struct list_head *prev, 23 struct list_head *next) 24{ 25 if (CHECK_DATA_CORRUPTION(prev == NULL, 26 "list_add corruption. prev is NULL.\n") || 27 CHECK_DATA_CORRUPTION(next == NULL, 28 "list_add corruption. next is NULL.\n") || 29 CHECK_DATA_CORRUPTION(next->prev != prev, --- 6 unchanged lines hidden (view full) --- 36 "list_add double add: new=%px, prev=%px, next=%px.\n", 37 new, prev, next)) 38 return false; 39 40 return true; 41} 42EXPORT_SYMBOL(__list_add_valid_or_report); 43 |
44__list_valid_slowpath |
|
42bool __list_del_entry_valid_or_report(struct list_head *entry) 43{ 44 struct list_head *prev, *next; 45 46 prev = entry->prev; 47 next = entry->next; 48 49 if (CHECK_DATA_CORRUPTION(next == NULL, --- 20 unchanged lines hidden --- | 45bool __list_del_entry_valid_or_report(struct list_head *entry) 46{ 47 struct list_head *prev, *next; 48 49 prev = entry->prev; 50 next = entry->next; 51 52 if (CHECK_DATA_CORRUPTION(next == NULL, --- 20 unchanged lines hidden --- |