From 4c367833b4c1776f01eff3d51472a9889c85e1c5 Mon Sep 17 00:00:00 2001 From: Edward Welbourne Date: Mon, 20 Feb 2017 11:16:12 +0100 Subject: Fix multicastMembershipHelper to not assume addresses are IPv4 Make it iterate the addresses available looking for an IPv4 address, when that's what it needs, instead of just assuming the first entry in the list (when non-empty) is IPv4. Based on a suggestion by Dmitry Pankratov. Task-number: QTBUG-27641 Change-Id: I1920f68ade44a996ea5c2ed691a87ff3e686f35a Reviewed-by: Marc Mutz Reviewed-by: Timur Pocheptsov Reviewed-by: Thiago Macieira --- src/network/socket/qnativesocketengine_unix.cpp | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) (limited to 'src/network/socket/qnativesocketengine_unix.cpp') diff --git a/src/network/socket/qnativesocketengine_unix.cpp b/src/network/socket/qnativesocketengine_unix.cpp index d1efc21e09..e140b33ce9 100644 --- a/src/network/socket/qnativesocketengine_unix.cpp +++ b/src/network/socket/qnativesocketengine_unix.cpp @@ -679,10 +679,16 @@ static bool multicastMembershipHelper(QNativeSocketEnginePrivate *d, if (interface.isValid()) { const QList addressEntries = interface.addressEntries(); - if (!addressEntries.isEmpty()) { - QHostAddress firstIP = addressEntries.first().ip(); - mreq4.imr_interface.s_addr = htonl(firstIP.toIPv4Address()); - } else { + bool found = false; + for (const QNetworkAddressEntry &entry : addressEntries) { + const QHostAddress ip = entry.ip(); + if (ip.protocol() == QAbstractSocket::IPv4Protocol) { + mreq4.imr_interface.s_addr = htonl(ip.toIPv4Address()); + found = true; + break; + } + } + if (!found) { d->setError(QAbstractSocket::NetworkError, QNativeSocketEnginePrivate::NetworkUnreachableErrorString); return false; -- cgit v1.2.3