In the Linux kernel, the following vulnerability has been resolved: net: batman-adv: fix error handling Syzbot reported ODEBUG warning in batadvncmeshfree(). The problem was in wrong error handling in batadvmeshinit(). Before this patch batadvmeshinit() was calling batadvmeshfree() in case of any batadvinit() calls failure. This approach may work well, when there is some kind of indicator, which can tell which parts of batadv are initialized; but there isn't any. All written above lead to cleaning up uninitialized fields. Even if we hide ODEBUG warning by initializing batpriv->nc.work, syzbot was able to hit GPF in batadvncpurgepaths(), because hash pointer in still NULL. [1] To fix these bugs we can unwind batadvinit() calls one by one. It is good approach for 2 reasons: 1) It fixes bugs on error handling path 2) It improves the performance, since we won't call unneeded batadvfree() functions. So, this patch makes all batadvinit() clean up all allocated memory before returning with an error to no call correspoing batadv*free() and open-codes batadvmesh_free() with proper order to avoid touching uninitialized fields.