public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: Greg KH <gregkh@suse.de>
To: linux-kernel@vger.kernel.org, stable@kernel.org
Cc: stable-review@kernel.org, torvalds@linux-foundation.org,
	akpm@linux-foundation.org, alan@lxorguk.ukuu.org.uk,
	Jay Sternberg <jay.e.sternberg@intel.com>,
	Reinette Chatre <reinette.chatre@intel.com>,
	"John W. Linville" <linville@tuxdriver.com>,
	Greg Kroah-Hartman <gregkh@suse.de>
Subject: [44/46] iwlwifi: incorrect method used for finding valid OTP blocks
Date: Fri, 16 Oct 2009 10:10:37 -0700	[thread overview]
Message-ID: <20091016171209.947222482@linux.site> (raw)
In-Reply-To: <20091016171422.GA13339@kroah.com>

[-- Attachment #1: iwlwifi-incorrect-method-used-for-finding-valid-otp-blocks.patch --]
[-- Type: text/plain, Size: 2852 bytes --]

2.6.31-stable review patch.  If anyone has any objections, please let us know.

------------------
From: Jay Sternberg <jay.e.sternberg@intel.com>

commit 2facba769d7f9e563cf706de709074a2d20f1bba upstream.

The address stored in the next link address is a word address but when
reading the OTP blocks, a byte address is used. Also if the blocks are
full and the last link pointer is not zero, then none of the blocks are
valid so return an error.

The algorithm is simply valid blocks have a next address and that
address's contents is zero.

Using the wrong address for the next link address gets arbitrary data,
obviously. In cases seen, the first block is considered valid when it is not.

If the block has in fact been invalidated there may be old data or
there may be no data, bad data, or partial data, there is no way of
telling. Without this patch it is possible that a device with valid OTP data
is unable to work.

Signed-off-by: Jay Sternberg <jay.e.sternberg@intel.com>
Signed-off-by: Reinette Chatre <reinette.chatre@intel.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>

---
 drivers/net/wireless/iwlwifi/iwl-eeprom.c |   23 +++++++++++------------
 1 file changed, 11 insertions(+), 12 deletions(-)

--- a/drivers/net/wireless/iwlwifi/iwl-eeprom.c
+++ b/drivers/net/wireless/iwlwifi/iwl-eeprom.c
@@ -335,7 +335,6 @@ static int iwl_find_otp_image(struct iwl
 					u16 *validblockaddr)
 {
 	u16 next_link_addr = 0, link_value = 0, valid_addr;
-	int ret = 0;
 	int usedblocks = 0;
 
 	/* set addressing mode to absolute to traverse the link list */
@@ -355,29 +354,29 @@ static int iwl_find_otp_image(struct iwl
 		 * check for more block on the link list
 		 */
 		valid_addr = next_link_addr;
-		next_link_addr = link_value;
+		next_link_addr = link_value * sizeof(u16);
 		IWL_DEBUG_INFO(priv, "OTP blocks %d addr 0x%x\n",
 			       usedblocks, next_link_addr);
 		if (iwl_read_otp_word(priv, next_link_addr, &link_value))
 			return -EINVAL;
 		if (!link_value) {
 			/*
-			 * reach the end of link list,
+			 * reach the end of link list, return success and
 			 * set address point to the starting address
 			 * of the image
 			 */
-			goto done;
+			*validblockaddr = valid_addr;
+			/* skip first 2 bytes (link list pointer) */
+			*validblockaddr += 2;
+			return 0;
 		}
 		/* more in the link list, continue */
 		usedblocks++;
-	} while (usedblocks < priv->cfg->max_ll_items);
-	/* OTP full, use last block */
-	IWL_DEBUG_INFO(priv, "OTP is full, use last block\n");
-done:
-	*validblockaddr = valid_addr;
-	/* skip first 2 bytes (link list pointer) */
-	*validblockaddr += 2;
-	return ret;
+	} while (usedblocks <= priv->cfg->max_ll_items);
+
+	/* OTP has no valid blocks */
+	IWL_DEBUG_INFO(priv, "OTP has no valid blocks\n");
+	return -EINVAL;
 }
 
 /**



  parent reply	other threads:[~2009-10-16 17:19 UTC|newest]

Thread overview: 51+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <20091016170953.128828149@linux.site>
2009-10-16 17:14 ` [00/46] 2.6.31.5-stable review Greg KH
2009-10-16 17:09   ` [01/46] SCSI: Retry ADD_TO_MLQUEUE return value for EH commands Greg KH
2009-10-16 17:09   ` [02/46] SCSI: Fix protection scsi_data_buffer leak Greg KH
2009-10-16 17:09   ` [03/46] SCSI: sg: Free data buffers after calling blk_rq_unmap_user Greg KH
2009-10-16 17:09   ` [04/46] ARM: pxa: workaround errata #37 by not using half turbo switching Greg KH
2009-10-16 17:09   ` [05/46] tracing/filters: Fix memory leak when setting a filter Greg KH
2009-10-16 17:09   ` [06/46] x86/paravirt: Use normal calling sequences for irq enable/disable Greg KH
2009-10-16 17:10   ` [07/46] USB: ftdi_sio: remove tty->low_latency Greg KH
2009-10-16 17:10   ` [08/46] USB: ftdi_sio: remove unused rx_byte counter Greg KH
2009-10-16 17:10   ` [09/46] USB: ftdi_sio: clean up read completion handler Greg KH
2009-10-16 17:10   ` [10/46] USB: ftdi_sio: re-implement read processing Greg KH
2009-10-16 17:10   ` [11/46] USB: pl2303: fix error characters not being reported to ldisc Greg KH
2009-10-16 17:10   ` [12/46] USB: digi_acceleport: Fix broken unthrottle Greg KH
2009-10-16 17:10   ` [13/46] USB: serial: dont call release without attach Greg KH
2009-10-16 17:10   ` [14/46] USB: option: Toshiba G450 device id Greg KH
2009-10-16 17:10   ` [15/46] USB: ipaq: fix oops when device is plugged in Greg KH
2009-10-16 17:10   ` [16/46] USB: cp210x: Add support for the DW700 UART Greg KH
2009-10-16 17:10   ` [17/46] USB: Fix throttling in generic usbserial driver Greg KH
2009-10-16 17:10   ` [18/46] USB: storage: When a device returns no sense data, call it a Hardware Error Greg KH
2009-10-16 17:10   ` [19/46] arm, cris, mips, sparc, powerpc, um, xtensa: fix build with bash 4.0 Greg KH
2009-10-16 17:10   ` [20/46] intel-iommu: Cope with broken HP DC7900 BIOS Greg KH
2009-10-16 17:10   ` [21/46] futex: Detect mismatched requeue targets Greg KH
2009-10-16 17:10   ` [22/46] futex: Fix wakeup race by setting TASK_INTERRUPTIBLE before queue_me() Greg KH
2009-10-16 17:10   ` [23/46] tpm-fixup-pcrs-sysfs-file-update Greg KH
2009-10-16 17:10   ` [24/46] TPM: fix pcrread Greg KH
2009-10-16 17:10   ` [25/46] Bluetooth: Disconnect HIDRAW devices on disconnect Greg KH
2009-10-16 17:10   ` [26/46] Bluetooth: Add extra device reference counting for connections Greg KH
2009-10-16 17:10   ` [27/46] Bluetooth: Let HIDP grab the device reference " Greg KH
2009-10-16 17:10   ` [28/46] connector: Keep the skb in cn_callback_data Greg KH
2009-10-16 17:10   ` [29/46] connector: Provide the senders credentials to the callback Greg KH
2009-10-16 17:10   ` [30/46] connector: Removed the destruct_data callback since it is always kfree_skb() Greg KH
2009-10-16 17:10   ` [31/46] dm/connector: Only process connector packages from privileged processes Greg KH
2009-10-16 17:10   ` [32/46] dst/connector: Disallow unpliviged users to configure dst Greg KH
2009-10-16 17:10   ` [33/46] pohmelfs/connector: Disallow unpliviged users to configure pohmelfs Greg KH
2009-10-16 17:10   ` [34/46] uvesafb/connector: Disallow unpliviged users to send netlink packets Greg KH
2009-10-16 17:10   ` [35/46] e1000e: swap max hw supported frame size between 82574 and 82583 Greg KH
2009-10-16 17:10   ` [36/46] MAINTAINERS: Fix Riku Voipios address Greg KH
2009-10-16 17:10   ` [37/46] macintosh: Dont assume i2c device probing always succeeds Greg KH
2009-10-16 17:10   ` [38/46] i2c: Hide probe errors caused by ACPI resource conflicts Greg KH
2009-10-16 17:10   ` [39/46] ALSA: Dont assume i2c device probing always succeeds Greg KH
2009-10-16 17:10   ` [40/46] bsdacct: switch credentials for writing to the accounting file Greg KH
2009-10-16 17:10   ` [41/46] sysfs: Allow sysfs_notify_dirent to be called from interrupt context Greg KH
2009-10-16 17:10   ` [42/46] Staging: rt2860sta: prevent a panic when disabling when associated Greg KH
2009-10-16 17:10   ` [43/46] usb-storage: Workaround devices with bogus sense size Greg KH
2009-10-16 17:10   ` Greg KH [this message]
2009-10-16 17:10   ` [45/46] mac80211: fix vlan and optimise RX Greg KH
2009-10-16 17:10   ` [46/46] tty: Make flush_to_ldisc() locking more robust Greg KH
2009-10-16 17:57   ` [00/46] 2.6.31.5-stable review Massimo Cetra
2009-10-16 18:03     ` Greg KH
2009-10-17  5:20       ` Massimo Cetra
2009-11-05 23:12         ` Greg KH

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20091016171209.947222482@linux.site \
    --to=gregkh@suse.de \
    --cc=akpm@linux-foundation.org \
    --cc=alan@lxorguk.ukuu.org.uk \
    --cc=jay.e.sternberg@intel.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linville@tuxdriver.com \
    --cc=reinette.chatre@intel.com \
    --cc=stable-review@kernel.org \
    --cc=stable@kernel.org \
    --cc=torvalds@linux-foundation.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox