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