一个险恶bug的深入分析(2)

发表于:2012-06-06来源:伯乐在线作者:不详点击数: 标签:bug
skb_bond函数会判断skb是否属于bond。如果是,那么函数要确保skb来自bond上的一个活跃设备。这个检查是为了防止高层协议为某个bond重复进行配置分配。如果

  skb_bond函数会判断skb是否属于bond。如果是,那么函数要确保skb来自bond上的一个活跃设备。这个检查是为了防止高层协议为某个bond重复进行配置分配。如果skb通过了这些检查,skb的dev指针会被赋值为指向bond的设备指针,同时netif_receive_skb函数会返回原设备指针。

  从概念上理解,你可以把上述代码等价于如下伪代码:

  起始状态:

1
2
3
4
5
6
7
orig_dev = NULL
skb->dev = "eth0"
 
orig_dev = skb->dev
if skb->dev 是bond的一部分:
  if skb->dev 是bond上的活跃设备
    skb->dev = bond

  结束状态:

1
2
orig_dev = "eth0"
skb->dev = bond

  因此,看上去skb消息被当成发自一个bond中的设备而不是物理设备。

  如果我们继续跟踪netif_receive_skb函数,我们会看到代码将skb转给了pcap处理:

1
2
3
4
5
6
7
8
list_for_each_entry_rcu(ptype, &ptype_all, list) {
  if (!ptype->dev || ptype->dev == skb->dev) {
    if (pt_prev)
      ret = deliver_skb(skb, pt_prev, orig_dev);
 
    pt_prev = ptype;
  }
}

原文转自:http://www.ltesting.net