Commit 3318b2362bf0528be77123c480249663557dfbfc

Authored by Bing Zhao
Committed by Marcel Holtmann
1 parent 9374253ffe

Bluetooth: Fix incorrect alignment in Marvell BT-over-SDIO driver

The driver uses "u32" for alignment check and calculation which
works only on 32-bit system. It will crash the 64-bit system.
Replace "u32" with "unsigned long" to fix this issue.

Signed-off-by: Bing Zhao <bzhao@marvell.com>
Signed-off-by: Marcel Holtmann <marcel@holtmann.org>

Showing 2 changed files with 9 additions and 6 deletions Side-by-side Diff

drivers/bluetooth/btmrvl_sdio.c
... ... @@ -481,12 +481,14 @@
481 481 goto exit;
482 482 }
483 483  
484   - if ((u32) skb->data & (BTSDIO_DMA_ALIGN - 1)) {
485   - skb_put(skb, (u32) skb->data & (BTSDIO_DMA_ALIGN - 1));
486   - skb_pull(skb, (u32) skb->data & (BTSDIO_DMA_ALIGN - 1));
  484 + if ((unsigned long) skb->data & (BTSDIO_DMA_ALIGN - 1)) {
  485 + skb_put(skb, (unsigned long) skb->data &
  486 + (BTSDIO_DMA_ALIGN - 1));
  487 + skb_pull(skb, (unsigned long) skb->data &
  488 + (BTSDIO_DMA_ALIGN - 1));
487 489 }
488 490  
489   - payload = skb->tail;
  491 + payload = skb->data;
490 492  
491 493 ret = sdio_readsb(card->func, payload, card->ioport,
492 494 buf_block_len * blksz);
... ... @@ -773,7 +775,7 @@
773 775 }
774 776  
775 777 buf = payload;
776   - if ((u32) payload & (BTSDIO_DMA_ALIGN - 1)) {
  778 + if ((unsigned long) payload & (BTSDIO_DMA_ALIGN - 1)) {
777 779 tmpbufsz = ALIGN_SZ(nb, BTSDIO_DMA_ALIGN);
778 780 tmpbuf = kmalloc(tmpbufsz, GFP_KERNEL);
779 781 memset(tmpbuf, 0, tmpbufsz);
drivers/bluetooth/btmrvl_sdio.h
... ... @@ -104,5 +104,6 @@
104 104  
105 105 /* Macros for Data Alignment : address */
106 106 #define ALIGN_ADDR(p, a) \
107   - ((((u32)(p)) + (((u32)(a)) - 1)) & ~(((u32)(a)) - 1))
  107 + ((((unsigned long)(p)) + (((unsigned long)(a)) - 1)) & \
  108 + ~(((unsigned long)(a)) - 1))