On Tue, 16 Aug 2016 17:20:28 -0700 Kees Cook <keesc...@chromium.org> wrote:
> EXPORT_SYMBOL(__list_add_valid); > @@ -46,26 +41,18 @@ bool __list_del_entry_valid(struct list_head *entry) > prev = entry->prev; > next = entry->next; > > - if (unlikely(next == LIST_POISON1)) { > - WARN(1, "list_del corruption, %p->next is LIST_POISON1 (%p)\n", > - entry, LIST_POISON1); > - return false; > - } > - if (unlikely(prev == LIST_POISON2)) { > - WARN(1, "list_del corruption, %p->prev is LIST_POISON2 (%p)\n", > - entry, LIST_POISON2); > - return false; > - } > - if (unlikely(prev->next != entry)) { > - WARN(1, "list_del corruption. prev->next should be %p, but was > %p\n", > - entry, prev->next); > - return false; > - } > - if (unlikely(next->prev != entry)) { > - WARN(1, "list_del corruption. next->prev should be %p, but was > %p\n", > - entry, next->prev); > - return false; > - } > + 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); OK, you totally rewrote the WARN() section anyway, thus ignore my comment on the previous email. -- Steve > return true; > > }