list_debug.c 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  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.
  6. */
  7. #include <linux/export.h>
  8. #include <linux/list.h>
  9. #include <linux/bug.h>
  10. #include <linux/kernel.h>
  11. #include <linux/rculist.h>
  12. /*
  13. * Check that the data structures for the list manipulations are reasonably
  14. * valid. Failures here indicate memory corruption (and possibly an exploit
  15. * attempt).
  16. */
  17. bool __list_add_valid(struct list_head *new, struct list_head *prev,
  18. struct list_head *next)
  19. {
  20. CHECK_DATA_CORRUPTION(next->prev != prev,
  21. "list_add corruption. next->prev should be prev (%p), but was %p. (next=%p).\n",
  22. prev, next->prev, next);
  23. CHECK_DATA_CORRUPTION(prev->next != next,
  24. "list_add corruption. prev->next should be next (%p), but was %p. (prev=%p).\n",
  25. next, prev->next, prev);
  26. CHECK_DATA_CORRUPTION(new == prev || new == next,
  27. "list_add double add: new=%p, prev=%p, next=%p.\n",
  28. new, prev, next);
  29. return true;
  30. }
  31. EXPORT_SYMBOL(__list_add_valid);
  32. bool __list_del_entry_valid(struct list_head *entry)
  33. {
  34. struct list_head *prev, *next;
  35. prev = entry->prev;
  36. next = entry->next;
  37. CHECK_DATA_CORRUPTION(next == LIST_POISON1,
  38. "list_del corruption, %p->next is LIST_POISON1 (%p)\n",
  39. entry, LIST_POISON1);
  40. CHECK_DATA_CORRUPTION(prev == LIST_POISON2,
  41. "list_del corruption, %p->prev is LIST_POISON2 (%p)\n",
  42. entry, LIST_POISON2);
  43. CHECK_DATA_CORRUPTION(prev->next != entry,
  44. "list_del corruption. prev->next should be %p, but was %p\n",
  45. entry, prev->next);
  46. CHECK_DATA_CORRUPTION(next->prev != entry,
  47. "list_del corruption. next->prev should be %p, but was %p\n",
  48. entry, next->prev);
  49. return true;
  50. }
  51. EXPORT_SYMBOL(__list_del_entry_valid);