fix #1399: don't assert the oidlength returned from the network card driver, but simply return that the PacketRequest call failed in that case.

BTW: this is a serious bug in the specific network card driver of this report, it returned a buffer length LONGER than the provided buffer length one!

svn path=/trunk/; revision=20923
This commit is contained in:
Ulf Lamping 2007-02-25 12:50:21 +00:00
parent 66cf1f33e0
commit ecc5482c03
1 changed files with 11 additions and 4 deletions

View File

@ -242,9 +242,10 @@ wpcap_packet_request(void *adapter, ULONG Oid, int set, char *value, unsigned in
return 0;
}
/* get a buffer suitable for PacketRequest() */
OidData=GlobalAllocPtr(GMEM_MOVEABLE | GMEM_ZEROINIT,IoCtlBufferLength);
if (OidData == NULL) {
g_warning("packet_link_status failed\n");
g_warning("GlobalAllocPtr failed for %u\n", IoCtlBufferLength);
return 0;
}
@ -255,9 +256,15 @@ wpcap_packet_request(void *adapter, ULONG Oid, int set, char *value, unsigned in
Status = p_PacketRequest(adapter, set, OidData);
if(Status) {
g_assert(OidData->Length <= *length);
memcpy(value, OidData->Data, OidData->Length);
*length = OidData->Length;
if(OidData->Length <= *length) {
/* copy value from driver */
memcpy(value, OidData->Data, OidData->Length);
*length = OidData->Length;
} else {
/* the driver returned a value that is longer than expected (and longer than the given buffer) */
g_warning("returned oid too long, Oid: 0x%x OidLen:%u MaxLen:%u", Oid, OidData->Length, *length);
Status = FALSE;
}
}
GlobalFreePtr (OidData);