|
5 | 5 |
|
6 | 6 | #include <linux/devcoredump.h>
|
7 | 7 |
|
| 8 | +#include <asm/unaligned.h> |
8 | 9 | #include <net/bluetooth/bluetooth.h>
|
9 | 10 | #include <net/bluetooth/hci_core.h>
|
10 | 11 |
|
@@ -180,25 +181,25 @@ static int hci_devcd_prepare(struct hci_dev *hdev, u32 dump_size)
|
180 | 181 |
|
181 | 182 | static void hci_devcd_handle_pkt_init(struct hci_dev *hdev, struct sk_buff *skb)
|
182 | 183 | {
|
183 |
| - u32 *dump_size; |
| 184 | + u32 dump_size; |
184 | 185 |
|
185 | 186 | if (hdev->dump.state != HCI_DEVCOREDUMP_IDLE) {
|
186 | 187 | DBG_UNEXPECTED_STATE();
|
187 | 188 | return;
|
188 | 189 | }
|
189 | 190 |
|
190 |
| - if (skb->len != sizeof(*dump_size)) { |
| 191 | + if (skb->len != sizeof(dump_size)) { |
191 | 192 | bt_dev_dbg(hdev, "Invalid dump init pkt");
|
192 | 193 | return;
|
193 | 194 | }
|
194 | 195 |
|
195 |
| - dump_size = skb_pull_data(skb, sizeof(*dump_size)); |
196 |
| - if (!*dump_size) { |
| 196 | + dump_size = get_unaligned_le32(skb_pull_data(skb, 4)); |
| 197 | + if (!dump_size) { |
197 | 198 | bt_dev_err(hdev, "Zero size dump init pkt");
|
198 | 199 | return;
|
199 | 200 | }
|
200 | 201 |
|
201 |
| - if (hci_devcd_prepare(hdev, *dump_size)) { |
| 202 | + if (hci_devcd_prepare(hdev, dump_size)) { |
202 | 203 | bt_dev_err(hdev, "Failed to prepare for dump");
|
203 | 204 | return;
|
204 | 205 | }
|
@@ -441,7 +442,7 @@ int hci_devcd_init(struct hci_dev *hdev, u32 dump_size)
|
441 | 442 | return -ENOMEM;
|
442 | 443 |
|
443 | 444 | hci_dmp_cb(skb)->pkt_type = HCI_DEVCOREDUMP_PKT_INIT;
|
444 |
| - skb_put_data(skb, &dump_size, sizeof(dump_size)); |
| 445 | + put_unaligned_le32(dump_size, skb_put(skb, 4)); |
445 | 446 |
|
446 | 447 | skb_queue_tail(&hdev->dump.dump_q, skb);
|
447 | 448 | queue_work(hdev->workqueue, &hdev->dump.dump_rx);
|
|
0 commit comments