/*
LUFA Library
- Copyright (C) Dean Camera, 2019.
+ Copyright (C) Dean Camera, 2021.
dean [at] fourwalledcubicle [dot] com
www.lufa-lib.org
*/
/*
- Copyright 2019 Dean Camera (dean [at] fourwalledcubicle [dot] com)
+ Copyright 2021 Dean Camera (dean [at] fourwalledcubicle [dot] com)
Permission to use, copy, modify, distribute, and sell this
software and its documentation for any purpose is hereby granted
case RNDIS_REQ_SendEncapsulatedCommand:
if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE))
{
+ if (USB_ControlRequest.wLength >= sizeof(RNDISInterfaceInfo->Config.MessageBuffer))
+ break;
+
Endpoint_ClearSETUP();
Endpoint_Read_Control_Stream_LE(RNDISInterfaceInfo->Config.MessageBuffer, USB_ControlRequest.wLength);
Endpoint_ClearIN();
uint8_t RNDIS_Device_ReadPacket(USB_ClassInfo_RNDIS_Device_t* const RNDISInterfaceInfo,
void* Buffer,
- uint16_t* const PacketLength)
+ const uint16_t BufferSize,
+ uint16_t* PacketLength)
{
if ((USB_DeviceState != DEVICE_STATE_Configured) ||
(RNDISInterfaceInfo->State.CurrRNDISState != RNDIS_Data_Initialized))
return ENDPOINT_RWSTREAM_DeviceDisconnected;
}
- Endpoint_SelectEndpoint(RNDISInterfaceInfo->Config.DataOUTEndpoint.Address);
-
*PacketLength = 0;
+ Endpoint_SelectEndpoint(RNDISInterfaceInfo->Config.DataOUTEndpoint.Address);
+
if (!(Endpoint_IsOUTReceived()))
return ENDPOINT_RWSTREAM_NoError;
return RNDIS_ERROR_LOGICAL_CMD_FAILED;
}
- *PacketLength = (uint16_t)le32_to_cpu(RNDISPacketHeader.DataLength);
+ const size_t ExpectedLength = (uint16_t)le32_to_cpu(RNDISPacketHeader.DataLength);
+
+ if (ExpectedLength > BufferSize)
+ *PacketLength = BufferSize;
+ else
+ *PacketLength = ExpectedLength;
Endpoint_Read_Stream_LE(Buffer, *PacketLength, NULL);
+ if (ExpectedLength > BufferSize)
+ Endpoint_Discard_Stream(ExpectedLength - BufferSize, NULL);
Endpoint_ClearOUT();
return ENDPOINT_RWSTREAM_NoError;