nat_pmp: fix timeout if we passed the current deadline
getnatpmprequesttimeout can return a negative timeout if we passed
the current deadline. This can cause poll to wait forever and
can cause a deadlock if no data arrives.
git.jami.net/savoirfairelinux/jami-daemon/-/issues/991
Change-Id: Ie8b30f0dfb24022fe6f2d9e996dc099143b5387a
diff --git a/src/upnp/protocol/natpmp/nat_pmp.cpp b/src/upnp/protocol/natpmp/nat_pmp.cpp
index 77a3f4e..9d306bf 100644
--- a/src/upnp/protocol/natpmp/nat_pmp.cpp
+++ b/src/upnp/protocol/natpmp/nat_pmp.cpp
@@ -350,8 +350,11 @@
fds.fd = handle.s;
fds.events = POLLIN;
struct timeval timeout;
- getnatpmprequesttimeout(&handle, &timeout);
- uint64_t millis = (timeout.tv_sec * (uint64_t)1000) + (timeout.tv_usec / 1000);
+ err = getnatpmprequesttimeout(&handle, &timeout);
+ int millis = (timeout.tv_sec * 1000) + (timeout.tv_usec / 1000);
+ // Note, getnatpmprequesttimeout can be negative if previous deadline is passed.
+ if (err != 0 || millis < 0)
+ millis = 50;
// Wait for data.
if (_poll(&fds, 1, millis) == -1) {