hrev43392 adds 1 changeset to branch 'master' old head: e6f22646a34d4f25729b547891c98e71a9d6ecff new head: 44954094997c3f1e7ceb8c9826768b679f87152d ---------------------------------------------------------------------------- 4495409: Abort the request instead of crashing when out of memory. [ Michael Lotz <mmlr@xxxxxxxx> ] ---------------------------------------------------------------------------- Revision: hrev43392 Commit: 44954094997c3f1e7ceb8c9826768b679f87152d URL: http://cgit.haiku-os.org/haiku/commit/?id=4495409 Author: Michael Lotz <mmlr@xxxxxxxx> Date: Sat Dec 3 21:51:36 2011 UTC ---------------------------------------------------------------------------- 1 files changed, 19 insertions(+), 0 deletions(-) src/add-ons/kernel/busses/scsi/ahci/ahci_port.cpp | 19 +++++++++++++++++ ---------------------------------------------------------------------------- diff --git a/src/add-ons/kernel/busses/scsi/ahci/ahci_port.cpp b/src/add-ons/kernel/busses/scsi/ahci/ahci_port.cpp index 43637e9..4d4f7be 100644 --- a/src/add-ons/kernel/busses/scsi/ahci/ahci_port.cpp +++ b/src/add-ons/kernel/busses/scsi/ahci/ahci_port.cpp @@ -659,6 +659,13 @@ AHCIPort::ScsiSynchronizeCache(scsi_ccb *request) //TRACE("AHCIPort::ScsiSynchronizeCache port %d\n", fIndex); sata_request *sreq = new(std::nothrow) sata_request(request); + if (sreq == NULL) { + TRACE("out of memory when allocating sync request\n"); + request->subsys_status = SCSI_REQ_ABORTED; + gSCSI->finished(request, 1); + return; + } + sreq->set_ata_cmd(fUse48BitCommands ? 0xea : 0xe7); // Flush Cache ExecuteSataRequest(sreq); } @@ -716,6 +723,11 @@ AHCIPort::ScsiReadWrite(scsi_ccb *request, uint64 lba, size_t sectorCount, ASSERT(request->data_length == sectorCount * 512); sata_request *sreq = new(std::nothrow) sata_request(request); + if (sreq == NULL) { + TRACE("out of memory when allocating read/write request\n"); + request->subsys_status = SCSI_REQ_ABORTED; + gSCSI->finished(request, 1); + } if (fUse48BitCommands) { if (sectorCount > 65536) { @@ -858,6 +870,13 @@ AHCIPort::ScsiExecuteRequest(scsi_ccb *request) // TRACE("AHCIPort::ScsiExecuteRequest ATAPI: port %d, opcode 0x%02x, length %u\n", fIndex, request->cdb[0], request->cdb_length); sata_request *sreq = new(std::nothrow) sata_request(request); + if (sreq == NULL) { + TRACE("out of memory when allocating atapi request\n"); + request->subsys_status = SCSI_REQ_ABORTED; + gSCSI->finished(request, 1); + return; + } + sreq->set_atapi_cmd(request->data_length); // uint8 *data = (uint8*) sreq->ccb()->cdb; // for (int i = 0; i < 16; i += 8) {