From 3a151faec2c15785eb1eb5fee7275cd038b92ba9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pasi=20Pet=C3=A4j=C3=A4j=C3=A4rvi?= Date: Mon, 21 Feb 2022 12:19:49 +0200 Subject: [PATCH] QNX: Fix support for abstract Unix-domain socket As QNX claims to support abstract Unix-domain sockets, its getsockname always returns for socket that has not been bound to local name address_len of sun_path as maximum length (106) even when it does not contain valid address. https://www.qnx.com/developers/docs/7.1/index.html#com.qnx.doc.neutrino.lib_ref/topic/u/unix_proto.html Pick-to: 6.2 6.3 Change-Id: I0f0f5c05611c8db6af35377dde16450f58c83c56 Reviewed-by: Thiago Macieira --- src/network/kernel/qtnetworkglobal_p.h | 2 +- src/network/socket/qlocalserver_unix.cpp | 4 ++++ tests/auto/network/socket/qlocalsocket/tst_qlocalsocket.cpp | 4 ++-- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/network/kernel/qtnetworkglobal_p.h b/src/network/kernel/qtnetworkglobal_p.h index d1452ac704..6468b516b2 100644 --- a/src/network/kernel/qtnetworkglobal_p.h +++ b/src/network/kernel/qtnetworkglobal_p.h @@ -59,7 +59,7 @@ QT_BEGIN_NAMESPACE enum { -#ifdef Q_OS_LINUX +#if defined(Q_OS_LINUX) || defined(Q_OS_QNX) PlatformSupportsAbstractNamespace = true #else PlatformSupportsAbstractNamespace = false diff --git a/src/network/socket/qlocalserver_unix.cpp b/src/network/socket/qlocalserver_unix.cpp index 5840958350..b60f7d0ceb 100644 --- a/src/network/socket/qlocalserver_unix.cpp +++ b/src/network/socket/qlocalserver_unix.cpp @@ -239,6 +239,10 @@ bool QLocalServerPrivate::listen(qintptr socketDescriptor) QT_SOCKLEN_T len = sizeof(addr); memset(&addr, 0, sizeof(addr)); if (::getsockname(socketDescriptor, (sockaddr *)&addr, &len) == 0) { +#if defined(Q_OS_QNX) + if (addr.sun_path[0] == 0 && addr.sun_path[1] == 0) + len = SUN_LEN(&addr); +#endif if (QLocalSocketPrivate::parseSockaddr(addr, len, fullServerName, serverName, abstractAddress)) { QLocalServer::SocketOptions options = socketOptions.value(); diff --git a/tests/auto/network/socket/qlocalsocket/tst_qlocalsocket.cpp b/tests/auto/network/socket/qlocalsocket/tst_qlocalsocket.cpp index ba699242fd..afefa0fd30 100644 --- a/tests/auto/network/socket/qlocalsocket/tst_qlocalsocket.cpp +++ b/tests/auto/network/socket/qlocalsocket/tst_qlocalsocket.cpp @@ -1765,7 +1765,7 @@ void tst_QLocalSocket::verifyListenWithDescriptor() QLocalServer server; QVERIFY2(server.listen(listenSocket), "failed to start create QLocalServer with local socket"); -#ifdef Q_OS_LINUX +#if defined(Q_OS_LINUX) || defined(Q_OS_QNX) if (!bound) { QCOMPARE(server.serverName().isEmpty(), true); QCOMPARE(server.fullServerName().isEmpty(), true); @@ -1806,7 +1806,7 @@ void tst_QLocalSocket::verifyListenWithDescriptor_data() QTest::addColumn("bound"); QTest::newRow("normal") << QDir::tempPath() + QLatin1String("/testsocket") << false << true; -#ifdef Q_OS_LINUX +#if defined(Q_OS_LINUX) || defined(Q_OS_QNX) QTest::newRow("abstract") << QString::fromLatin1("abstractsocketname") << true << true; QTest::newRow("abstractwithslash") << QString::fromLatin1("abstractsocketwitha/inthename") << true << true; #endif