一個險惡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.anti-gravitydesign.com

国产97人人超碰caoprom_尤物国产在线一区手机播放_精品国产一区二区三_色天使久久综合给合久久97