On Thu, 11 Nov 2021 at 08:57, Magnus Karlsson <magnus.karlsson@xxxxxxxxx> wrote: > > From: Magnus Karlsson <magnus.karlsson@xxxxxxxxx> > > Fix a crash in the buffer pool allocator when a buffer is double > freed. It is possible to trigger this behavior not only from a faulty > driver, but also from user space like this: Create a zero-copy AF_XDP > socket. Load an XDP program that will issue XDP_DROP for all > packets. Put the same umem buffer into the fill ring multiple times, > then bind the socket and send some traffic. This will crash the kernel > as the XDP_DROP action triggers one call to xsk_buff_free()/xp_free() > for every packet dropped. Each call will add the corresponding buffer > entry to the free_list and increase the free_list_cnt. Some entries > will have been added multiple times due to the same buffer being > freed. The buffer allocation code will then traverse this broken list > and since the same buffer is in the list multiple times, it will try > to delete the same buffer twice from the list leading to a crash. > > The fix for this is just to test that the buffer has not been added > before in xp_free(). If it has been, just return from the function and > do not put it in the free_list a second time. > > Note that this bug was not present in the code before the commit > referenced in the Fixes tag. That code used one list entry per > allocated buffer, so multiple frees did not have any side effects. But > the commit below optimized the usage of the pool and only uses a > single entry per buffer in the umem, meaning that multiple > allocations/frees of the same buffer will also only use one entry, > thus leading to the problem. > > Fixes: 47e4075df300 ("xsk: Batched buffer allocation for the pool") > Signed-off-by: Magnus Karlsson <magnus.karlsson@xxxxxxxxx> Acked-by: Björn Töpel <bjorn@xxxxxxxxxx>