prevent infinite loop in upnpDiscover()

fixes #488
This commit is contained in:
Thomas Bernard 2020-09-23 00:41:26 +02:00
parent a21a35e003
commit aa490867b3
No known key found for this signature in database
GPG Key ID: DB511043A31ACAAF
2 changed files with 77 additions and 59 deletions

View File

@ -1,6 +1,9 @@
$Id: Changelog.txt,v 1.242 2019/12/23 23:35:40 nanard Exp $ $Id: Changelog.txt,v 1.242 2019/12/23 23:35:40 nanard Exp $
miniUPnP client Changelog. miniUPnP client Changelog.
2020/09/23:
prevent infinite loop in upnpDiscover()
2020/02/16: 2020/02/16:
Add Haiku support Add Haiku support

View File

@ -10,6 +10,7 @@
#include <string.h> #include <string.h>
#include <stdlib.h> #include <stdlib.h>
#include <sys/types.h> #include <sys/types.h>
#include <sys/time.h>
#if defined (__NetBSD__) #if defined (__NetBSD__)
#include <net/if.h> #include <net/if.h>
#endif #endif
@ -841,7 +842,13 @@ ssdpDiscoverDevices(const char * const deviceTypes[],
/* Waiting for SSDP REPLY packet to M-SEARCH /* Waiting for SSDP REPLY packet to M-SEARCH
* if searchalltypes is set, enter the loop only * if searchalltypes is set, enter the loop only
* when the last deviceType is reached */ * when the last deviceType is reached */
if((sentok && !searchalltypes) || !deviceTypes[deviceIndex + 1]) do { if((sentok && !searchalltypes) || !deviceTypes[deviceIndex + 1]) {
struct timeval start, current;
if (gettimeofday(&start, NULL) < 0) {
start.tv_sec = 0;
start.tv_usec = 0;
}
do {
n = receivedata(sudp, bufr, sizeof(bufr), delay, &scope_id); n = receivedata(sudp, bufr, sizeof(bufr), delay, &scope_id);
if (n < 0) { if (n < 0) {
/* error */ /* error */
@ -906,8 +913,16 @@ ssdpDiscoverDevices(const char * const deviceTypes[],
tmp->scope_id = scope_id; tmp->scope_id = scope_id;
devlist = tmp; devlist = tmp;
} }
if (gettimeofday(&current, NULL) >= 0) {
/* exit the loop if delay is reached */
long interval = (current.tv_sec - start.tv_sec) * 1000;
interval += (current.tv_usec - start.tv_usec) / 1000;
if (interval > (long)delay)
break;
}
} }
} while(n > 0); } while(n > 0);
}
if(ipv6) { if(ipv6) {
/* switch linklocal flag */ /* switch linklocal flag */
if(linklocal) { if(linklocal) {