diff options
author | Gregory Nutt <gnutt@nuttx.org> | 2014-12-18 07:18:00 -0600 |
---|---|---|
committer | Gregory Nutt <gnutt@nuttx.org> | 2014-12-18 07:18:00 -0600 |
commit | 832d5c61700c79bb134eca308c76eef7d464e7ff (patch) | |
tree | 9b84ed9251b6c61d494f5a61ae5e40b5c3c992e4 /nuttx/drivers/wireless/cc3000/cc3000.c | |
parent | b3d820a092abb2fd4e705b72f194390dc076a1e0 (diff) | |
download | px4-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.c | 13 |
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) { |