In the Linux kernel, the following vulnerability has been resolved:
dmaengine: idxd: Fix double free in idxdsetupwqs()
The clean up in idxdsetupwqs() has had a couple bugs because the error handling is a bit subtle. It's simpler to just re-write it in a cleaner way. The issues here are:
1) If "idxd->maxwqs" is <= 0 then we call putdevice(confdev) when "confdev" hasn't been initialized. 2) If kzallocnode() fails then again "confdev" is invalid. It's either uninitialized or it points to the "conf_dev" from the previous iteration so it leads to a double free.
It's better to free partial loop iterations within the loop and then the unwinding at the end can handle whole loop iterations. I also renamed the labels to describe what the goto does and not where the goto was located.