XHCI: Use InitKernelAccess/PrepareKernelAccess properly.

* Actually check return codes of InitKernelAccess().
 * WriteDescriptorChain accesses the memory in the IO vectors, so
   we need to PrepareKernelAccess before calling it.

Fixes #14752.
This commit is contained in:
Augustin Cavalier
2019-01-31 22:48:04 -05:00
parent 32d4274178
commit f7e2391702
+10 -8
View File
@@ -666,10 +666,12 @@ XHCI::SubmitControlRequest(Transfer *transfer)
TRACE_ERROR("Invalid Endpoint");
return B_BAD_VALUE;
}
setupDescriptor->transfer = transfer;
transfer->InitKernelAccess();
_LinkDescriptorForPipe(setupDescriptor, endpoint);
status_t status = transfer->InitKernelAccess();
if (status != B_OK)
return status;
setupDescriptor->transfer = transfer;
_LinkDescriptorForPipe(setupDescriptor, endpoint);
TRACE("SubmitControlRequest() request linked\n");
TRACE("Endpoint status 0x%08" B_PRIx32 " 0x%08" B_PRIx32 " 0x%016" B_PRIx64 "\n",
@@ -695,6 +697,10 @@ XHCI::SubmitNormalRequest(Transfer *transfer)
return B_BAD_VALUE;
bool directionIn = (pipe->Direction() == Pipe::In);
status_t status = transfer->InitKernelAccess();
if (status != B_OK)
return status;
int32 trbCount = 0;
xhci_td *descriptor = CreateDescriptorChain(transfer->DataLength(), trbCount);
if (descriptor == NULL)
@@ -740,18 +746,14 @@ XHCI::SubmitNormalRequest(Transfer *transfer)
if (!directionIn) {
TRACE("copying out iov count %ld\n", transfer->VectorCount());
transfer->PrepareKernelAccess();
WriteDescriptorChain(descriptor, transfer->Vector(),
transfer->VectorCount());
}
/* memcpy(descriptor->buffer_log[index],
(uint8 *)transfer->Vector()[index].iov_base, transfer->VectorLength());
}*/
xhci_endpoint *endpoint = (xhci_endpoint *)pipe->ControllerCookie();
descriptor->transfer = transfer;
transfer->InitKernelAccess();
_LinkDescriptorForPipe(descriptor, endpoint);
TRACE("SubmitNormalRequest() request linked\n");
TRACE("Endpoint status 0x%08" B_PRIx32 " 0x%08" B_PRIx32 " 0x%016" B_PRIx64 "\n",