Fix dereference of skb pointer after free.
If rose_route_frame return success we'll dereference a stale pointer. Likely this is only going to result in bad statistics for the ROSE interface.
Testers requested.
Signed-off-by Ralf Baechle <[email protected]>
--- net/rose/rose_dev.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
net/rose/rose_dev.c +4 -1
@@ -60,6 +60,7 @@ static int rose_rebuild_header(struct skstruct net_device_stats *stats =netdev_priv (dev);unsigned char *bp = (unsigned char *)skb->data;struct sk_buff *skbn; +unsigned int len;#ifdef CONFIG_INET if (arp_find (bp +7 , skb)) {
@@ -76,6 +77,8 @@ static int rose_rebuild_header(struct skkfree_skb (skb); + len = skbn->len; +if (!rose_route_frame (skbn,NULL )) {kfree_skb (skbn); stats->tx_errors++;
@@ -83,7 +86,7 @@ static int rose_rebuild_header(struct sk } stats->tx_packets++; - stats->tx_bytes += skbn->len; + stats->tx_bytes += len;#endif return 1 ; }
Please don't use the previous patch; it's broken. Here's the right one.
Ralf
[NETROM] Fix possible null pointer dereference.
If in nr_link_failed the neighbour list is non-empty but the node list is empty we'll end dereferencing a in a NULL pointer.
This fixes coverity 362.
Signed-off-by Ralf Baechle <[email protected]>
net/netrom/nr_route.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-)
net/netrom/nr_route.c +8 -4
@@ -725,15 +725,17 @@ void nr_link_failed(ax25_cb *ax25, int rstruct nr_node *nr_node =NULL ;spin_lock_bh (&nr_neigh_list_lock); -nr_neigh_for_each (s, node, &nr_neigh_list) +nr_neigh_for_each (s, node, &nr_neigh_list) {if (s->ax25 == ax25) {nr_neigh_hold (s); nr_neigh = s;break ; } + }spin_unlock_bh (&nr_neigh_list_lock); -if (nr_neigh ==NULL )return ; +if (nr_neigh ==NULL ) +return ; nr_neigh->ax25 =NULL ;ax25_cb_put (ax25);
@@ -743,11 +745,13 @@ void nr_link_failed(ax25_cb *ax25, int rreturn ; }spin_lock_bh (&nr_node_list_lock); -nr_node_for_each (nr_node, node, &nr_node_list) +nr_node_for_each (nr_node, node, &nr_node_list) {nr_node_lock (nr_node); -if (nr_node->which < nr_node->count && nr_node->routes[nr_node->which].neighbour == nr_neigh) +if (nr_node->which < nr_node->count && + nr_node->routes[nr_node->which].neighbour == nr_neigh) nr_node->which++;nr_node_unlock (nr_node); + }spin_unlock_bh (&nr_node_list_lock);nr_neigh_put (nr_neigh); }