[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] Avoid stack overflow in netback by statically allocating the
# HG changeset patch # User kaf24@xxxxxxxxxxxxxxxxxxxx # Node ID 3fe7b0b7f6c5ffde300b6518c50d6e05e84a4c10 # Parent e03ffa8839abbfc59f6916f9d81c7b689f78e1a9 Avoid stack overflow in netback by statically allocating the grant-table map/unmap arrays. Spotted by Michael Vrable. Signed-off-by: Keir Fraser <keir@xxxxxxxxxxxxx> diff -r e03ffa8839ab -r 3fe7b0b7f6c5 linux-2.6-xen-sparse/drivers/xen/netback/netback.c --- a/linux-2.6-xen-sparse/drivers/xen/netback/netback.c Sun Aug 14 09:07:56 2005 +++ b/linux-2.6-xen-sparse/drivers/xen/netback/netback.c Sun Aug 14 09:17:54 2005 @@ -58,7 +58,9 @@ static struct sk_buff_head rx_queue; static multicall_entry_t rx_mcl[NETIF_RX_RING_SIZE*2+1]; static mmu_update_t rx_mmu[NETIF_RX_RING_SIZE]; -#ifndef CONFIG_XEN_NETDEV_GRANT_RX +#ifdef CONFIG_XEN_NETDEV_GRANT_RX +static gnttab_donate_t grant_rx_op[MAX_PENDING_REQS]; +#else static struct mmuext_op rx_mmuext[NETIF_RX_RING_SIZE]; #endif static unsigned char rx_notify[NR_EVENT_CHANNELS]; @@ -90,11 +92,9 @@ #ifdef CONFIG_XEN_NETDEV_GRANT_TX static u16 grant_tx_ref[MAX_PENDING_REQS]; -#endif -#ifdef CONFIG_XEN_NETDEV_GRANT_RX -static gnttab_donate_t grant_rx_op[MAX_PENDING_REQS]; -#endif -#ifndef CONFIG_XEN_NETDEV_GRANT_TX +static gnttab_unmap_grant_ref_t tx_unmap_ops[MAX_PENDING_REQS]; +static gnttab_map_grant_ref_t tx_map_ops[MAX_PENDING_REQS]; +#else static multicall_entry_t tx_mcl[MAX_PENDING_REQS]; #endif @@ -492,7 +492,6 @@ inline static void net_tx_action_dealloc(void) { #ifdef CONFIG_XEN_NETDEV_GRANT_TX - gnttab_unmap_grant_ref_t unmap_ops[MAX_PENDING_REQS]; gnttab_unmap_grant_ref_t *gop; #else multicall_entry_t *mcl; @@ -508,8 +507,9 @@ /* * Free up any grants we have finished using */ - gop = unmap_ops; - while (dc != dp) { + gop = tx_unmap_ops; + while ( dc != dp ) + { pending_idx = dealloc_ring[MASK_PEND_IDX(dc++)]; gop->host_addr = MMAP_VADDR(pending_idx); gop->dev_bus_addr = 0; @@ -517,10 +517,8 @@ grant_tx_ref[pending_idx] = GRANT_INVALID_REF; gop++; } - if (unlikely(HYPERVISOR_grant_table_op(GNTTABOP_unmap_grant_ref, - unmap_ops, gop - unmap_ops))) { - BUG(); - } + BUG_ON(HYPERVISOR_grant_table_op( + GNTTABOP_unmap_grant_ref, tx_unmap_ops, gop - tx_unmap_ops)); #else mcl = tx_mcl; while ( dc != dp ) @@ -583,7 +581,6 @@ u16 pending_idx; NETIF_RING_IDX i; #ifdef CONFIG_XEN_NETDEV_GRANT_TX - gnttab_map_grant_ref_t map_ops[MAX_PENDING_REQS]; gnttab_map_grant_ref_t *mop; #else multicall_entry_t *mcl; @@ -594,7 +591,7 @@ net_tx_action_dealloc(); #ifdef CONFIG_XEN_NETDEV_GRANT_TX - mop = map_ops; + mop = tx_map_ops; #else mcl = tx_mcl; #endif @@ -722,7 +719,7 @@ pending_cons++; #ifdef CONFIG_XEN_NETDEV_GRANT_TX - if ((mop - map_ops) >= ARRAY_SIZE(map_ops)) + if ( (mop - tx_map_ops) >= ARRAY_SIZE(tx_map_ops) ) break; #else /* Filled the batch queue? */ @@ -732,20 +729,18 @@ } #ifdef CONFIG_XEN_NETDEV_GRANT_TX - if (mop == map_ops) { + if ( mop == tx_map_ops ) return; - } - if (unlikely(HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref, - map_ops, mop - map_ops))) { - BUG(); - } - mop = map_ops; + + BUG_ON(HYPERVISOR_grant_table_op( + GNTTABOP_map_grant_ref, tx_map_ops, mop - tx_map_ops)); + + mop = tx_map_ops; #else if ( mcl == tx_mcl ) return; - if ( unlikely(HYPERVISOR_multicall(tx_mcl, mcl - tx_mcl) != 0) ) - BUG(); + BUG_ON(HYPERVISOR_multicall(tx_mcl, mcl - tx_mcl) != 0); mcl = tx_mcl; #endif @@ -757,7 +752,8 @@ /* Check the remap error code. */ #ifdef CONFIG_XEN_NETDEV_GRANT_TX - if (unlikely(mop->dev_bus_addr == 0)) { + if ( unlikely(mop->dev_bus_addr == 0) ) + { printk(KERN_ALERT "#### netback grant fails\n"); make_tx_response(netif, txreq.id, NETIF_RSP_ERROR); netif_put(netif); _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |