diff --git a/drivers/staging/rtl8712/rtl8712_recv.c b/drivers/staging/rtl8712/rtl8712_recv.c index 0ffb30f1af7e..8bf8e6d5b005 100644 --- a/drivers/staging/rtl8712/rtl8712_recv.c +++ b/drivers/staging/rtl8712/rtl8712_recv.c @@ -19,6 +19,7 @@ #include #include #include +#include #include "osdep_service.h" #include "drv_types.h" @@ -51,12 +52,20 @@ void r8712_init_recv_priv(struct recv_priv *precvpriv, for (i = 0; i < NR_RECVBUFF; i++) { INIT_LIST_HEAD(&precvbuf->list); spin_lock_init(&precvbuf->recvbuf_lock); - if (r8712_os_recvbuf_resource_alloc(padapter, precvbuf)) + if (r8712_os_recvbuf_resource_alloc(padapter, precvbuf)) { + int j = i; + + while (j-- > 0) { + r8712_os_recvbuf_resource_free(padapter, precvbuf); + precvbuf--; + } break; + } precvbuf->ref_cnt = 0; precvbuf->adapter = padapter; list_add_tail(&precvbuf->list, &(precvpriv->free_recv_buf_queue.queue)); + kmemleak_not_leak(precvbuf->purb); precvbuf++; } precvpriv->free_recv_buf_queue_cnt = NR_RECVBUFF;