--- a/libpurple/win32/libc_interface.c Fri Nov 04 23:51:59 2022 -0500
+++ b/libpurple/win32/libc_interface.c Mon Nov 28 20:26:05 2022 -0600
@@ -228,9 +228,11 @@
struct ifconf *ifc = val;
char *tmp = ifc->ifc_buf;
- nBytesReturned / sizeof(INTERFACE_INFO);
- for (i = 0; i < nNumInterfaces; i++) {
+ int nReturnInterfaces = 0; + nReturnInterfaces = MIN(nBytesReturned / sizeof(INTERFACE_INFO), + ifc->ifc_len / sizeof(struct ifreq)); + for (i = 0; i < nReturnInterfaces; i++) { INTERFACE_INFO ii = InterfaceList[i];
struct ifreq *ifr = (struct ifreq *) tmp;
struct sockaddr_in *sa = (struct sockaddr_in *) &ifr->ifr_addr;
@@ -239,14 +241,9 @@
sa->sin_port = ii.iiAddress.AddressIn.sin_port;
sa->sin_addr.s_addr = ii.iiAddress.AddressIn.sin_addr.s_addr;
tmp += sizeof(struct ifreq);
- /* Make sure that we can fit in the original buffer */
- if (tmp >= (ifc->ifc_buf + ifc->ifc_len + sizeof(struct ifreq))) {
/* Replace the length with the actually used length */
- ifc->ifc_len = ifc->ifc_len - (ifc->ifc_buf - tmp);
+ ifc->ifc_len = nReturnInterfaces * sizeof(struct ifreq);