[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [win-pv-devel] [PATCH 2/3] OID handling improvements
The query OID code contains several mistakes in setting BytesNeeded and BytesWritten. This patch re-factors the code slightly to fix those mistakes and also adds warnings is the stack tries to query or set an OID that we do not handle. Signed-off-by: Paul Durrant <paul.durrant@xxxxxxxxxx> --- src/xennet/adapter.c | 177 ++++++++++++++++++++++++++++++++------------------- 1 file changed, 110 insertions(+), 67 deletions(-) diff --git a/src/xennet/adapter.c b/src/xennet/adapter.c index f96386c..c2df640 100644 --- a/src/xennet/adapter.c +++ b/src/xennet/adapter.c @@ -30,6 +30,7 @@ */ #include <ndis.h> +#include <stdlib.h> #include "adapter.h" #include "transmitter.h" #include "receiver.h" @@ -1064,15 +1065,17 @@ AdapterSetInformation( IN PNDIS_OID_REQUEST Request ) { - PVOID Buffer; - ULONG BufferLength; - ULONG BytesNeeded; - ULONG BytesRead; - NDIS_STATUS ndisStatus; + PVOID Buffer; + ULONG BufferLength; + ULONG BytesNeeded; + ULONG BytesRead; + BOOLEAN Warn; + NDIS_STATUS ndisStatus; Buffer = Request->DATA.SET_INFORMATION.InformationBuffer; BufferLength = Request->DATA.SET_INFORMATION.InformationBufferLength; BytesNeeded = BytesRead = 0; + Warn = TRUE; ndisStatus = NDIS_STATUS_SUCCESS; switch (Request->DATA.SET_INFORMATION.Oid) { @@ -1134,7 +1137,12 @@ AdapterSetInformation( case OID_GEN_INTERRUPT_MODERATION: case OID_GEN_MACHINE_NAME: + Warn = FALSE; + /*FALLTHRU*/ default: + if (Warn) + Warning("UNSUPPORTED OID %08x\n", Request->DATA.QUERY_INFORMATION.Oid); + ndisStatus = NDIS_STATUS_NOT_SUPPORTED; break; } @@ -1148,61 +1156,55 @@ AdapterSetInformation( static FORCEINLINE NDIS_STATUS __CopyBuffer( - IN PVOID Buffer, - IN ULONG BufferLength, - IN PVOID Source, - IN ULONG SourceLength + IN PVOID Destination, + IN ULONG DestinationLength, + IN PVOID Source, + IN ULONG SourceLength, + OUT PULONG CopyLength ) { - if (BufferLength >= SourceLength) { - RtlCopyMemory(Buffer, Source, SourceLength); - return NDIS_STATUS_SUCCESS; - } + *CopyLength = __min(SourceLength, DestinationLength); + RtlCopyMemory(Destination, Source, *CopyLength); - RtlCopyMemory(Buffer, Source, BufferLength); - return NDIS_STATUS_BUFFER_TOO_SHORT; + return (DestinationLength >= SourceLength) ? + NDIS_STATUS_SUCCESS : + NDIS_STATUS_BUFFER_TOO_SHORT; } static FORCEINLINE NDIS_STATUS __SetUlong( - IN PVOID Buffer, - IN ULONG BufferLength, - IN ULONG Source, - IN OUT PULONG SourceLength + IN PVOID Destination, + IN ULONG DestinationLength, + IN ULONG Source, + OUT PULONG CopyLength ) { - *SourceLength = sizeof(ULONG); - - if (BufferLength >= sizeof(ULONG)) { - *(PULONG)Buffer = (ULONG)Source; - return NDIS_STATUS_SUCCESS; - } - - return NDIS_STATUS_BUFFER_TOO_SHORT; + return __CopyBuffer(Destination, + DestinationLength & ~3, + &Source, + sizeof (ULONG), + CopyLength); } static FORCEINLINE NDIS_STATUS __SetUlong64( - IN PVOID Buffer, - IN ULONG BufferLength, - IN ULONGLONG Source, - IN OUT PULONG SourceLength + IN PVOID Destination, + IN ULONG DestinationLength, + IN ULONG64 Source, + OUT PULONG CopyLength ) { - *SourceLength = sizeof(ULONGLONG); - - if (BufferLength >= sizeof(ULONGLONG)) { - *(PULONGLONG)Buffer = Source; - return NDIS_STATUS_SUCCESS; - } + NDIS_STATUS ndisStatus; - if (BufferLength >= sizeof(ULONG)) { - *(PULONG)Buffer = (ULONG)Source; - *SourceLength = sizeof(ULONG); - return NDIS_STATUS_SUCCESS; - } + ndisStatus = __CopyBuffer(Destination, + DestinationLength & ~3, + &Source, + sizeof (ULONG64), + CopyLength); + if (DestinationLength >= 4) + ndisStatus = NDIS_STATUS_SUCCESS; - return NDIS_STATUS_BUFFER_TOO_SHORT; + return ndisStatus; } NDIS_STATUS @@ -1211,27 +1213,30 @@ AdapterQueryInformation( IN PNDIS_OID_REQUEST Request ) { - PVOID Buffer; - ULONG BufferLength; - ULONG BytesNeeded; - ULONG BytesWritten; - ULONG Value32; - ULONGLONG Value64; - ETHERNET_ADDRESS EthernetAddress; - NDIS_STATUS ndisStatus; + PVOID Buffer; + ULONG BufferLength; + ULONG BytesNeeded; + ULONG BytesWritten; + ULONG Value32; + ULONGLONG Value64; + ETHERNET_ADDRESS EthernetAddress; + BOOLEAN Warn; + NDIS_STATUS ndisStatus; Buffer = Request->DATA.QUERY_INFORMATION.InformationBuffer; BufferLength = Request->DATA.QUERY_INFORMATION.InformationBufferLength; - BytesNeeded = BytesWritten = sizeof(ULONG); + BytesNeeded = BytesWritten = 0; + Warn = TRUE; ndisStatus = NDIS_STATUS_SUCCESS; switch (Request->DATA.QUERY_INFORMATION.Oid) { case OID_PNP_CAPABILITIES: - BytesNeeded = BytesWritten = sizeof(Adapter->Capabilities); + BytesNeeded = sizeof(Adapter->Capabilities); ndisStatus = __CopyBuffer(Buffer, BufferLength, &Adapter->Capabilities, - BytesWritten); + BytesNeeded, + &BytesWritten); break; case OID_PNP_QUERY_POWER: @@ -1241,14 +1246,16 @@ AdapterQueryInformation( break; case OID_GEN_SUPPORTED_LIST: - BytesNeeded = BytesWritten = sizeof(XennetSupportedOids); + BytesNeeded = sizeof(XennetSupportedOids); ndisStatus = __CopyBuffer(Buffer, BufferLength, &XennetSupportedOids[0], - BytesWritten); + BytesNeeded, + &BytesWritten); break; case OID_GEN_HARDWARE_STATUS: + BytesNeeded = sizeof(ULONG); ndisStatus = __SetUlong(Buffer, BufferLength, NdisHardwareStatusReady, @@ -1257,6 +1264,7 @@ AdapterQueryInformation( case OID_GEN_MEDIA_SUPPORTED: case OID_GEN_MEDIA_IN_USE: + BytesNeeded = sizeof(ULONG); ndisStatus = __SetUlong(Buffer, BufferLength, XENNET_MEDIA_TYPE, @@ -1266,6 +1274,7 @@ AdapterQueryInformation( case OID_GEN_MAXIMUM_LOOKAHEAD: case OID_GEN_TRANSMIT_BLOCK_SIZE: case OID_GEN_RECEIVE_BLOCK_SIZE: + BytesNeeded = sizeof(ULONG); ndisStatus = __SetUlong(Buffer, BufferLength, Adapter->MaximumFrameSize, @@ -1278,6 +1287,7 @@ AdapterQueryInformation( &Adapter->VifInterface, (PULONG)&Value32); Value32 *= Adapter->MaximumFrameSize; + BytesNeeded = sizeof(ULONG); ndisStatus = __SetUlong(Buffer, BufferLength, Value32, @@ -1285,14 +1295,16 @@ AdapterQueryInformation( break; case OID_GEN_VENDOR_DESCRIPTION: - BytesNeeded = BytesWritten = (ULONG)strlen(COMPANY_NAME_STR) + 1; + BytesNeeded = (ULONG)strlen(COMPANY_NAME_STR) + 1; ndisStatus = __CopyBuffer(Buffer, BufferLength, COMPANY_NAME_STR, - BytesWritten); + BytesNeeded, + &BytesWritten); break; case OID_GEN_VENDOR_DRIVER_VERSION: + BytesNeeded = sizeof(ULONG); ndisStatus = __SetUlong(Buffer, BufferLength, ((MAJOR_VERSION << 8) | MINOR_VERSION) << 8, @@ -1300,6 +1312,7 @@ AdapterQueryInformation( break; case OID_GEN_DRIVER_VERSION: + BytesNeeded = sizeof(ULONG); ndisStatus = __SetUlong(Buffer, BufferLength, (6 << 8) | 0, // NDIS 6.0 @@ -1307,6 +1320,7 @@ AdapterQueryInformation( break; case OID_GEN_MAC_OPTIONS: + BytesNeeded = sizeof(ULONG); ndisStatus = __SetUlong(Buffer, BufferLength, XENNET_MAC_OPTIONS, @@ -1314,7 +1328,7 @@ AdapterQueryInformation( break; case OID_GEN_STATISTICS: - BytesNeeded = BytesWritten = sizeof(NDIS_STATISTICS_INFO); + BytesNeeded = sizeof(NDIS_STATISTICS_INFO); ndisStatus = AdapterQueryGeneralStatistics(Adapter, (PNDIS_STATISTICS_INFO)Buffer, BufferLength, @@ -1333,25 +1347,28 @@ AdapterQueryInformation( XENVIF_VIF(MacQueryPermanentAddress, &Adapter->VifInterface, &EthernetAddress); - BytesNeeded = BytesWritten = sizeof(ETHERNET_ADDRESS); + BytesNeeded = sizeof(ETHERNET_ADDRESS); ndisStatus = __CopyBuffer(Buffer, BufferLength, &EthernetAddress, - BytesWritten); + BytesNeeded, + &BytesWritten); break; case OID_802_3_CURRENT_ADDRESS: XENVIF_VIF(MacQueryCurrentAddress, &Adapter->VifInterface, &EthernetAddress); - BytesNeeded = BytesWritten = sizeof(ETHERNET_ADDRESS); + BytesNeeded = sizeof(ETHERNET_ADDRESS); ndisStatus = __CopyBuffer(Buffer, BufferLength, &EthernetAddress, - BytesWritten); + BytesNeeded, + &BytesWritten); break; case OID_GEN_MAXIMUM_FRAME_SIZE: + BytesNeeded = sizeof(ULONG); ndisStatus = __SetUlong(Buffer, BufferLength, Adapter->MaximumFrameSize - @@ -1360,6 +1377,7 @@ AdapterQueryInformation( break; case OID_GEN_MAXIMUM_TOTAL_SIZE: + BytesNeeded = sizeof(ULONG); ndisStatus = __SetUlong(Buffer, BufferLength, Adapter->MaximumFrameSize - @@ -1369,6 +1387,7 @@ AdapterQueryInformation( break; case OID_GEN_CURRENT_LOOKAHEAD: + BytesNeeded = sizeof(ULONG); ndisStatus = __SetUlong(Buffer, BufferLength, Adapter->CurrentLookahead, @@ -1376,6 +1395,7 @@ AdapterQueryInformation( break; case OID_GEN_VENDOR_ID: + BytesNeeded = sizeof(ULONG); ndisStatus = __SetUlong(Buffer, BufferLength, 0x5853, @@ -1388,6 +1408,7 @@ AdapterQueryInformation( NULL, &Value64, NULL); + BytesNeeded = sizeof(ULONG); ndisStatus = __SetUlong(Buffer, BufferLength, (ULONG)(Value64 / 100), @@ -1400,6 +1421,7 @@ AdapterQueryInformation( (PNET_IF_MEDIA_CONNECT_STATE)&Value32, NULL, NULL); + BytesNeeded = sizeof(ULONG); ndisStatus = __SetUlong(Buffer, BufferLength, Value32, @@ -1407,6 +1429,7 @@ AdapterQueryInformation( break; case OID_GEN_MAXIMUM_SEND_PACKETS: + BytesNeeded = sizeof(ULONG); ndisStatus = __SetUlong(Buffer, BufferLength, 16, @@ -1415,6 +1438,7 @@ AdapterQueryInformation( case OID_GEN_CURRENT_PACKET_FILTER: AdapterGetPacketFilter(Adapter, &Value32); + BytesNeeded = sizeof(ULONG); ndisStatus = __SetUlong(Buffer, BufferLength, Value32, @@ -1423,6 +1447,7 @@ AdapterQueryInformation( case OID_GEN_XMIT_OK: AdapterGetXmitOk(Adapter, &Value64); + BytesNeeded = sizeof(ULONG64); ndisStatus = __SetUlong64(Buffer, BufferLength, Value64, @@ -1431,6 +1456,7 @@ AdapterQueryInformation( case OID_GEN_RCV_OK: AdapterGetRcvOk(Adapter, &Value64); + BytesNeeded = sizeof(ULONG64); ndisStatus = __SetUlong64(Buffer, BufferLength, Value64, @@ -1439,6 +1465,7 @@ AdapterQueryInformation( case OID_GEN_XMIT_ERROR: AdapterGetXmitError(Adapter, &Value32); + BytesNeeded = sizeof(ULONG); ndisStatus = __SetUlong(Buffer, BufferLength, Value32, @@ -1447,6 +1474,7 @@ AdapterQueryInformation( case OID_GEN_RCV_ERROR: AdapterGetRcvError(Adapter, &Value32); + BytesNeeded = sizeof(ULONG); ndisStatus = __SetUlong(Buffer, BufferLength, Value32, @@ -1459,6 +1487,7 @@ AdapterQueryInformation( case OID_802_3_RCV_ERROR_ALIGNMENT: case OID_802_3_XMIT_ONE_COLLISION: case OID_802_3_XMIT_MORE_COLLISIONS: + BytesNeeded = sizeof(ULONG); ndisStatus = __SetUlong(Buffer, BufferLength, 0, @@ -1466,6 +1495,7 @@ AdapterQueryInformation( break; case OID_802_3_MAXIMUM_LIST_SIZE: + BytesNeeded = sizeof(ULONG); ndisStatus = __SetUlong(Buffer, BufferLength, 32, @@ -1477,6 +1507,7 @@ AdapterQueryInformation( &Adapter->VifInterface, XENVIF_TRANSMITTER_UNICAST_OCTETS, &Value64); + BytesNeeded = sizeof(ULONG); ndisStatus = __SetUlong(Buffer, BufferLength, (ULONG)Value64, @@ -1488,6 +1519,7 @@ AdapterQueryInformation( &Adapter->VifInterface, XENVIF_TRANSMITTER_UNICAST_PACKETS, &Value64); + BytesNeeded = sizeof(ULONG); ndisStatus = __SetUlong(Buffer, BufferLength, (ULONG)Value64, @@ -1499,6 +1531,7 @@ AdapterQueryInformation( &Adapter->VifInterface, XENVIF_TRANSMITTER_MULTICAST_OCTETS, &Value64); + BytesNeeded = sizeof(ULONG); ndisStatus = __SetUlong(Buffer, BufferLength, (ULONG)Value64, @@ -1510,6 +1543,7 @@ AdapterQueryInformation( &Adapter->VifInterface, XENVIF_TRANSMITTER_MULTICAST_PACKETS, &Value64); + BytesNeeded = sizeof(ULONG); ndisStatus = __SetUlong(Buffer, BufferLength, (ULONG)Value64, @@ -1521,6 +1555,7 @@ AdapterQueryInformation( &Adapter->VifInterface, XENVIF_TRANSMITTER_BROADCAST_OCTETS, &Value64); + BytesNeeded = sizeof(ULONG); ndisStatus = __SetUlong(Buffer, BufferLength, (ULONG)Value64, @@ -1532,6 +1567,7 @@ AdapterQueryInformation( &Adapter->VifInterface, XENVIF_TRANSMITTER_BROADCAST_PACKETS, &Value64); + BytesNeeded = sizeof(ULONG); ndisStatus = __SetUlong(Buffer, BufferLength, (ULONG)Value64, @@ -1543,6 +1579,7 @@ AdapterQueryInformation( &Adapter->VifInterface, XENVIF_RECEIVER_UNICAST_OCTETS, &Value64); + BytesNeeded = sizeof(ULONG); ndisStatus = __SetUlong(Buffer, BufferLength, (ULONG)Value64, @@ -1554,6 +1591,7 @@ AdapterQueryInformation( &Adapter->VifInterface, XENVIF_RECEIVER_UNICAST_PACKETS, &Value64); + BytesNeeded = sizeof(ULONG); ndisStatus = __SetUlong(Buffer, BufferLength, (ULONG)Value64, @@ -1565,6 +1603,7 @@ AdapterQueryInformation( &Adapter->VifInterface, XENVIF_RECEIVER_MULTICAST_OCTETS, &Value64); + BytesNeeded = sizeof(ULONG); ndisStatus = __SetUlong(Buffer, BufferLength, (ULONG)Value64, @@ -1576,6 +1615,7 @@ AdapterQueryInformation( &Adapter->VifInterface, XENVIF_RECEIVER_MULTICAST_PACKETS, &Value64); + BytesNeeded = sizeof(ULONG); ndisStatus = __SetUlong(Buffer, BufferLength, (ULONG)Value64, @@ -1587,6 +1627,7 @@ AdapterQueryInformation( &Adapter->VifInterface, XENVIF_RECEIVER_BROADCAST_OCTETS, &Value64); + BytesNeeded = sizeof(ULONG); ndisStatus = __SetUlong(Buffer, BufferLength, (ULONG)Value64, @@ -1598,6 +1639,7 @@ AdapterQueryInformation( &Adapter->VifInterface, XENVIF_RECEIVER_BROADCAST_PACKETS, &Value64); + BytesNeeded = sizeof(ULONG); ndisStatus = __SetUlong(Buffer, BufferLength, (ULONG)Value64, @@ -1615,19 +1657,20 @@ AdapterQueryInformation( case OID_IP4_OFFLOAD_STATS: case OID_IP6_OFFLOAD_STATS: case OID_GEN_SUPPORTED_GUIDS: - // We don't handle these since NDIS 6.0 is supposed to do this for us case OID_GEN_MAC_ADDRESS: case OID_GEN_MAX_LINK_SPEED: - // ignore these common unwanted OIDs case OID_GEN_INIT_TIME_MS: case OID_GEN_RESET_COUNTS: case OID_GEN_MEDIA_SENSE_COUNTS: - + Warn = FALSE; + /*FALLTHRU*/ default: + if (Warn) + Warning("UNSUPPORTED OID %08x\n", Request->DATA.QUERY_INFORMATION.Oid); + ndisStatus = NDIS_STATUS_NOT_SUPPORTED; - BytesNeeded = 0; break; } -- 2.1.1 _______________________________________________ win-pv-devel mailing list win-pv-devel@xxxxxxxxxxxxxxxxxxxx http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |