Skip to content

Commit f3098a5

Browse files
committed
Networking/VBoxNetSlirpNAT: Fixed a memory leak occurring on every start; renamed variables to emphasize that these are class members and in fact in use.
svn:sync-xref-src-repo-rev: r173858
1 parent 166cd60 commit f3098a5

1 file changed

Lines changed: 29 additions & 19 deletions

File tree

src/VBox/NetworkServices/NAT/VBoxNetSlirpNAT.cpp

Lines changed: 29 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
/* $Id: VBoxNetSlirpNAT.cpp 114049 2026-04-30 08:22:00Z andreas.loeffler@oracle.com $ */
1+
/* $Id: VBoxNetSlirpNAT.cpp 114053 2026-04-30 10:34:45Z andreas.loeffler@oracle.com $ */
22
/** @file
33
* VBoxNetNAT - NAT Service for connecting to IntNet.
44
*/
@@ -189,10 +189,11 @@ class VBoxNetSlirpNAT
189189
unsigned int nsock;
190190

191191
Slirp *m_pSlirp;
192-
struct pollfd *polls;
193192

194-
/** Num Polls (not bytes) */
195-
unsigned int uPollCap = 0;
193+
/** Array of poll descriptors. */
194+
struct pollfd *m_paPollFd;
195+
/** Number of poll descriptors in m_paPollFd. */
196+
unsigned int m_cPollFd = 0;
196197

197198
/** List of timers (in reverse creation order).
198199
* @note There is currently only one libslirp timer (v4.8 / 2025-01-16). */
@@ -336,6 +337,11 @@ VBoxNetSlirpNAT::VBoxNetSlirpNAT()
336337
pTimerHead = NULL;
337338
nsock = 0;
338339

340+
m_cPollFd = 64;
341+
m_paPollFd = (struct pollfd *)RTMemAllocZ(m_cPollFd * sizeof(struct pollfd));
342+
if (!m_paPollFd)
343+
throw VERR_NO_MEMORY;
344+
339345
m_MacAddress.au8[0] = 0x52;
340346
m_MacAddress.au8[1] = 0x54;
341347
m_MacAddress.au8[2] = 0;
@@ -357,6 +363,10 @@ VBoxNetSlirpNAT::~VBoxNetSlirpNAT()
357363
RTMemFree(m_ProxyOptions.outbound_addr);
358364
m_ProxyOptions.outbound_addr = NULL;
359365
}
366+
367+
RTMemFree(m_paPollFd);
368+
m_paPollFd = NULL;
369+
m_cPollFd = 0;
360370
}
361371

362372

@@ -2115,24 +2125,24 @@ void VBoxNetSlirpNAT::slirpNotifyPollThread(const char *pszWho)
21152125
{
21162126
VBoxNetSlirpNAT *pThis = static_cast<VBoxNetSlirpNAT *>(opaque);
21172127

2118-
if (pThis->nsock + 1 >= pThis->uPollCap)
2128+
if (pThis->nsock + 1 >= pThis->m_cPollFd)
21192129
{
2120-
size_t cbNew = pThis->uPollCap * 2 * sizeof(struct pollfd);
2121-
struct pollfd *pvNew = (struct pollfd *)RTMemRealloc(pThis->polls, cbNew);
2130+
size_t cbNew = pThis->m_cPollFd * 2 * sizeof(struct pollfd);
2131+
struct pollfd *pvNew = (struct pollfd *)RTMemRealloc(pThis->m_paPollFd, cbNew);
21222132
if (pvNew)
21232133
{
2124-
pThis->polls = pvNew;
2125-
pThis->uPollCap *= 2;
2134+
pThis->m_paPollFd = pvNew;
2135+
pThis->m_cPollFd *= 2;
21262136
}
21272137
else
21282138
return -1;
21292139
}
21302140

21312141
unsigned int uIdx = pThis->nsock;
21322142
Assert(uIdx < INT_MAX);
2133-
pThis->polls[uIdx].fd = hFd;
2134-
pThis->polls[uIdx].events = pollEventSlirpToHost(iEvents);
2135-
pThis->polls[uIdx].revents = 0;
2143+
pThis->m_paPollFd[uIdx].fd = hFd;
2144+
pThis->m_paPollFd[uIdx].events = pollEventSlirpToHost(iEvents);
2145+
pThis->m_paPollFd[uIdx].revents = 0;
21362146
pThis->nsock += 1;
21372147
return uIdx;
21382148
}
@@ -2150,7 +2160,7 @@ void VBoxNetSlirpNAT::slirpNotifyPollThread(const char *pszWho)
21502160
/*static*/ int VBoxNetSlirpNAT::slirpGetREventsCb(int idx, void *opaque) RT_NOTHROW_DEF
21512161
{
21522162
VBoxNetSlirpNAT *pThis = static_cast<VBoxNetSlirpNAT *>(opaque);
2153-
struct pollfd* polls = pThis->polls;
2163+
struct pollfd* polls = pThis->m_paPollFd;
21542164
return pollEventHostToSlirp(polls[idx].revents);
21552165
}
21562166

