qemu-ga patch queue for 2.11

* fix potential overflow in network interface stats reporting
 -----BEGIN PGP SIGNATURE-----
 
 iQE3BAABCAAhBQJaE0FlGhxtZHJvdGhAbGludXgudm5ldC5pYm0uY29tAAoJEDNT
 yc7xCLWEr8oH/3P7maloO7NE9+i23jrxQvVPoIlWxnABzDEJhjMFlfMEj39z67um
 4/hRuao0v0qmImGqEbq7WYiseFRIytAgXZRDQ+ra7bwsOxyfxZs8x9voqNtLu5ua
 cu6rPJ2Z3xkAyaW+nwx3od5qHvhBL4fn2SVzo14k2a6nKeNR53jlqk2Q4iwTh/Yd
 KWuOUjIRjR0ffeRD/A5Y8+j4HU9lbO/3qW9aYCiCfPuGmWCjCZli0bvlDem9hiSC
 Rgs2c7+7v08xXUH9QiVnkKUcvJm656pRWksoODKyThPV0zyRCUU/KDBGEZxzWlyb
 unrnenRy7GMd/3bMDwt3Rd5a0IfUgjmrFmo=
 =b/7c
 -----END PGP SIGNATURE-----

Merge remote-tracking branch 'remotes/mdroth/tags/qga-pull-2017-11-20-tag' into staging

qemu-ga patch queue for 2.11

* fix potential overflow in network interface stats reporting

# gpg: Signature made Mon 20 Nov 2017 20:56:05 GMT
# gpg:                using RSA key 0x3353C9CEF108B584
# gpg: Good signature from "Michael Roth <flukshun@gmail.com>"
# gpg:                 aka "Michael Roth <mdroth@utexas.edu>"
# gpg:                 aka "Michael Roth <mdroth@linux.vnet.ibm.com>"
# Primary key fingerprint: CEAC C9E1 5534 EBAB B82D  3FA0 3353 C9CE F108 B584

* remotes/mdroth/tags/qga-pull-2017-11-20-tag:
  qga: replace GetIfEntry with GetIfEntry2 for interface stats

Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
master
Peter Maydell 2017-11-21 11:20:06 +00:00
commit a61d343986
1 changed files with 38 additions and 16 deletions

View File

@ -1169,24 +1169,46 @@ static DWORD get_interface_index(const char *guid)
return index;
}
}
typedef NETIOAPI_API (WINAPI *GetIfEntry2Func)(PMIB_IF_ROW2 Row);
static int guest_get_network_stats(const char *name,
GuestNetworkInterfaceStat *stats)
GuestNetworkInterfaceStat *stats)
{
DWORD if_index = 0;
MIB_IFROW a_mid_ifrow;
memset(&a_mid_ifrow, 0, sizeof(a_mid_ifrow));
if_index = get_interface_index(name);
a_mid_ifrow.dwIndex = if_index;
if (NO_ERROR == GetIfEntry(&a_mid_ifrow)) {
stats->rx_bytes = a_mid_ifrow.dwInOctets;
stats->rx_packets = a_mid_ifrow.dwInUcastPkts;
stats->rx_errs = a_mid_ifrow.dwInErrors;
stats->rx_dropped = a_mid_ifrow.dwInDiscards;
stats->tx_bytes = a_mid_ifrow.dwOutOctets;
stats->tx_packets = a_mid_ifrow.dwOutUcastPkts;
stats->tx_errs = a_mid_ifrow.dwOutErrors;
stats->tx_dropped = a_mid_ifrow.dwOutDiscards;
return 0;
OSVERSIONINFO os_ver;
os_ver.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
GetVersionEx(&os_ver);
if (os_ver.dwMajorVersion >= 6) {
MIB_IF_ROW2 a_mid_ifrow;
GetIfEntry2Func getifentry2_ex;
DWORD if_index = 0;
HMODULE module = GetModuleHandle("iphlpapi");
PVOID func = GetProcAddress(module, "GetIfEntry2");
if (func == NULL) {
return -1;
}
getifentry2_ex = (GetIfEntry2Func)func;
if_index = get_interface_index(name);
if (if_index == (DWORD)~0) {
return -1;
}
memset(&a_mid_ifrow, 0, sizeof(a_mid_ifrow));
a_mid_ifrow.InterfaceIndex = if_index;
if (NO_ERROR == getifentry2_ex(&a_mid_ifrow)) {
stats->rx_bytes = a_mid_ifrow.InOctets;
stats->rx_packets = a_mid_ifrow.InUcastPkts;
stats->rx_errs = a_mid_ifrow.InErrors;
stats->rx_dropped = a_mid_ifrow.InDiscards;
stats->tx_bytes = a_mid_ifrow.OutOctets;
stats->tx_packets = a_mid_ifrow.OutUcastPkts;
stats->tx_errs = a_mid_ifrow.OutErrors;
stats->tx_dropped = a_mid_ifrow.OutDiscards;
return 0;
}
}
return -1;
}