From patchwork Tue May 11 21:51:12 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Abhijeet Kolekar X-Patchwork-Id: 98835 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by demeter.kernel.org (8.14.3/8.14.3) with ESMTP id o4BLeNhY028342 for ; Tue, 11 May 2010 21:40:23 GMT Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752074Ab0EKVkW (ORCPT ); Tue, 11 May 2010 17:40:22 -0400 Received: from mga03.intel.com ([143.182.124.21]:44754 "EHLO mga03.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751810Ab0EKVkV (ORCPT ); Tue, 11 May 2010 17:40:21 -0400 Received: from azsmga001.ch.intel.com ([10.2.17.19]) by azsmga101.ch.intel.com with ESMTP; 11 May 2010 14:40:21 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="4.53,210,1272870000"; d="scan'208";a="275962421" Received: from wifisr4.jf.intel.com (HELO localhost.localdomain) ([10.23.232.224]) by azsmga001.ch.intel.com with ESMTP; 11 May 2010 14:40:20 -0700 From: Abhijeet Kolekar To: linux-wireless@vger.kernel.org Cc: yi.zhu@intel.com, Abhijeet Kolekar Subject: [PATCHi V4] mac80211: fix paged defragmentation Date: Tue, 11 May 2010 14:51:12 -0700 Message-Id: <1273614672-25374-1-git-send-email-abhijeet.kolekar@intel.com> X-Mailer: git-send-email 1.6.3.3 Sender: linux-wireless-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-wireless@vger.kernel.org X-Greylist: IP, sender and recipient auto-whitelisted, not delayed by milter-greylist-4.2.3 (demeter.kernel.org [140.211.167.41]); Tue, 11 May 2010 21:40:23 +0000 (UTC) diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c index 9a08f2c..af61aeb 100644 --- a/net/mac80211/rx.c +++ b/net/mac80211/rx.c @@ -1253,6 +1253,13 @@ ieee80211_rx_h_defragment(struct ieee80211_rx_data *rx) if (skb_linearize(rx->skb)) return RX_DROP_UNUSABLE; + /* + * skb_linearize() might change the skb->data and + * previously cached variables (in this case, hdr) need to + * be refreshed with the new data. Also make sure compiler won't + * do any weird assignments. + */ + hdr = (struct ieee80211_hdr *)ACCESS_ONCE(rx->skb->data); seq = (sc & IEEE80211_SCTL_SEQ) >> 4; if (frag == 0) {