@@ -2239,9 +2249,9 @@ VBoxNetSlirpNAT::pollThread(RTTHREAD hThreadSelf, void *pvUser)
22392249
RTHCINTPTR const i64NativeReadPipe = RTPipeToNative(pThis->m_hPipeRead);
22402250
int const fdNativeReadPipe = (int)i64NativeReadPipe;
22412251
Assert(fdNativeReadPipe == i64NativeReadPipe); Assert(fdNativeReadPipe >= 0);
2242-
pThis->polls[0].fd = fdNativeReadPipe;
2243-
pThis->polls[0].events = POLLRDNORM | POLLPRI | POLLRDBAND;
2244-
pThis->polls[0].revents = 0;
2252+
pThis->m_paPollFd[0].fd = fdNativeReadPipe;
2253+
pThis->m_paPollFd[0].events = POLLRDNORM | POLLPRI | POLLRDBAND;
2254+
pThis->m_paPollFd[0].revents = 0;
22452255
#endif /* !RT_OS_WINDOWS */
22462256

22472257
/*
@@ -2259,9 +2269,9 @@ VBoxNetSlirpNAT::pollThread(RTTHREAD hThreadSelf, void *pvUser)
22592269
cMsTimeout = pThis->slirpTimersAdjustTimeoutDown(cMsTimeout);
22602270

22612271
#ifdef RT_OS_WINDOWS
2262-
int cChangedFDs = WSAPoll(pThis->polls, pThis->nsock, cMsTimeout);
2272+
int cChangedFDs = WSAPoll(pThis->m_paPollFd, pThis->nsock, cMsTimeout);
22632273
#else
2264-
int cChangedFDs = poll(pThis->polls, pThis->nsock, cMsTimeout);
2274+
int cChangedFDs = poll(pThis->m_paPollFd, pThis->nsock, cMsTimeout);
22652275
#endif
22662276
if (cChangedFDs < 0)
22672277
{
@@ -2290,7 +2300,7 @@ VBoxNetSlirpNAT::pollThread(RTTHREAD hThreadSelf, void *pvUser)
22902300
/*
22912301
* Drain the control pipe if necessary.
22922302
*/
2293-
if (pThis->polls[0].revents & (POLLIN|POLLRDNORM|POLLPRI|POLLRDBAND)) /* POLLPRI won't be seen with WSAPoll. */
2303+
if (pThis->m_paPollFd[0].revents & (POLLIN|POLLRDNORM|POLLPRI|POLLRDBAND)) /* POLLPRI won't be seen with WSAPoll. */
22942304
{
22952305
char achBuf[1024];
22962306
size_t cbRead;

0 commit comments

Comments
 (0)