Skip to content

Incorrect handling of 0x46 CDB commands (ATAPI) #678

@disean

Description

@disean

Version: 08c8ed9
ISO File: https://github.com/reactos/reactos/actions/runs/19678484187/artifacts/4676568686 (livecd.iso)

When the host sends a 0x46 CDB command, which has allocation length of 8, bochs incorrectly returns more than 8 bytes of data, resulting in a host buffer overrun.

Send packet command
    IO 000001F6 <-- a0
    IO 000001F7 --> 50
    IO 000001F4 <-- 08
    IO 000001F5 <-- 00
    IO 000001F1 <-- 00
    IO 000001F7 <-- a0
    
Wait for ready for CDB
    IO 000001F7 --> 58
    IO 000001F2 --> 01 (IR = 09, phase = accept CDB)

Send CDB 46 (data read)
    IO 000001F0 <-- 00000046 Cdb[0] I/O 32
    IO 000001F0 <-- 00000000 Cdb[1] I/O 32
    IO 000001F0 <-- 00000008 Cdb[2] I/O 32 (allocation length = 8)
    
Interrupt
    IO 0000C002 --> 04
    IO 0000C002 <-- 04 (clear BM DMA)
    
    IO 000001F7 --> 58
    IO 000001F2 --> 02 (IR = 0A, phase = data read)
    
    IO 000001F4 --> 08
    IO 000001F5 --> 00 (data size = 8 bytes)

Read data (8 bytes)
    IO 000001F0 --> 48000000 Cdb[0] I/O 32
    IO 000001F0 --> 08000000 Cdb[1] I/O 32

Interrupt
    IO 0000C002 --> 04
    IO 0000C002 <-- 04 (clear BM DMA)
    
    Incorrect phase transition goes here:
-   IO 000001F7 --> 58
-   IO 000001F2 --> 02 (IR = 0A, phase = data read)

-   IO 000001F4 --> 08
-   IO 000001F5 --> 00 (data size = 8 bytes)
    
    Expected behavior:
+   IO 000001F7 --> 50
+   IO 000001F2 --> 03 (IR = 03, phase = status)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions