From: Ian Campbell Date: Wed, 6 Feb 2013 23:41:37 +0000 (+0000) Subject: xen/netback: free already allocated memory on failure in xen_netbk_get_requests X-Git-Tag: v3.2.39~9 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=79d2fa0811ed0dadeb745daa0067eb672ec12fb7;p=thirdparty%2Fkernel%2Fstable.git xen/netback: free already allocated memory on failure in xen_netbk_get_requests [ Upstream commit 4cc7c1cb7b11b6f3515bd9075527576a1eecc4aa ] Signed-off-by: Ian Campbell Signed-off-by: David S. Miller Signed-off-by: Ben Hutchings --- diff --git a/drivers/net/xen-netback/netback.c b/drivers/net/xen-netback/netback.c index d6c2359903748..a14b3a2a2f1d4 100644 --- a/drivers/net/xen-netback/netback.c +++ b/drivers/net/xen-netback/netback.c @@ -950,7 +950,7 @@ static struct gnttab_copy *xen_netbk_get_requests(struct xen_netbk *netbk, pending_idx = netbk->pending_ring[index]; page = xen_netbk_alloc_page(netbk, skb, pending_idx); if (!page) - return NULL; + goto err; netbk->mmap_pages[pending_idx] = page; @@ -974,6 +974,17 @@ static struct gnttab_copy *xen_netbk_get_requests(struct xen_netbk *netbk, } return gop; +err: + /* Unwind, freeing all pages and sending error responses. */ + while (i-- > start) { + xen_netbk_idx_release(netbk, frag_get_pending_idx(&frags[i]), + XEN_NETIF_RSP_ERROR); + } + /* The head too, if necessary. */ + if (start) + xen_netbk_idx_release(netbk, pending_idx, XEN_NETIF_RSP_ERROR); + + return NULL; } static int xen_netbk_tx_check_gop(struct xen_netbk *netbk,