summaryrefslogtreecommitdiff
path: root/nuttx/drivers/wireless/cc3000/cc3000.c
diff options
context:
space:
mode:
authorGregory Nutt <gnutt@nuttx.org>2014-12-18 07:18:00 -0600
committerGregory Nutt <gnutt@nuttx.org>2014-12-18 07:18:00 -0600
commit832d5c61700c79bb134eca308c76eef7d464e7ff (patch)
tree9b84ed9251b6c61d494f5a61ae5e40b5c3c992e4 /nuttx/drivers/wireless/cc3000/cc3000.c
parentb3d820a092abb2fd4e705b72f194390dc076a1e0 (diff)
downloadpx4-nuttx-832d5c61700c79bb134eca308c76eef7d464e7ff.tar.gz
px4-nuttx-832d5c61700c79bb134eca308c76eef7d464e7ff.tar.bz2
px4-nuttx-832d5c61700c79bb134eca308c76eef7d464e7ff.zip
CC3000 Fix: Data can be unaligned. When dereferences as an input ntosh(), a bad value is returned. Reported by Alan Carvalho de Assis
Diffstat (limited to 'nuttx/drivers/wireless/cc3000/cc3000.c')
-rw-r--r--nuttx/drivers/wireless/cc3000/cc3000.c13
1 files changed, 9 insertions, 4 deletions
diff --git a/nuttx/drivers/wireless/cc3000/cc3000.c b/nuttx/drivers/wireless/cc3000/cc3000.c
index dbda7f374..66bf04ee5 100644
--- a/nuttx/drivers/wireless/cc3000/cc3000.c
+++ b/nuttx/drivers/wireless/cc3000/cc3000.c
@@ -671,12 +671,17 @@ static void * cc3000_worker(FAR void *arg)
cc3000_lock_and_select(priv->spi); /* Assert CS */
priv->state = eSPI_STATE_READ_PROCEED;
- SPI_EXCHANGE(priv->spi,spi_readCommand,priv->rx_buffer.pbuffer, ARRAY_SIZE(spi_readCommand));
+ SPI_EXCHANGE(priv->spi,spi_readCommand, priv->rx_buffer.pbuffer,
+ ARRAY_SIZE(spi_readCommand));
- /* Extract Length bytes from Rx Buffer */
+ /* Extract Length bytes from Rx Buffer. Here we need to convert
+ * unaligned data in network order (big endian, MS byte first) to
+ * host order. We cannot use ntohs here because the data is not
+ * aligned.
+ */
- uint16_t *pnetlen = (uint16_t *) &priv->rx_buffer.pbuffer[READ_OFFSET_TO_LENGTH];
- data_to_recv = ntohs(*pnetlen);
+ data_to_recv = (uint16_t)priv->rx_buffer.pbuffer[READ_OFFSET_TO_LENGTH] << 8 |;
+ (uint16_t)priv->rx_buffer.pbuffer[READ_OFFSET_TO_LENGTH];
if (data_to_recv)
{