diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000000000..60d318f805ff1 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,31 @@ +name: CI + +on: + pull_request: + types: [opened, synchronize, reopened] + +permissions: + checks: write + pull-requests: write + +jobs: + ci: + runs-on: ubuntu-latest + name: CI for Pull Request + steps: + - name: Checkout the source code + uses: actions/checkout@v3 + with: + path: src/src + + - name: CI + uses: bluez/action-ci@main + with: + task: ci + base_folder: src + space: kernel + github_token: ${{ secrets.GITHUB_TOKEN }} + email_token: ${{ secrets.EMAIL_TOKEN }} + patchwork_token: ${{ secrets.PATCHWORK_TOKEN }} + patchwork_user: ${{ secrets.PATCHWORK_USER }} + diff --git a/.github/workflows/sync.yml b/.github/workflows/sync.yml new file mode 100644 index 0000000000000..5e95af92ab1ab --- /dev/null +++ b/.github/workflows/sync.yml @@ -0,0 +1,44 @@ +name: Sync + +on: + schedule: + - cron: "*/5 * * * *" + +jobs: + sync_repo: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + with: + ref: master + + - name: Sync Repo + uses: bluez/action-ci@main + with: + task: sync + workflow: workflow + upstream_repo: 'https://git.kernel.org/pub/scm/linux/kernel/git/bluetooth/bluetooth-next.git' + github_token: ${{ secrets.GITHUB_TOKEN }} + + - name: Cleanup PR + uses: bluez/action-ci@main + with: + task: cleanup + github_token: ${{ secrets.ACTION_TOKEN }} + + sync_patchwork: + needs: sync_repo + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + + - name: Sync Patchwork + uses: bluez/action-ci@main + with: + task: patchwork + workflow: workflow + space: kernel + github_token: ${{ secrets.ACTION_TOKEN }} + email_token: ${{ secrets.EMAIL_TOKEN }} + patchwork_token: ${{ secrets.PATCHWORK_TOKEN }} + patchwork_user: ${{ secrets.PATCHWORK_USER }} diff --git a/drivers/bluetooth/btintel.c b/drivers/bluetooth/btintel.c index 5e9cac090bd8f..0c42ee53fe2ea 100644 --- a/drivers/bluetooth/btintel.c +++ b/drivers/bluetooth/btintel.c @@ -3358,14 +3358,9 @@ void btintel_print_fseq_info(struct hci_dev *hdev) return; } - if (skb->len < (sizeof(u32) * 16 + 2)) { - bt_dev_dbg(hdev, "Malformed packet of length %u received", - skb->len); - kfree_skb(skb); - return; - } - p = skb_pull_data(skb, 1); + if (!p) + goto malformed; if (*p) { bt_dev_dbg(hdev, "Failed to get fseq status (0x%2.2x)", *p); kfree_skb(skb); @@ -3373,6 +3368,8 @@ void btintel_print_fseq_info(struct hci_dev *hdev) } p = skb_pull_data(skb, 1); + if (!p) + goto malformed; switch (*p) { case 0: str = "Success"; @@ -3396,65 +3393,120 @@ void btintel_print_fseq_info(struct hci_dev *hdev) bt_dev_info(hdev, "Fseq status: %s (0x%2.2x)", str, *p); - val = get_unaligned_le32(skb_pull_data(skb, 4)); + p = skb_pull_data(skb, 4); + if (!p) + goto malformed; + val = get_unaligned_le32(p); bt_dev_dbg(hdev, "Reason: 0x%8.8x", val); - val = get_unaligned_le32(skb_pull_data(skb, 4)); + p = skb_pull_data(skb, 4); + if (!p) + goto malformed; + val = get_unaligned_le32(p); bt_dev_dbg(hdev, "Global version: 0x%8.8x", val); - val = get_unaligned_le32(skb_pull_data(skb, 4)); + p = skb_pull_data(skb, 4); + if (!p) + goto malformed; + val = get_unaligned_le32(p); bt_dev_dbg(hdev, "Installed version: 0x%8.8x", val); - p = skb->data; - skb_pull_data(skb, 4); + p = skb_pull_data(skb, 4); + if (!p) + goto malformed; bt_dev_info(hdev, "Fseq executed: %2.2u.%2.2u.%2.2u.%2.2u", p[0], p[1], p[2], p[3]); - p = skb->data; - skb_pull_data(skb, 4); + p = skb_pull_data(skb, 4); + if (!p) + goto malformed; bt_dev_info(hdev, "Fseq BT Top: %2.2u.%2.2u.%2.2u.%2.2u", p[0], p[1], p[2], p[3]); - val = get_unaligned_le32(skb_pull_data(skb, 4)); + p = skb_pull_data(skb, 4); + if (!p) + goto malformed; + val = get_unaligned_le32(p); bt_dev_dbg(hdev, "Fseq Top init version: 0x%8.8x", val); - val = get_unaligned_le32(skb_pull_data(skb, 4)); + p = skb_pull_data(skb, 4); + if (!p) + goto malformed; + val = get_unaligned_le32(p); bt_dev_dbg(hdev, "Fseq Cnvio init version: 0x%8.8x", val); - val = get_unaligned_le32(skb_pull_data(skb, 4)); + p = skb_pull_data(skb, 4); + if (!p) + goto malformed; + val = get_unaligned_le32(p); bt_dev_dbg(hdev, "Fseq MBX Wifi file version: 0x%8.8x", val); - val = get_unaligned_le32(skb_pull_data(skb, 4)); + p = skb_pull_data(skb, 4); + if (!p) + goto malformed; + val = get_unaligned_le32(p); bt_dev_dbg(hdev, "Fseq BT version: 0x%8.8x", val); - val = get_unaligned_le32(skb_pull_data(skb, 4)); + p = skb_pull_data(skb, 4); + if (!p) + goto malformed; + val = get_unaligned_le32(p); bt_dev_dbg(hdev, "Fseq Top reset address: 0x%8.8x", val); - val = get_unaligned_le32(skb_pull_data(skb, 4)); + p = skb_pull_data(skb, 4); + if (!p) + goto malformed; + val = get_unaligned_le32(p); bt_dev_dbg(hdev, "Fseq MBX timeout: 0x%8.8x", val); - val = get_unaligned_le32(skb_pull_data(skb, 4)); + p = skb_pull_data(skb, 4); + if (!p) + goto malformed; + val = get_unaligned_le32(p); bt_dev_dbg(hdev, "Fseq MBX ack: 0x%8.8x", val); - val = get_unaligned_le32(skb_pull_data(skb, 4)); + p = skb_pull_data(skb, 4); + if (!p) + goto malformed; + val = get_unaligned_le32(p); bt_dev_dbg(hdev, "Fseq CNVi id: 0x%8.8x", val); - val = get_unaligned_le32(skb_pull_data(skb, 4)); + p = skb_pull_data(skb, 4); + if (!p) + goto malformed; + val = get_unaligned_le32(p); bt_dev_dbg(hdev, "Fseq CNVr id: 0x%8.8x", val); - val = get_unaligned_le32(skb_pull_data(skb, 4)); + p = skb_pull_data(skb, 4); + if (!p) + goto malformed; + val = get_unaligned_le32(p); bt_dev_dbg(hdev, "Fseq Error handle: 0x%8.8x", val); - val = get_unaligned_le32(skb_pull_data(skb, 4)); + p = skb_pull_data(skb, 4); + if (!p) + goto malformed; + val = get_unaligned_le32(p); bt_dev_dbg(hdev, "Fseq Magic noalive indication: 0x%8.8x", val); - val = get_unaligned_le32(skb_pull_data(skb, 4)); + p = skb_pull_data(skb, 4); + if (!p) + goto malformed; + val = get_unaligned_le32(p); bt_dev_dbg(hdev, "Fseq OTP version: 0x%8.8x", val); - val = get_unaligned_le32(skb_pull_data(skb, 4)); + p = skb_pull_data(skb, 4); + if (!p) + goto malformed; + val = get_unaligned_le32(p); bt_dev_dbg(hdev, "Fseq MBX otp version: 0x%8.8x", val); kfree_skb(skb); + return; + +malformed: + bt_dev_dbg(hdev, "Malformed packet received"); + kfree_skb(skb); } EXPORT_SYMBOL_GPL(btintel_print_fseq_info);