From cf3d517763a3d74a2ec9fd6f7bdee8cbaee3550f Mon Sep 17 00:00:00 2001
From: Edwin Mons <edwin.mons@isode.com>
Date: Mon, 29 Oct 2018 16:28:14 +0000
Subject: Consistently use unsigned short for network ports

Network ports are now consistently stored as unsigned shorts, apart from
the options and user interface, where -1 is still used to denote the use
of default ports.

Test-Information:

Unit tests pass on macOS 10.13 and Debian 9
On macOS: tested the UI with various proxy and manual ports, behaviour
as expected.

Change-Id: I7a65f40083022887aa30ed7b21eadc56d0c52be1

diff --git a/Slimber/Server.cpp b/Slimber/Server.cpp
index 3bc3112..bfa34f5 100644
--- a/Slimber/Server.cpp
+++ b/Slimber/Server.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
  * All rights reserved.
  * See the COPYING file for more information.
  */
@@ -39,8 +39,8 @@
 namespace Swift {
 
 Server::Server(
-        int clientConnectionPort,
-        int linkLocalConnectionPort,
+        unsigned short clientConnectionPort,
+        unsigned short linkLocalConnectionPort,
         LinkLocalServiceBrowser* linkLocalServiceBrowser,
         VCardCollection* vCardCollection,
         EventLoop* eventLoop) :
diff --git a/Slimber/Server.h b/Slimber/Server.h
index 4842cd9..2ee5a4a 100644
--- a/Slimber/Server.h
+++ b/Slimber/Server.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
  * All rights reserved.
  * See the COPYING file for more information.
  */
@@ -41,8 +41,8 @@ namespace Swift {
     class Server {
         public:
             Server(
-                    int clientConnectionPort,
-                    int linkLocalConnectionPort,
+                    unsigned short clientConnectionPort,
+                    unsigned short linkLocalConnectionPort,
                     LinkLocalServiceBrowser* browser,
                     VCardCollection* vCardCollection,
                     EventLoop* eventLoop);
@@ -51,11 +51,11 @@ namespace Swift {
             void start();
             void stop();
 
-            int getLinkLocalPort() const {
+            unsigned short getLinkLocalPort() const {
                 return linkLocalConnectionPort;
             }
 
-            int getClientToServerPort() const {
+            unsigned short getClientToServerPort() const {
                 return clientConnectionPort;
             }
 
@@ -105,8 +105,8 @@ namespace Swift {
             PlatformXMLParserFactory xmlParserFactory;
             bool linkLocalServiceRegistered;
             bool rosterRequested;
-            int clientConnectionPort;
-            int linkLocalConnectionPort;
+            unsigned short clientConnectionPort;
+            unsigned short linkLocalConnectionPort;
             LinkLocalServiceBrowser* linkLocalServiceBrowser;
             VCardCollection* vCardCollection;
             EventLoop* eventLoop;
diff --git a/Sluift/SluiftClient.h b/Sluift/SluiftClient.h
index 8cc815d..39ff0a8 100644
--- a/Sluift/SluiftClient.h
+++ b/Sluift/SluiftClient.h
@@ -81,7 +81,6 @@ namespace Swift {
             }
 
             void connect();
-            void connect(const std::string& host, int port);
             void waitConnected(int timeout);
             bool isConnected() const;
             void setTraceEnabled(bool b);
diff --git a/Sluift/SluiftComponent.cpp b/Sluift/SluiftComponent.cpp
index ee09380..74728ee 100644
--- a/Sluift/SluiftComponent.cpp
+++ b/Sluift/SluiftComponent.cpp
@@ -40,7 +40,7 @@ SluiftComponent::~SluiftComponent() {
     delete component;
 }
 
-void SluiftComponent::connect(const std::string& host, int port) {
+void SluiftComponent::connect(const std::string& host, unsigned short port) {
     if (component->isActive()) {
         throw Lua::Exception("Component is already connecting or connected");
     }
diff --git a/Sluift/SluiftComponent.h b/Sluift/SluiftComponent.h
index 9fc7101..586a94e 100644
--- a/Sluift/SluiftComponent.h
+++ b/Sluift/SluiftComponent.h
@@ -63,7 +63,7 @@ namespace Swift {
                 return component;
             }
 
-            void connect(const std::string& host, int port);
+            void connect(const std::string& host, unsigned short port);
             void waitConnected(int timeout);
             bool isConnected() const;
             void setTraceEnabled(bool b);
diff --git a/Sluift/component.cpp b/Sluift/component.cpp
index f3c2e37..c1b1da4 100644
--- a/Sluift/component.cpp
+++ b/Sluift/component.cpp
@@ -96,13 +96,13 @@ SLUIFT_LUA_FUNCTION(Component, async_connect) {
     SluiftComponent* component = getComponent(L);
 
     std::string host;
-    int port = 0;
+    unsigned short port = 0;
     if (lua_istable(L, 2)) {
         if (boost::optional<std::string> hostString = Lua::getStringField(L, 2, "host")) {
             host = *hostString;
         }
         if (boost::optional<int> portInt = Lua::getIntField(L, 2, "port")) {
-            port = *portInt;
+            port = boost::numeric_cast<unsigned short>(*portInt);
         }
     }
     component->connect(host, port);
diff --git a/Swiften/Base/URL.cpp b/Swiften/Base/URL.cpp
index 3bc97ba..5c0f0d7 100644
--- a/Swiften/Base/URL.cpp
+++ b/Swiften/Base/URL.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
  * All rights reserved.
  * See the COPYING file for more information.
  */
@@ -11,7 +11,7 @@
 
 namespace Swift {
 
-int URL::getPortOrDefaultPort(const URL& url) {
+unsigned short URL::getPortOrDefaultPort(const URL& url) {
     if (url.getPort()) {
         return *url.getPort();
     }
@@ -62,7 +62,7 @@ URL URL::fromString(const std::string& urlString) {
         }
 
         std::string host;
-        boost::optional<int> port;
+        boost::optional<unsigned short> port;
         if (hostAndPort[0] == '[') {
             // handle IPv6 address literals
             size_t addressEndIndex = hostAndPort.find(']');
@@ -71,9 +71,9 @@ URL URL::fromString(const std::string& urlString) {
                 colonIndex = hostAndPort.find(':', addressEndIndex);
                 if (colonIndex != std::string::npos) {
                     try {
-                        port = boost::lexical_cast<int>(hostAndPort.substr(colonIndex + 1));
+                        port = boost::numeric_cast<unsigned short>(boost::lexical_cast<int>(hostAndPort.substr(colonIndex + 1)));
                     }
-                    catch (const boost::bad_lexical_cast&) {
+                    catch (...) {
                         return URL();
                     }
                 }
@@ -87,7 +87,7 @@ URL URL::fromString(const std::string& urlString) {
             if (colonIndex != std::string::npos) {
                 host = unescape(hostAndPort.substr(0, colonIndex));
                 try {
-                    port = boost::lexical_cast<int>(hostAndPort.substr(colonIndex + 1));
+                    port = boost::numeric_cast<unsigned short>(boost::lexical_cast<int>(hostAndPort.substr(colonIndex + 1)));
                 }
                 catch (const boost::bad_lexical_cast&) {
                     return URL();
diff --git a/Swiften/Base/URL.h b/Swiften/Base/URL.h
index 1a03efe..8fdb018 100644
--- a/Swiften/Base/URL.h
+++ b/Swiften/Base/URL.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011-2016 Isode Limited.
+ * Copyright (c) 2011-2018 Isode Limited.
  * All rights reserved.
  * See the COPYING file for more information.
  */
@@ -21,7 +21,7 @@ class SWIFTEN_API URL {
         URL() : scheme(""), user(""), password(""), host(""), path(""), empty(true) {
         }
 
-        URL(const std::string& scheme, const std::string& host, int port, const std::string& path) : scheme(scheme), user(), password(), host(host), port(port), path(path), empty(false) {
+        URL(const std::string& scheme, const std::string& host, unsigned short port, const std::string& path) : scheme(scheme), user(), password(), host(host), port(port), path(path), empty(false) {
         }
 
         URL(const std::string& scheme, const std::string& host, const std::string& path) : scheme(scheme), user(), password(), host(host), path(path), empty(false) {
@@ -51,7 +51,7 @@ class SWIFTEN_API URL {
         /**
          * Port number
          */
-        boost::optional<int> getPort() const {
+        boost::optional<unsigned short> getPort() const {
             return port;
         }
 
@@ -64,7 +64,7 @@ class SWIFTEN_API URL {
 
         std::string toString() const;
 
-        static int getPortOrDefaultPort(const URL& url);
+        static unsigned short getPortOrDefaultPort(const URL& url);
         static URL fromString(const std::string&);
         static std::string unescape(const std::string&);
 
@@ -74,7 +74,7 @@ class SWIFTEN_API URL {
         std::string user;
         std::string password;
         std::string host;
-        boost::optional<int> port;
+        boost::optional<unsigned short> port;
         std::string path;
         bool empty;
     };
diff --git a/Swiften/Base/UnitTest/URLTest.cpp b/Swiften/Base/UnitTest/URLTest.cpp
index c38398a..da9f15c 100644
--- a/Swiften/Base/UnitTest/URLTest.cpp
+++ b/Swiften/Base/UnitTest/URLTest.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012-2016 Isode Limited.
+ * Copyright (c) 2012-2018 Isode Limited.
  * All rights reserved.
  * See the COPYING file for more information.
  */
@@ -66,7 +66,7 @@ class URLTest : public CppUnit::TestFixture {
 
             CPPUNIT_ASSERT_EQUAL(std::string("http"), url.getScheme());
             CPPUNIT_ASSERT_EQUAL(std::string("foo.bar"), url.getHost());
-            CPPUNIT_ASSERT_EQUAL(1234, *url.getPort());
+            CPPUNIT_ASSERT_EQUAL(static_cast<unsigned short>(1234), *url.getPort());
             CPPUNIT_ASSERT_EQUAL(std::string("/baz/bam"), url.getPath());
         }
 
@@ -75,7 +75,7 @@ class URLTest : public CppUnit::TestFixture {
 
             CPPUNIT_ASSERT_EQUAL(std::string("http"), url.getScheme());
             CPPUNIT_ASSERT_EQUAL(std::string("foo.bar"), url.getHost());
-            CPPUNIT_ASSERT_EQUAL(11440, *url.getPort());
+            CPPUNIT_ASSERT_EQUAL(static_cast<unsigned short>(11440), *url.getPort());
             CPPUNIT_ASSERT_EQUAL(std::string("/http-bind/"), url.getPath());
         }
 
@@ -84,7 +84,7 @@ class URLTest : public CppUnit::TestFixture {
 
             CPPUNIT_ASSERT_EQUAL(std::string("http"), url.getScheme());
             CPPUNIT_ASSERT_EQUAL(std::string("foo.bar"), url.getHost());
-            CPPUNIT_ASSERT_EQUAL(1234, *url.getPort());
+            CPPUNIT_ASSERT_EQUAL(static_cast<unsigned short>(1234), *url.getPort());
             CPPUNIT_ASSERT_EQUAL(std::string(""), url.getPath());
         }
 
@@ -121,7 +121,7 @@ class URLTest : public CppUnit::TestFixture {
 
             CPPUNIT_ASSERT_EQUAL(std::string("http"), url.getScheme());
             CPPUNIT_ASSERT_EQUAL(std::string("127.0.0.1"), url.getHost());
-            CPPUNIT_ASSERT_EQUAL(12345, url.getPort().get_value_or(0));
+            CPPUNIT_ASSERT_EQUAL(static_cast<unsigned short>(12345), url.getPort().get_value_or(0));
             CPPUNIT_ASSERT_EQUAL(std::string("/foobar"), url.getPath());
         }
 
@@ -137,7 +137,7 @@ class URLTest : public CppUnit::TestFixture {
 
             CPPUNIT_ASSERT_EQUAL(std::string("http"), url.getScheme());
             CPPUNIT_ASSERT_EQUAL(std::string("fdf8:f53b:82e4::53"), url.getHost());
-            CPPUNIT_ASSERT_EQUAL(12435, url.getPort().get_value_or(0));
+            CPPUNIT_ASSERT_EQUAL(static_cast<unsigned short>(12435), url.getPort().get_value_or(0));
         }
 
         void test_FromString_ToString_IPv6RFC2732() {
@@ -147,7 +147,7 @@ class URLTest : public CppUnit::TestFixture {
 
                 CPPUNIT_ASSERT_EQUAL(std::string("http"), url.getScheme());
                 CPPUNIT_ASSERT_EQUAL(std::string("FEDC:BA98:7654:3210:FEDC:BA98:7654:3210"), url.getHost());
-                CPPUNIT_ASSERT_EQUAL(80, url.getPort().get_value_or(2));
+                CPPUNIT_ASSERT_EQUAL(static_cast<unsigned short>(80), url.getPort().get_value_or(2));
                 CPPUNIT_ASSERT_EQUAL(std::string("/index.html"), url.getPath());
 
                 CPPUNIT_ASSERT_EQUAL(std::string(testVector), url.toString());
@@ -159,7 +159,7 @@ class URLTest : public CppUnit::TestFixture {
 
                 CPPUNIT_ASSERT_EQUAL(std::string("http"), url.getScheme());
                 CPPUNIT_ASSERT_EQUAL(std::string("1080:0:0:0:8:800:200C:417A"), url.getHost());
-                CPPUNIT_ASSERT_EQUAL(2, url.getPort().get_value_or(2));
+                CPPUNIT_ASSERT_EQUAL(static_cast<unsigned short>(2), url.getPort().get_value_or(2));
                 CPPUNIT_ASSERT_EQUAL(std::string("/index.html"), url.getPath());
 
                 CPPUNIT_ASSERT_EQUAL(std::string(testVector), url.toString());
@@ -171,7 +171,7 @@ class URLTest : public CppUnit::TestFixture {
 
                 CPPUNIT_ASSERT_EQUAL(std::string("http"), url.getScheme());
                 CPPUNIT_ASSERT_EQUAL(std::string("3ffe:2a00:100:7031::1"), url.getHost());
-                CPPUNIT_ASSERT_EQUAL(2, url.getPort().get_value_or(2));
+                CPPUNIT_ASSERT_EQUAL(static_cast<unsigned short>(2), url.getPort().get_value_or(2));
                 CPPUNIT_ASSERT_EQUAL(std::string(""), url.getPath());
 
                 CPPUNIT_ASSERT_EQUAL(std::string(testVector), url.toString());
@@ -183,7 +183,7 @@ class URLTest : public CppUnit::TestFixture {
 
                 CPPUNIT_ASSERT_EQUAL(std::string("http"), url.getScheme());
                 CPPUNIT_ASSERT_EQUAL(std::string("1080::8:800:200C:417A"), url.getHost());
-                CPPUNIT_ASSERT_EQUAL(2, url.getPort().get_value_or(2));
+                CPPUNIT_ASSERT_EQUAL(static_cast<unsigned short>(2), url.getPort().get_value_or(2));
                 CPPUNIT_ASSERT_EQUAL(std::string("/foo"), url.getPath());
 
                 CPPUNIT_ASSERT_EQUAL(std::string(testVector), url.toString());
@@ -195,7 +195,7 @@ class URLTest : public CppUnit::TestFixture {
 
                 CPPUNIT_ASSERT_EQUAL(std::string("http"), url.getScheme());
                 CPPUNIT_ASSERT_EQUAL(std::string("::192.9.5.5"), url.getHost());
-                CPPUNIT_ASSERT_EQUAL(2, url.getPort().get_value_or(2));
+                CPPUNIT_ASSERT_EQUAL(static_cast<unsigned short>(2), url.getPort().get_value_or(2));
                 CPPUNIT_ASSERT_EQUAL(std::string("/ipng"), url.getPath());
 
                 CPPUNIT_ASSERT_EQUAL(std::string(testVector), url.toString());
@@ -207,7 +207,7 @@ class URLTest : public CppUnit::TestFixture {
 
                 CPPUNIT_ASSERT_EQUAL(std::string("http"), url.getScheme());
                 CPPUNIT_ASSERT_EQUAL(std::string("::FFFF:129.144.52.38"), url.getHost());
-                CPPUNIT_ASSERT_EQUAL(80, url.getPort().get_value_or(2));
+                CPPUNIT_ASSERT_EQUAL(static_cast<unsigned short>(80), url.getPort().get_value_or(2));
                 CPPUNIT_ASSERT_EQUAL(std::string("/index.html"), url.getPath());
 
                 CPPUNIT_ASSERT_EQUAL(std::string(testVector), url.toString());
@@ -219,7 +219,7 @@ class URLTest : public CppUnit::TestFixture {
 
                 CPPUNIT_ASSERT_EQUAL(std::string("http"), url.getScheme());
                 CPPUNIT_ASSERT_EQUAL(std::string("2010:836B:4179::836B:4179"), url.getHost());
-                CPPUNIT_ASSERT_EQUAL(2, url.getPort().get_value_or(2));
+                CPPUNIT_ASSERT_EQUAL(static_cast<unsigned short>(2), url.getPort().get_value_or(2));
                 CPPUNIT_ASSERT_EQUAL(std::string(), url.getPath());
 
                 CPPUNIT_ASSERT_EQUAL(std::string(testVector), url.toString());
diff --git a/Swiften/Client/CoreClient.cpp b/Swiften/Client/CoreClient.cpp
index 1de1d61..d3711cb 100644
--- a/Swiften/Client/CoreClient.cpp
+++ b/Swiften/Client/CoreClient.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
  * All rights reserved.
  * See the COPYING file for more information.
  */
@@ -85,7 +85,17 @@ void CoreClient::connect(const ClientOptions& o) {
         case ClientOptions::SOCKS5Proxy: {
             SWIFT_LOG(debug) << " with manual configured SOCKS5 proxy" << std::endl;
             std::string proxyHostname = o.manualProxyHostname.empty() ? systemSOCKS5Proxy.getAddress().toString() : o.manualProxyHostname;
-            int proxyPort = o.manualProxyPort == -1 ? systemSOCKS5Proxy.getPort() : o.manualProxyPort;
+            auto proxyPort = systemSOCKS5Proxy.getPort();
+            if (o.manualProxyPort != -1) {
+                try {
+                    proxyPort = boost::numeric_cast<unsigned short>(o.manualProxyPort);
+                }
+                catch (const boost::numeric::bad_numeric_cast& e) {
+                    SWIFT_LOG(warning) << "Manual proxy port " << o.manualProxyPort << " is invalid: " << e.what() << std::endl;
+                    onDisconnected(boost::optional<ClientError>(ClientError::ConnectionError));
+                    return;
+                }
+            }
             SWIFT_LOG(debug) << "Proxy: " << proxyHostname << ":" << proxyPort << std::endl;
             proxyConnectionFactories.push_back(new SOCKS5ProxiedConnectionFactory(networkFactories->getDomainNameResolver(), networkFactories->getConnectionFactory(), networkFactories->getTimerFactory(), proxyHostname, proxyPort));
             useDirectConnection = false;
@@ -94,7 +104,17 @@ void CoreClient::connect(const ClientOptions& o) {
         case ClientOptions::HTTPConnectProxy: {
             SWIFT_LOG(debug) << " with manual configured HTTPConnect proxy" << std::endl;
             std::string proxyHostname = o.manualProxyHostname.empty() ? systemHTTPConnectProxy.getAddress().toString() : o.manualProxyHostname;
-            int proxyPort = o.manualProxyPort == -1 ? systemHTTPConnectProxy.getPort() : o.manualProxyPort;
+            unsigned short proxyPort = systemHTTPConnectProxy.getPort();
+            if (o.manualProxyPort != -1) {
+                try {
+                    proxyPort = boost::numeric_cast<unsigned short>(o.manualProxyPort);
+                }
+                catch (const boost::numeric::bad_numeric_cast& e) {
+                    SWIFT_LOG(warning) << "Manual proxy port " << o.manualProxyPort << " is invalid: " << e.what() << std::endl;
+                    onDisconnected(boost::optional<ClientError>(ClientError::ConnectionError));
+                    return;
+                }
+            }
             SWIFT_LOG(debug) << "Proxy: " << proxyHostname << ":" << proxyPort << std::endl;
             proxyConnectionFactories.push_back(new HTTPConnectProxiedConnectionFactory(networkFactories->getDomainNameResolver(), networkFactories->getConnectionFactory(), networkFactories->getTimerFactory(), proxyHostname, proxyPort, o.httpTrafficFilter));
             useDirectConnection = false;
@@ -108,7 +128,17 @@ void CoreClient::connect(const ClientOptions& o) {
 
     // Create connector
     std::string host = o.manualHostname.empty() ?  jid_.getDomain() : o.manualHostname;
-    int port = o.manualPort;
+    unsigned short port = 0;
+    if (o.manualPort != -1) {
+        try {
+            port = boost::numeric_cast<unsigned short>(o.manualPort);
+        }
+        catch (const boost::numeric::bad_numeric_cast& e) {
+            SWIFT_LOG(warning) << "Invalid manual port " << o.manualPort << ": " << e.what() << std::endl;
+            onDisconnected(boost::optional<ClientError>(ClientError::ConnectionError));
+            return;
+        }
+    }
     boost::optional<std::string> serviceLookupPrefix;
     if (o.manualHostname.empty()) {
         serviceLookupPrefix = "_xmpp-client._tcp.";
diff --git a/Swiften/Component/ComponentConnector.cpp b/Swiften/Component/ComponentConnector.cpp
index a7375a7..7789c4c 100644
--- a/Swiften/Component/ComponentConnector.cpp
+++ b/Swiften/Component/ComponentConnector.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
  * All rights reserved.
  * See the COPYING file for more information.
  */
@@ -15,7 +15,7 @@
 
 namespace Swift {
 
-ComponentConnector::ComponentConnector(const std::string& hostname, int port, DomainNameResolver* resolver, ConnectionFactory* connectionFactory, TimerFactory* timerFactory) : hostname(hostname), port(port), resolver(resolver), connectionFactory(connectionFactory), timerFactory(timerFactory), timeoutMilliseconds(0) {
+ComponentConnector::ComponentConnector(const std::string& hostname, unsigned short port, DomainNameResolver* resolver, ConnectionFactory* connectionFactory, TimerFactory* timerFactory) : hostname(hostname), port(port), resolver(resolver), connectionFactory(connectionFactory), timerFactory(timerFactory), timeoutMilliseconds(0) {
 }
 
 void ComponentConnector::setTimeoutMilliseconds(int milliseconds) {
diff --git a/Swiften/Component/ComponentConnector.h b/Swiften/Component/ComponentConnector.h
index ab36901..cfd49fe 100644
--- a/Swiften/Component/ComponentConnector.h
+++ b/Swiften/Component/ComponentConnector.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
  * All rights reserved.
  * See the COPYING file for more information.
  */
@@ -28,7 +28,7 @@ namespace Swift {
         public:
             typedef std::shared_ptr<ComponentConnector> ref;
 
-            static ComponentConnector::ref create(const std::string& hostname, int port, DomainNameResolver* resolver, ConnectionFactory* connectionFactory, TimerFactory* timerFactory) {
+            static ComponentConnector::ref create(const std::string& hostname, unsigned short port, DomainNameResolver* resolver, ConnectionFactory* connectionFactory, TimerFactory* timerFactory) {
                 return ref(new ComponentConnector(hostname, port, resolver, connectionFactory, timerFactory));
             }
 
@@ -40,7 +40,7 @@ namespace Swift {
             boost::signals2::signal<void (std::shared_ptr<Connection>)> onConnectFinished;
 
         private:
-            ComponentConnector(const std::string& hostname, int port, DomainNameResolver*, ConnectionFactory*, TimerFactory*);
+            ComponentConnector(const std::string& hostname, unsigned short port, DomainNameResolver*, ConnectionFactory*, TimerFactory*);
 
             void handleAddressQueryResult(const std::vector<HostAddress>& address, boost::optional<DomainNameResolveError> error);
             void tryNextAddress();
@@ -53,7 +53,7 @@ namespace Swift {
 
         private:
             std::string hostname;
-            int port;
+            unsigned short port;
             DomainNameResolver* resolver;
             ConnectionFactory* connectionFactory;
             TimerFactory* timerFactory;
diff --git a/Swiften/Component/CoreComponent.cpp b/Swiften/Component/CoreComponent.cpp
index 5b2277b..2d91c9c 100644
--- a/Swiften/Component/CoreComponent.cpp
+++ b/Swiften/Component/CoreComponent.cpp
@@ -43,7 +43,7 @@ CoreComponent::~CoreComponent() {
     delete stanzaChannel_;
 }
 
-void CoreComponent::connect(const std::string& host, int port) {
+void CoreComponent::connect(const std::string& host, unsigned short port) {
     assert(!connector_);
     connector_ = ComponentConnector::create(host, port, networkFactories->getDomainNameResolver(), networkFactories->getConnectionFactory(), networkFactories->getTimerFactory());
     connector_->onConnectFinished.connect(boost::bind(&CoreComponent::handleConnectorFinished, this, _1));
diff --git a/Swiften/Component/CoreComponent.h b/Swiften/Component/CoreComponent.h
index 1a487d2..7565d00 100644
--- a/Swiften/Component/CoreComponent.h
+++ b/Swiften/Component/CoreComponent.h
@@ -46,7 +46,7 @@ namespace Swift {
             CoreComponent(const JID& jid, const std::string& secret, NetworkFactories* networkFactories);
             virtual ~CoreComponent();
 
-            void connect(const std::string& host, int port);
+            void connect(const std::string& host, unsigned short port);
             void disconnect();
 
             void sendMessage(std::shared_ptr<Message>);
diff --git a/Swiften/Component/UnitTest/ComponentConnectorTest.cpp b/Swiften/Component/UnitTest/ComponentConnectorTest.cpp
index 3b4fa83..bd26989 100644
--- a/Swiften/Component/UnitTest/ComponentConnectorTest.cpp
+++ b/Swiften/Component/UnitTest/ComponentConnectorTest.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
  * All rights reserved.
  * See the COPYING file for more information.
  */
@@ -146,7 +146,7 @@ class ComponentConnectorTest : public CppUnit::TestFixture {
         }
 
     private:
-        ComponentConnector::ref createConnector(const std::string& hostname, int port) {
+        ComponentConnector::ref createConnector(const std::string& hostname, unsigned short port) {
             ComponentConnector::ref connector = ComponentConnector::create(hostname, port, resolver, connectionFactory, timerFactory);
             connector->onConnectFinished.connect(boost::bind(&ComponentConnectorTest::handleConnectorFinished, this, _1));
             return connector;
diff --git a/Swiften/Elements/Bytestreams.h b/Swiften/Elements/Bytestreams.h
index ca30922..599ed46 100644
--- a/Swiften/Elements/Bytestreams.h
+++ b/Swiften/Elements/Bytestreams.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
  * All rights reserved.
  * See the COPYING file for more information.
  */
@@ -22,11 +22,11 @@ namespace Swift {
             typedef std::shared_ptr<Bytestreams> ref;
 
             struct StreamHost {
-                StreamHost(const std::string& host = "", const JID& jid = JID(), int port = -1) : host(host), jid(jid), port(port) {}
+                StreamHost(const std::string& host = "", const JID& jid = JID(), unsigned short port = 0) : host(host), jid(jid), port(port) {}
 
                 std::string host;
                 JID jid;
-                int port;
+                unsigned short port;
             };
 
             Bytestreams() {}
diff --git a/Swiften/Elements/S5BProxyRequest.h b/Swiften/Elements/S5BProxyRequest.h
index e3f5206..2fecae4 100644
--- a/Swiften/Elements/S5BProxyRequest.h
+++ b/Swiften/Elements/S5BProxyRequest.h
@@ -5,7 +5,7 @@
  */
 
 /*
- * Copyright (c) 2015-2016 Isode Limited.
+ * Copyright (c) 2015-2018 Isode Limited.
  * All rights reserved.
  * See the COPYING file for more information.
  */
@@ -30,7 +30,7 @@ public:
 public:
     struct StreamHost {
         std::string host;
-        int port;
+        unsigned short port;
         JID jid;
     };
 
diff --git a/Swiften/FileTransfer/SOCKS5BytestreamServerManager.cpp b/Swiften/FileTransfer/SOCKS5BytestreamServerManager.cpp
index f749735..a6b75da 100644
--- a/Swiften/FileTransfer/SOCKS5BytestreamServerManager.cpp
+++ b/Swiften/FileTransfer/SOCKS5BytestreamServerManager.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012-2016 Isode Limited.
+ * Copyright (c) 2012-2018 Isode Limited.
  * All rights reserved.
  * See the COPYING file for more information.
  */
@@ -114,7 +114,7 @@ void SOCKS5BytestreamServerManager::initialize() {
 
         // Find a port to listen on
         assert(!connectionServer);
-        int port;
+        unsigned short port;
         for (port = LISTEN_PORTS_BEGIN; port < LISTEN_PORTS_END; ++port) {
             SWIFT_LOG(debug) << "Trying to start server on port " << port << std::endl;
             connectionServer = connectionServerFactory->createConnectionServer(HostAddress::fromString("::").get(), port);
@@ -164,7 +164,7 @@ void SOCKS5BytestreamServerManager::setupPortForwarding() {
     }
 
     // Forward ports
-    int port = server->getAddressPort().getPort();
+    auto port = server->getAddressPort().getPort();
     assert(!forwardPortRequest);
     portMapping = boost::optional<NATPortMapping>();
     if ((forwardPortRequest = natTraverser->createForwardPortRequest(port, port))) {
diff --git a/Swiften/FileTransfer/SOCKS5BytestreamServerManager.h b/Swiften/FileTransfer/SOCKS5BytestreamServerManager.h
index 3c06513..74578cc 100644
--- a/Swiften/FileTransfer/SOCKS5BytestreamServerManager.h
+++ b/Swiften/FileTransfer/SOCKS5BytestreamServerManager.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012-2016 Isode Limited.
+ * Copyright (c) 2012-2018 Isode Limited.
  * All rights reserved.
  * See the COPYING file for more information.
  */
@@ -78,7 +78,7 @@ namespace Swift {
             enum { Start, Initializing, Initialized } state;
             SOCKS5BytestreamServer* server;
             std::shared_ptr<ConnectionServer> connectionServer;
-            int connectionServerPort = -1;
+            unsigned short connectionServerPort = 0;
 
             std::shared_ptr<NATTraversalGetPublicIPRequest> getPublicIPRequest;
             std::shared_ptr<NATTraversalForwardPortRequest> forwardPortRequest;
diff --git a/Swiften/LinkLocal/DNSSD/Avahi/AvahiQuerier.cpp b/Swiften/LinkLocal/DNSSD/Avahi/AvahiQuerier.cpp
index 1b79946..66b4ae8 100644
--- a/Swiften/LinkLocal/DNSSD/Avahi/AvahiQuerier.cpp
+++ b/Swiften/LinkLocal/DNSSD/Avahi/AvahiQuerier.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
  * All rights reserved.
  * See the COPYING file for more information.
  */
@@ -25,7 +25,7 @@ std::shared_ptr<DNSSDBrowseQuery> AvahiQuerier::createBrowseQuery() {
     return std::make_shared<AvahiBrowseQuery>(shared_from_this(), eventLoop);
 }
 
-std::shared_ptr<DNSSDRegisterQuery> AvahiQuerier::createRegisterQuery(const std::string& name, int port, const ByteArray& info) {
+std::shared_ptr<DNSSDRegisterQuery> AvahiQuerier::createRegisterQuery(const std::string& name, unsigned short port, const ByteArray& info) {
     return std::make_shared<AvahiRegisterQuery>(name, port, info, shared_from_this(), eventLoop);
 }
 
diff --git a/Swiften/LinkLocal/DNSSD/Avahi/AvahiQuerier.h b/Swiften/LinkLocal/DNSSD/Avahi/AvahiQuerier.h
index 5dce19d..73dd11d 100644
--- a/Swiften/LinkLocal/DNSSD/Avahi/AvahiQuerier.h
+++ b/Swiften/LinkLocal/DNSSD/Avahi/AvahiQuerier.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
  * All rights reserved.
  * See the COPYING file for more information.
  */
@@ -30,7 +30,7 @@ namespace Swift {
 
             std::shared_ptr<DNSSDBrowseQuery> createBrowseQuery();
             std::shared_ptr<DNSSDRegisterQuery> createRegisterQuery(
-                    const std::string& name, int port, const ByteArray& info);
+                    const std::string& name, unsigned short port, const ByteArray& info);
             std::shared_ptr<DNSSDResolveServiceQuery> createResolveServiceQuery(
                     const DNSSDServiceID&);
             std::shared_ptr<DNSSDResolveHostnameQuery> createResolveHostnameQuery(
diff --git a/Swiften/LinkLocal/DNSSD/Avahi/AvahiRegisterQuery.h b/Swiften/LinkLocal/DNSSD/Avahi/AvahiRegisterQuery.h
index 68281d0..b780043 100644
--- a/Swiften/LinkLocal/DNSSD/Avahi/AvahiRegisterQuery.h
+++ b/Swiften/LinkLocal/DNSSD/Avahi/AvahiRegisterQuery.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
  * All rights reserved.
  * See the COPYING file for more information.
  */
@@ -18,7 +18,7 @@ namespace Swift {
 
     class AvahiRegisterQuery : public DNSSDRegisterQuery, public AvahiQuery {
         public:
-            AvahiRegisterQuery(const std::string& name, int port, const ByteArray& txtRecord, std::shared_ptr<AvahiQuerier> querier, EventLoop* eventLoop) : AvahiQuery(querier, eventLoop), name(name), port(port), txtRecord(txtRecord), group(0) {
+            AvahiRegisterQuery(const std::string& name, unsigned short port, const ByteArray& txtRecord, std::shared_ptr<AvahiQuerier> querier, EventLoop* eventLoop) : AvahiQuery(querier, eventLoop), name(name), port(port), txtRecord(txtRecord), group(0) {
             }
 
             void registerService();
@@ -50,7 +50,7 @@ namespace Swift {
 
         private:
             std::string name;
-            int port;
+            unsigned short port;
             ByteArray txtRecord;
             AvahiEntryGroup* group;
     };
diff --git a/Swiften/LinkLocal/DNSSD/Bonjour/BonjourQuerier.cpp b/Swiften/LinkLocal/DNSSD/Bonjour/BonjourQuerier.cpp
index 0906ffc..551421e 100644
--- a/Swiften/LinkLocal/DNSSD/Bonjour/BonjourQuerier.cpp
+++ b/Swiften/LinkLocal/DNSSD/Bonjour/BonjourQuerier.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
  * All rights reserved.
  * See the COPYING file for more information.
  */
@@ -11,6 +11,7 @@
 #include <unistd.h>
 
 #include <Swiften/Base/Algorithm.h>
+#include <Swiften/Base/Log.h>
 #include <Swiften/LinkLocal/DNSSD/Bonjour/BonjourBrowseQuery.h>
 #include <Swiften/LinkLocal/DNSSD/Bonjour/BonjourRegisterQuery.h>
 #include <Swiften/LinkLocal/DNSSD/Bonjour/BonjourResolveHostnameQuery.h>
@@ -36,7 +37,7 @@ std::shared_ptr<DNSSDBrowseQuery> BonjourQuerier::createBrowseQuery() {
     return std::make_shared<BonjourBrowseQuery>(shared_from_this(), eventLoop);
 }
 
-std::shared_ptr<DNSSDRegisterQuery> BonjourQuerier::createRegisterQuery(const std::string& name, int port, const ByteArray& info) {
+std::shared_ptr<DNSSDRegisterQuery> BonjourQuerier::createRegisterQuery(const std::string& name, unsigned short port, const ByteArray& info) {
     return std::make_shared<BonjourRegisterQuery>(name, port, info, shared_from_this(), eventLoop);
 }
 
diff --git a/Swiften/LinkLocal/DNSSD/Bonjour/BonjourQuerier.h b/Swiften/LinkLocal/DNSSD/Bonjour/BonjourQuerier.h
index 77326bc..6af1c1f 100644
--- a/Swiften/LinkLocal/DNSSD/Bonjour/BonjourQuerier.h
+++ b/Swiften/LinkLocal/DNSSD/Bonjour/BonjourQuerier.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
  * All rights reserved.
  * See the COPYING file for more information.
  */
@@ -25,7 +25,7 @@ namespace Swift {
 
             std::shared_ptr<DNSSDBrowseQuery> createBrowseQuery();
             std::shared_ptr<DNSSDRegisterQuery> createRegisterQuery(
-                    const std::string& name, int port, const ByteArray& info);
+                    const std::string& name, unsigned short port, const ByteArray& info);
             std::shared_ptr<DNSSDResolveServiceQuery> createResolveServiceQuery(
                     const DNSSDServiceID&);
             std::shared_ptr<DNSSDResolveHostnameQuery> createResolveHostnameQuery(
diff --git a/Swiften/LinkLocal/DNSSD/Bonjour/BonjourRegisterQuery.h b/Swiften/LinkLocal/DNSSD/Bonjour/BonjourRegisterQuery.h
index 8b2e955..9eb8cd9 100644
--- a/Swiften/LinkLocal/DNSSD/Bonjour/BonjourRegisterQuery.h
+++ b/Swiften/LinkLocal/DNSSD/Bonjour/BonjourRegisterQuery.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
  * All rights reserved.
  * See the COPYING file for more information.
  */
@@ -20,12 +20,21 @@ namespace Swift {
 
     class BonjourRegisterQuery : public DNSSDRegisterQuery, public BonjourQuery {
         public:
-            BonjourRegisterQuery(const std::string& name, int port, const ByteArray& txtRecord, std::shared_ptr<BonjourQuerier> querier, EventLoop* eventLoop) : BonjourQuery(querier, eventLoop) {
+            BonjourRegisterQuery(const std::string& name, unsigned short port, const ByteArray& txtRecord, std::shared_ptr<BonjourQuerier> querier, EventLoop* eventLoop) : BonjourQuery(querier, eventLoop) {
+                unsigned short recordSize = 0;
+                try {
+                    recordSize = boost::numeric_cast<unsigned short>(txtRecord.size());
+                }
+                catch (const boost::numeric::bad_numeric_cast&) {
+                    SWIFT_LOG(warning) << "Bonjour TXT record is too long (" << txtRecord.size() << " bytes), not registring service" << std::endl;
+                    return;
+                }
                 DNSServiceErrorType result = DNSServiceRegister(
-                        &sdRef, 0, 0, name.c_str(), "_presence._tcp", nullptr, nullptr, boost::numeric_cast<unsigned short>(port),
-                        boost::numeric_cast<unsigned short>(txtRecord.size()), vecptr(txtRecord),
+                        &sdRef, 0, 0, name.c_str(), "_presence._tcp", nullptr, nullptr, port,
+                        recordSize, vecptr(txtRecord),
                         &BonjourRegisterQuery::handleServiceRegisteredStatic, this);
                 if (result != kDNSServiceErr_NoError) {
+                    SWIFT_LOG(warning) << "Failed to register Bonjour service" << std::endl;
                     sdRef = nullptr;
                 }
             }
@@ -45,7 +54,12 @@ namespace Swift {
 
             void updateServiceInfo(const ByteArray& txtRecord) {
                 std::lock_guard<std::mutex> lock(sdRefMutex);
-                DNSServiceUpdateRecord(sdRef, nullptr, 0, boost::numeric_cast<unsigned short>(txtRecord.size()), vecptr(txtRecord), 0);
+                try {
+                    DNSServiceUpdateRecord(sdRef, nullptr, 0, boost::numeric_cast<unsigned short>(txtRecord.size()), vecptr(txtRecord), 0);
+                }
+                catch (const boost::numeric::bad_numeric_cast&) {
+                    SWIFT_LOG(warning) << "Bonjour TXT record is too long (" << txtRecord.size() << " bytes), not updating service record" << std::endl;
+                }
             }
 
         private:
diff --git a/Swiften/LinkLocal/DNSSD/DNSSDQuerier.h b/Swiften/LinkLocal/DNSSD/DNSSDQuerier.h
index 8f3c3ec..3924c05 100644
--- a/Swiften/LinkLocal/DNSSD/DNSSDQuerier.h
+++ b/Swiften/LinkLocal/DNSSD/DNSSDQuerier.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
  * All rights reserved.
  * See the COPYING file for more information.
  */
@@ -26,7 +26,7 @@ namespace Swift {
 
             virtual std::shared_ptr<DNSSDBrowseQuery> createBrowseQuery() = 0;
             virtual std::shared_ptr<DNSSDRegisterQuery> createRegisterQuery(
-                    const std::string& name, int port, const ByteArray& info) = 0;
+                    const std::string& name, unsigned short port, const ByteArray& info) = 0;
             virtual std::shared_ptr<DNSSDResolveServiceQuery> createResolveServiceQuery(
                     const DNSSDServiceID&) = 0;
             virtual std::shared_ptr<DNSSDResolveHostnameQuery> createResolveHostnameQuery(
diff --git a/Swiften/LinkLocal/DNSSD/DNSSDResolveServiceQuery.h b/Swiften/LinkLocal/DNSSD/DNSSDResolveServiceQuery.h
index b55447a..6416d69 100644
--- a/Swiften/LinkLocal/DNSSD/DNSSDResolveServiceQuery.h
+++ b/Swiften/LinkLocal/DNSSD/DNSSDResolveServiceQuery.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
  * All rights reserved.
  * See the COPYING file for more information.
  */
@@ -16,11 +16,11 @@ namespace Swift {
     class DNSSDResolveServiceQuery {
         public:
             struct Result {
-                Result(const std::string& fullName, const std::string& host, int port, const ByteArray& info) :
+                Result(const std::string& fullName, const std::string& host, unsigned short port, const ByteArray& info) :
                             fullName(fullName), host(host), port(port), info(info) {}
                 std::string fullName;
                 std::string host;
-                int port;
+                unsigned short port;
                 ByteArray info;
             };
 
diff --git a/Swiften/LinkLocal/DNSSD/Fake/FakeDNSSDQuerier.cpp b/Swiften/LinkLocal/DNSSD/Fake/FakeDNSSDQuerier.cpp
index c17f8b2..3381a26 100644
--- a/Swiften/LinkLocal/DNSSD/Fake/FakeDNSSDQuerier.cpp
+++ b/Swiften/LinkLocal/DNSSD/Fake/FakeDNSSDQuerier.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
  * All rights reserved.
  * See the COPYING file for more information.
  */
@@ -32,7 +32,7 @@ std::shared_ptr<DNSSDBrowseQuery> FakeDNSSDQuerier::createBrowseQuery() {
     return std::make_shared<FakeDNSSDBrowseQuery>(shared_from_this());
 }
 
-std::shared_ptr<DNSSDRegisterQuery> FakeDNSSDQuerier::createRegisterQuery(const std::string& name, int port, const ByteArray& info) {
+std::shared_ptr<DNSSDRegisterQuery> FakeDNSSDQuerier::createRegisterQuery(const std::string& name, unsigned short port, const ByteArray& info) {
     return std::make_shared<FakeDNSSDRegisterQuery>(name, port, info, shared_from_this());
 }
 
@@ -105,7 +105,7 @@ void FakeDNSSDQuerier::setServiceInfo(const DNSSDServiceID& id, const DNSSDResol
     }
 }
 
-bool FakeDNSSDQuerier::isServiceRegistered(const std::string& name, int port, const ByteArray& info) {
+bool FakeDNSSDQuerier::isServiceRegistered(const std::string& name, unsigned short port, const ByteArray& info) {
     for (const auto& query : getQueries<FakeDNSSDRegisterQuery>()) {
         if (query->name == name && query->port == port && query->info == info) {
             return true;
diff --git a/Swiften/LinkLocal/DNSSD/Fake/FakeDNSSDQuerier.h b/Swiften/LinkLocal/DNSSD/Fake/FakeDNSSDQuerier.h
index 5d4fefd..07cb75c 100644
--- a/Swiften/LinkLocal/DNSSD/Fake/FakeDNSSDQuerier.h
+++ b/Swiften/LinkLocal/DNSSD/Fake/FakeDNSSDQuerier.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010-2017 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
  * All rights reserved.
  * See the COPYING file for more information.
  */
@@ -39,7 +39,7 @@ namespace Swift {
 
             std::shared_ptr<DNSSDBrowseQuery> createBrowseQuery();
             std::shared_ptr<DNSSDRegisterQuery> createRegisterQuery(
-                    const std::string& name, int port, const ByteArray& info);
+                    const std::string& name, unsigned short port, const ByteArray& info);
             std::shared_ptr<DNSSDResolveServiceQuery> createResolveServiceQuery(
                     const DNSSDServiceID&);
             std::shared_ptr<DNSSDResolveHostnameQuery> createResolveHostnameQuery(
@@ -51,7 +51,7 @@ namespace Swift {
             void addService(const DNSSDServiceID& id);
             void removeService(const DNSSDServiceID& id);
             void setServiceInfo(const DNSSDServiceID& id, const DNSSDResolveServiceQuery::Result& info);
-            bool isServiceRegistered(const std::string& name, int port, const ByteArray& info);
+            bool isServiceRegistered(const std::string& name, unsigned short port, const ByteArray& info);
             void setAddress(const std::string& hostname, boost::optional<HostAddress> address);
 
             void setBrowseError();
diff --git a/Swiften/LinkLocal/DNSSD/Fake/FakeDNSSDRegisterQuery.h b/Swiften/LinkLocal/DNSSD/Fake/FakeDNSSDRegisterQuery.h
index 7478841..ee6bb92 100644
--- a/Swiften/LinkLocal/DNSSD/Fake/FakeDNSSDRegisterQuery.h
+++ b/Swiften/LinkLocal/DNSSD/Fake/FakeDNSSDRegisterQuery.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
  * All rights reserved.
  * See the COPYING file for more information.
  */
@@ -17,7 +17,7 @@ namespace Swift {
 
     class FakeDNSSDRegisterQuery : public DNSSDRegisterQuery, public FakeDNSSDQuery {
         public:
-            FakeDNSSDRegisterQuery(const std::string& name, int port, const ByteArray& info, std::shared_ptr<FakeDNSSDQuerier> querier) : FakeDNSSDQuery(querier), name(name), port(port), info(info) {
+            FakeDNSSDRegisterQuery(const std::string& name, unsigned short port, const ByteArray& info, std::shared_ptr<FakeDNSSDQuerier> querier) : FakeDNSSDQuery(querier), name(name), port(port), info(info) {
             }
 
             void registerService() {
@@ -33,7 +33,7 @@ namespace Swift {
             }
 
             std::string name;
-            int port;
+            unsigned short port;
             ByteArray info;
     };
 }
diff --git a/Swiften/LinkLocal/LinkLocalService.h b/Swiften/LinkLocal/LinkLocalService.h
index 9b0e2ab..c51f890 100644
--- a/Swiften/LinkLocal/LinkLocalService.h
+++ b/Swiften/LinkLocal/LinkLocalService.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
  * All rights reserved.
  * See the COPYING file for more information.
  */
@@ -31,7 +31,7 @@ namespace Swift {
                 return id.getName();
             }
 
-            int getPort() const {
+            unsigned short getPort() const {
                 return info.port;
             }
 
diff --git a/Swiften/LinkLocal/LinkLocalServiceBrowser.cpp b/Swiften/LinkLocal/LinkLocalServiceBrowser.cpp
index b79f184..b3328cd 100644
--- a/Swiften/LinkLocal/LinkLocalServiceBrowser.cpp
+++ b/Swiften/LinkLocal/LinkLocalServiceBrowser.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
  * All rights reserved.
  * See the COPYING file for more information.
  */
@@ -65,7 +65,7 @@ bool LinkLocalServiceBrowser::isRegistered() const {
     return !!registerQuery;
 }
 
-void LinkLocalServiceBrowser::registerService(const std::string& name, int port, const LinkLocalServiceInfo& info) {
+void LinkLocalServiceBrowser::registerService(const std::string& name, unsigned short port, const LinkLocalServiceInfo& info) {
     assert(!registerQuery);
     registerQuery = querier->createRegisterQuery(name, port, info.toTXTRecord());
     registerQuery->onRegisterFinished.connect(
diff --git a/Swiften/LinkLocal/LinkLocalServiceBrowser.h b/Swiften/LinkLocal/LinkLocalServiceBrowser.h
index c59a4d0..bfcfc07 100644
--- a/Swiften/LinkLocal/LinkLocalServiceBrowser.h
+++ b/Swiften/LinkLocal/LinkLocalServiceBrowser.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
  * All rights reserved.
  * See the COPYING file for more information.
  */
@@ -35,7 +35,7 @@ namespace Swift {
 
             void registerService(
                     const std::string& name,
-                    int port,
+                    unsigned short port,
                     const LinkLocalServiceInfo& info = LinkLocalServiceInfo());
             void updateService(
                     const LinkLocalServiceInfo& info = LinkLocalServiceInfo());
diff --git a/Swiften/LinkLocal/LinkLocalServiceInfo.cpp b/Swiften/LinkLocal/LinkLocalServiceInfo.cpp
index 771251a..102b7f3 100644
--- a/Swiften/LinkLocal/LinkLocalServiceInfo.cpp
+++ b/Swiften/LinkLocal/LinkLocalServiceInfo.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010-2013 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
  * All rights reserved.
  * See the COPYING file for more information.
  */
@@ -82,7 +82,13 @@ LinkLocalServiceInfo LinkLocalServiceInfo::createFromTXTRecord(const ByteArray&
             info.setNick(entry.second);
         }
         else if (entry.first == "port.p2pj") {
-            info.setPort(boost::lexical_cast<int>(entry.second));
+            try {
+                info.setPort(boost::numeric_cast<unsigned short>(boost::lexical_cast<int>(entry.second)));
+            }
+            catch (const boost::bad_lexical_cast&) {
+            }
+            catch (const boost::numeric::bad_numeric_cast&) {
+            }
         }
         else if (entry.first == "status") {
             if (entry.second == "away") {
diff --git a/Swiften/LinkLocal/LinkLocalServiceInfo.h b/Swiften/LinkLocal/LinkLocalServiceInfo.h
index 9f15c6e..eb65706 100644
--- a/Swiften/LinkLocal/LinkLocalServiceInfo.h
+++ b/Swiften/LinkLocal/LinkLocalServiceInfo.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
  * All rights reserved.
  * See the COPYING file for more information.
  */
@@ -43,8 +43,8 @@ namespace Swift {
             Status getStatus() const { return status; }
             void setStatus(Status s) { status = s; }
 
-            boost::optional<int> getPort() const { return port; }
-            void setPort(int p) { port = p; }
+            boost::optional<unsigned short> getPort() const { return port; }
+            void setPort(unsigned short p) { port = p; }
 
             ByteArray toTXTRecord() const;
 
@@ -62,6 +62,6 @@ namespace Swift {
             std::string message;
             std::string nick;
             Status status;
-            boost::optional<int> port;
+            boost::optional<unsigned short> port;
     };
 }
diff --git a/Swiften/LinkLocal/UnitTest/LinkLocalConnectorTest.cpp b/Swiften/LinkLocal/UnitTest/LinkLocalConnectorTest.cpp
index 85ae537..ab1ee0c 100644
--- a/Swiften/LinkLocal/UnitTest/LinkLocalConnectorTest.cpp
+++ b/Swiften/LinkLocal/UnitTest/LinkLocalConnectorTest.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
  * All rights reserved.
  * See the COPYING file for more information.
  */
@@ -53,7 +53,7 @@ class LinkLocalConnectorTest : public CppUnit::TestFixture {
             CPPUNIT_ASSERT(!connectError);
             CPPUNIT_ASSERT(connection->connectedTo);
             CPPUNIT_ASSERT_EQUAL(std::string(connection->connectedTo->getAddress().toString()), std::string("192.168.1.1"));
-            CPPUNIT_ASSERT_EQUAL(connection->connectedTo->getPort(), 1234);
+            CPPUNIT_ASSERT_EQUAL(connection->connectedTo->getPort(), static_cast<unsigned short>(1234));
         }
 
         void testConnect_UnableToResolve() {
@@ -114,7 +114,7 @@ class LinkLocalConnectorTest : public CppUnit::TestFixture {
         }
 
     private:
-        std::shared_ptr<LinkLocalConnector> createConnector(const std::string& hostname, int port) {
+        std::shared_ptr<LinkLocalConnector> createConnector(const std::string& hostname, unsigned short port) {
             LinkLocalService service(
                     DNSSDServiceID("myname", "local."),
                     DNSSDResolveServiceQuery::Result(
diff --git a/Swiften/Network/BoostConnectionServer.cpp b/Swiften/Network/BoostConnectionServer.cpp
index f25f915..8db9656 100644
--- a/Swiften/Network/BoostConnectionServer.cpp
+++ b/Swiften/Network/BoostConnectionServer.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
  * All rights reserved.
  * See the COPYING file for more information.
  */
@@ -19,10 +19,10 @@
 
 namespace Swift {
 
-BoostConnectionServer::BoostConnectionServer(int port, std::shared_ptr<boost::asio::io_service> ioService, EventLoop* eventLoop) : port_(port), ioService_(ioService), eventLoop(eventLoop), acceptor_(nullptr) {
+BoostConnectionServer::BoostConnectionServer(unsigned short port, std::shared_ptr<boost::asio::io_service> ioService, EventLoop* eventLoop) : port_(port), ioService_(ioService), eventLoop(eventLoop), acceptor_(nullptr) {
 }
 
-BoostConnectionServer::BoostConnectionServer(const HostAddress &address, int port, std::shared_ptr<boost::asio::io_service> ioService, EventLoop* eventLoop) : address_(address), port_(port), ioService_(ioService), eventLoop(eventLoop), acceptor_(nullptr) {
+BoostConnectionServer::BoostConnectionServer(const HostAddress &address, unsigned short port, std::shared_ptr<boost::asio::io_service> ioService, EventLoop* eventLoop) : address_(address), port_(port), ioService_(ioService), eventLoop(eventLoop), acceptor_(nullptr) {
 }
 
 void BoostConnectionServer::start() {
@@ -37,10 +37,10 @@ boost::optional<BoostConnectionServer::Error> BoostConnectionServer::tryStart()
         assert(!acceptor_);
         boost::asio::ip::tcp::endpoint endpoint;
         if (address_.isValid()) {
-            endpoint = boost::asio::ip::tcp::endpoint(address_.getRawAddress(), boost::numeric_cast<unsigned short>(port_));
+            endpoint = boost::asio::ip::tcp::endpoint(address_.getRawAddress(), port_);
         }
         else {
-            endpoint = boost::asio::ip::tcp::endpoint(boost::asio::ip::tcp::v6(), boost::numeric_cast<unsigned short>(port_));
+            endpoint = boost::asio::ip::tcp::endpoint(boost::asio::ip::tcp::v6(), port_);
         }
         acceptor_ = new boost::asio::ip::tcp::acceptor(*ioService_, endpoint);
         if (endpoint.protocol() ==  boost::asio::ip::tcp::v6()) {
diff --git a/Swiften/Network/BoostConnectionServer.h b/Swiften/Network/BoostConnectionServer.h
index 3dd9830..917d638 100644
--- a/Swiften/Network/BoostConnectionServer.h
+++ b/Swiften/Network/BoostConnectionServer.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
  * All rights reserved.
  * See the COPYING file for more information.
  */
@@ -23,11 +23,11 @@ namespace Swift {
         public:
             typedef std::shared_ptr<BoostConnectionServer> ref;
 
-            static ref create(int port, std::shared_ptr<boost::asio::io_service> ioService, EventLoop* eventLoop) {
+            static ref create(unsigned short port, std::shared_ptr<boost::asio::io_service> ioService, EventLoop* eventLoop) {
                 return ref(new BoostConnectionServer(port, ioService, eventLoop));
             }
 
-            static ref create(const HostAddress &address, int port, std::shared_ptr<boost::asio::io_service> ioService, EventLoop* eventLoop) {
+            static ref create(const HostAddress &address, unsigned short port, std::shared_ptr<boost::asio::io_service> ioService, EventLoop* eventLoop) {
                 return ref(new BoostConnectionServer(address, port, ioService, eventLoop));
             }
 
@@ -40,8 +40,8 @@ namespace Swift {
             boost::signals2::signal<void (boost::optional<Error>)> onStopped;
 
         private:
-            BoostConnectionServer(int port, std::shared_ptr<boost::asio::io_service> ioService, EventLoop* eventLoop);
-            BoostConnectionServer(const HostAddress &address, int port, std::shared_ptr<boost::asio::io_service> ioService, EventLoop* eventLoop);
+            BoostConnectionServer(unsigned short port, std::shared_ptr<boost::asio::io_service> ioService, EventLoop* eventLoop);
+            BoostConnectionServer(const HostAddress &address, unsigned short port, std::shared_ptr<boost::asio::io_service> ioService, EventLoop* eventLoop);
 
             void stop(boost::optional<Error> e);
             void acceptNextConnection();
@@ -49,7 +49,7 @@ namespace Swift {
 
         private:
             HostAddress address_;
-            int port_;
+            unsigned short port_;
             std::shared_ptr<boost::asio::io_service> ioService_;
             EventLoop* eventLoop;
             boost::asio::ip::tcp::acceptor* acceptor_;
diff --git a/Swiften/Network/BoostConnectionServerFactory.cpp b/Swiften/Network/BoostConnectionServerFactory.cpp
index 8b3fd2f..6936453 100644
--- a/Swiften/Network/BoostConnectionServerFactory.cpp
+++ b/Swiften/Network/BoostConnectionServerFactory.cpp
@@ -19,11 +19,11 @@ namespace Swift {
 BoostConnectionServerFactory::BoostConnectionServerFactory(std::shared_ptr<boost::asio::io_service> ioService, EventLoop* eventLoop) : ioService(ioService), eventLoop(eventLoop) {
 }
 
-std::shared_ptr<ConnectionServer> BoostConnectionServerFactory::createConnectionServer(int port) {
+std::shared_ptr<ConnectionServer> BoostConnectionServerFactory::createConnectionServer(unsigned short port) {
     return BoostConnectionServer::create(port, ioService, eventLoop);
 }
 
-std::shared_ptr<ConnectionServer> BoostConnectionServerFactory::createConnectionServer(const Swift::HostAddress &hostAddress, int port) {
+std::shared_ptr<ConnectionServer> BoostConnectionServerFactory::createConnectionServer(const Swift::HostAddress &hostAddress, unsigned short port) {
     return BoostConnectionServer::create(hostAddress, port, ioService, eventLoop);
 }
 
diff --git a/Swiften/Network/BoostConnectionServerFactory.h b/Swiften/Network/BoostConnectionServerFactory.h
index 033e63d..956132b 100644
--- a/Swiften/Network/BoostConnectionServerFactory.h
+++ b/Swiften/Network/BoostConnectionServerFactory.h
@@ -5,7 +5,7 @@
  */
 
 /*
- * Copyright (c) 2015-2016 Isode Limited.
+ * Copyright (c) 2015-2018 Isode Limited.
  * All rights reserved.
  * See the COPYING file for more information.
  */
@@ -25,9 +25,9 @@ namespace Swift {
         public:
             BoostConnectionServerFactory(std::shared_ptr<boost::asio::io_service>, EventLoop* eventLoop);
 
-            virtual std::shared_ptr<ConnectionServer> createConnectionServer(int port);
+            virtual std::shared_ptr<ConnectionServer> createConnectionServer(unsigned short port);
 
-            virtual std::shared_ptr<ConnectionServer> createConnectionServer(const Swift::HostAddress &hostAddress, int port);
+            virtual std::shared_ptr<ConnectionServer> createConnectionServer(const Swift::HostAddress &hostAddress, unsigned short port);
 
         private:
             std::shared_ptr<boost::asio::io_service> ioService;
diff --git a/Swiften/Network/ChainedConnector.cpp b/Swiften/Network/ChainedConnector.cpp
index ea55db3..94899ad 100644
--- a/Swiften/Network/ChainedConnector.cpp
+++ b/Swiften/Network/ChainedConnector.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011-2016 Isode Limited.
+ * Copyright (c) 2011-2018 Isode Limited.
  * All rights reserved.
  * See the COPYING file for more information.
  */
@@ -18,7 +18,7 @@ using namespace Swift;
 
 ChainedConnector::ChainedConnector(
         const std::string& hostname,
-        int port,
+        unsigned short port,
         const boost::optional<std::string>& serviceLookupPrefix,
         DomainNameResolver* resolver,
         const std::vector<ConnectionFactory*>& connectionFactories,
diff --git a/Swiften/Network/ChainedConnector.h b/Swiften/Network/ChainedConnector.h
index a00d7e5..9620293 100644
--- a/Swiften/Network/ChainedConnector.h
+++ b/Swiften/Network/ChainedConnector.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011-2016 Isode Limited.
+ * Copyright (c) 2011-2018 Isode Limited.
  * All rights reserved.
  * See the COPYING file for more information.
  */
@@ -26,7 +26,7 @@ namespace Swift {
 
     class SWIFTEN_API ChainedConnector {
         public:
-            ChainedConnector(const std::string& hostname, int port, const boost::optional<std::string>& serviceLookupPrefix, DomainNameResolver*, const std::vector<ConnectionFactory*>&, TimerFactory*);
+            ChainedConnector(const std::string& hostname, unsigned short port, const boost::optional<std::string>& serviceLookupPrefix, DomainNameResolver*, const std::vector<ConnectionFactory*>&, TimerFactory*);
             ~ChainedConnector();
 
             void setTimeoutMilliseconds(int milliseconds);
@@ -42,7 +42,7 @@ namespace Swift {
 
         private:
             std::string hostname;
-            int port;
+            unsigned short port;
             boost::optional<std::string> serviceLookupPrefix;
             DomainNameResolver* resolver;
             std::vector<ConnectionFactory*> connectionFactories;
diff --git a/Swiften/Network/ConnectionServerFactory.h b/Swiften/Network/ConnectionServerFactory.h
index 413131e..2ebccc1 100644
--- a/Swiften/Network/ConnectionServerFactory.h
+++ b/Swiften/Network/ConnectionServerFactory.h
@@ -5,7 +5,7 @@
  */
 
 /*
- * Copyright (c) 2015-2016 Isode Limited.
+ * Copyright (c) 2015-2018 Isode Limited.
  * All rights reserved.
  * See the COPYING file for more information.
  */
@@ -24,8 +24,8 @@ namespace Swift {
         public:
             virtual ~ConnectionServerFactory();
 
-            virtual std::shared_ptr<ConnectionServer> createConnectionServer(int port) = 0;
+            virtual std::shared_ptr<ConnectionServer> createConnectionServer(unsigned short port) = 0;
 
-            virtual std::shared_ptr<ConnectionServer> createConnectionServer(const Swift::HostAddress& hostAddress, int port) = 0;
+            virtual std::shared_ptr<ConnectionServer> createConnectionServer(const Swift::HostAddress& hostAddress, unsigned short port) = 0;
     };
 }
diff --git a/Swiften/Network/Connector.cpp b/Swiften/Network/Connector.cpp
index ca924bb..a0e6b23 100644
--- a/Swiften/Network/Connector.cpp
+++ b/Swiften/Network/Connector.cpp
@@ -17,7 +17,7 @@
 
 namespace Swift {
 
-Connector::Connector(const std::string& hostname, int port, const boost::optional<std::string>& serviceLookupPrefix, DomainNameResolver* resolver, ConnectionFactory* connectionFactory, TimerFactory* timerFactory) : hostname(hostname), port(port), serviceLookupPrefix(serviceLookupPrefix), resolver(resolver), connectionFactory(connectionFactory), timerFactory(timerFactory), timeoutMilliseconds(0), queriedAllServices(true), foundSomeDNS(false) {
+Connector::Connector(const std::string& hostname, unsigned short port, const boost::optional<std::string>& serviceLookupPrefix, DomainNameResolver* resolver, ConnectionFactory* connectionFactory, TimerFactory* timerFactory) : hostname(hostname), port(port), serviceLookupPrefix(serviceLookupPrefix), resolver(resolver), connectionFactory(connectionFactory), timerFactory(timerFactory), timeoutMilliseconds(0), queriedAllServices(true), foundSomeDNS(false) {
 }
 
 void Connector::setTimeoutMilliseconds(int milliseconds) {
@@ -122,7 +122,7 @@ void Connector::tryNextAddress() {
         HostAddress address = addressQueryResults.front();
         addressQueryResults.pop_front();
 
-        int connectPort = (port == -1 ? 5222 : port);
+        unsigned short connectPort = (port == 0 ? 5222 : port);
         if (!serviceQueryResults.empty()) {
             connectPort = serviceQueryResults.front().port;
         }
diff --git a/Swiften/Network/Connector.h b/Swiften/Network/Connector.h
index d8a1b88..c76a4af 100644
--- a/Swiften/Network/Connector.h
+++ b/Swiften/Network/Connector.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
  * All rights reserved.
  * See the COPYING file for more information.
  */
@@ -30,7 +30,7 @@ namespace Swift {
         public:
             typedef std::shared_ptr<Connector> ref;
 
-            static Connector::ref create(const std::string& hostname, int port, const boost::optional<std::string>& serviceLookupPrefix, DomainNameResolver* resolver, ConnectionFactory* connectionFactory, TimerFactory* timerFactory) {
+            static Connector::ref create(const std::string& hostname, unsigned short port, const boost::optional<std::string>& serviceLookupPrefix, DomainNameResolver* resolver, ConnectionFactory* connectionFactory, TimerFactory* timerFactory) {
                 return ref(new Connector(hostname, port, serviceLookupPrefix, resolver, connectionFactory, timerFactory));
             }
 
@@ -46,7 +46,7 @@ namespace Swift {
             boost::signals2::signal<void (std::shared_ptr<Connection>, std::shared_ptr<Error>)> onConnectFinished;
 
         private:
-            Connector(const std::string& hostname, int port, const boost::optional<std::string>& serviceLookupPrefix, DomainNameResolver*, ConnectionFactory*, TimerFactory*);
+            Connector(const std::string& hostname, unsigned short port, const boost::optional<std::string>& serviceLookupPrefix, DomainNameResolver*, ConnectionFactory*, TimerFactory*);
 
             void handleServiceQueryResult(const std::vector<DomainNameServiceQuery::Result>& result);
             void handleAddressQueryResult(const std::vector<HostAddress>& address, boost::optional<DomainNameResolveError> error);
@@ -63,7 +63,7 @@ namespace Swift {
 
         private:
             std::string hostname;
-            int port;
+            unsigned short port;
             boost::optional<std::string> serviceLookupPrefix;
             DomainNameResolver* resolver;
             ConnectionFactory* connectionFactory;
diff --git a/Swiften/Network/DomainNameServiceQuery.cpp b/Swiften/Network/DomainNameServiceQuery.cpp
index 548c837..5784dd7 100644
--- a/Swiften/Network/DomainNameServiceQuery.cpp
+++ b/Swiften/Network/DomainNameServiceQuery.cpp
@@ -43,16 +43,21 @@ void DomainNameServiceQuery::sortResults(std::vector<DomainNameServiceQuery::Res
                 /* easy hack to account for '0' weights getting at least some weight */
                 return result.weight + 1;
             });
-            for (int j = 0; j < boost::numeric_cast<int>(weights.size() - 1); ++j) {
-                std::vector<int> cumulativeWeights;
-                std::partial_sum(
-                        weights.begin() + j,
-                        weights.end(),
-                        std::back_inserter(cumulativeWeights));
-                int randomNumber = generator.generateRandomInteger(cumulativeWeights.back());
-                auto selectedIndex = std::lower_bound(cumulativeWeights.begin(), cumulativeWeights.end(), randomNumber) - cumulativeWeights.begin();
-                std::swap(i[j], i[j + selectedIndex]);
-                std::swap(weights.begin()[j], weights.begin()[j + selectedIndex]);
+            try {
+                for (int j = 0; j < boost::numeric_cast<int>(weights.size()) - 1; ++j) {
+                    std::vector<int> cumulativeWeights;
+                    std::partial_sum(
+                            weights.begin() + j,
+                            weights.end(),
+                            std::back_inserter(cumulativeWeights));
+                    int randomNumber = generator.generateRandomInteger(cumulativeWeights.back());
+                    auto selectedIndex = std::lower_bound(cumulativeWeights.begin(), cumulativeWeights.end(), randomNumber) - cumulativeWeights.begin();
+                    std::swap(i[j], i[j + selectedIndex]);
+                    std::swap(weights.begin()[j], weights.begin()[j + selectedIndex]);
+                }
+            }
+            catch (const boost::numeric::bad_numeric_cast&) {
+                // In the unlikely event of weights.size() being too large, use the list as-is.
             }
         }
         i = next;
diff --git a/Swiften/Network/DomainNameServiceQuery.h b/Swiften/Network/DomainNameServiceQuery.h
index b27f32e..1631b99 100644
--- a/Swiften/Network/DomainNameServiceQuery.h
+++ b/Swiften/Network/DomainNameServiceQuery.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
  * All rights reserved.
  * See the COPYING file for more information.
  */
@@ -24,9 +24,9 @@ namespace Swift {
             typedef std::shared_ptr<DomainNameServiceQuery> ref;
 
             struct Result {
-                Result(const std::string& hostname = "", int port = -1, int priority = -1, int weight = -1) : hostname(hostname), port(port), priority(priority), weight(weight) {}
+                Result(const std::string& hostname = "", unsigned short port = 0, int priority = -1, int weight = -1) : hostname(hostname), port(port), priority(priority), weight(weight) {}
                 std::string hostname;
-                int port;
+                unsigned short port;
                 int priority;
                 int weight;
             };
diff --git a/Swiften/Network/DummyConnectionServer.h b/Swiften/Network/DummyConnectionServer.h
index 970cbb7..a4fd07f 100644
--- a/Swiften/Network/DummyConnectionServer.h
+++ b/Swiften/Network/DummyConnectionServer.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
  * All rights reserved.
  * See the COPYING file for more information.
  */
@@ -17,8 +17,8 @@
 namespace Swift {
     class SWIFTEN_API DummyConnectionServer : public ConnectionServer, public EventOwner, public std::enable_shared_from_this<DummyConnectionServer> {
         public:
-            DummyConnectionServer(EventLoop* /*eventLoop*/, int port) : localAddressPort(HostAddress(), port) {}
-            DummyConnectionServer(EventLoop* /*eventLoop*/, const Swift::HostAddress& hostAddress, int port) : localAddressPort(hostAddress, port) {}
+            DummyConnectionServer(EventLoop* /*eventLoop*/, unsigned short port) : localAddressPort(HostAddress(), port) {}
+            DummyConnectionServer(EventLoop* /*eventLoop*/, const Swift::HostAddress& hostAddress, unsigned short port) : localAddressPort(hostAddress, port) {}
             virtual ~DummyConnectionServer() {}
 
             virtual HostAddressPort getAddressPort() const {
diff --git a/Swiften/Network/DummyConnectionServerFactory.h b/Swiften/Network/DummyConnectionServerFactory.h
index 822f95f..4b25118 100644
--- a/Swiften/Network/DummyConnectionServerFactory.h
+++ b/Swiften/Network/DummyConnectionServerFactory.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014-2016 Isode Limited.
+ * Copyright (c) 2014-2018 Isode Limited.
  * All rights reserved.
  * See the COPYING file for more information.
  */
@@ -20,11 +20,11 @@ public:
     DummyConnectionServerFactory(EventLoop* eventLoop) : eventLoop(eventLoop) {}
     virtual ~DummyConnectionServerFactory() {}
 
-    virtual std::shared_ptr<ConnectionServer> createConnectionServer(int port) {
+    virtual std::shared_ptr<ConnectionServer> createConnectionServer(unsigned short port) {
         return std::make_shared<DummyConnectionServer>(eventLoop, port);
     }
 
-    virtual std::shared_ptr<ConnectionServer> createConnectionServer(const Swift::HostAddress& hostAddress, int port) {
+    virtual std::shared_ptr<ConnectionServer> createConnectionServer(const Swift::HostAddress& hostAddress, unsigned short port) {
         return std::make_shared<DummyConnectionServer>(eventLoop, hostAddress, port);
     }
 
diff --git a/Swiften/Network/EnvironmentProxyProvider.cpp b/Swiften/Network/EnvironmentProxyProvider.cpp
index 8edb136..65cf4ff 100644
--- a/Swiften/Network/EnvironmentProxyProvider.cpp
+++ b/Swiften/Network/EnvironmentProxyProvider.cpp
@@ -17,6 +17,8 @@
 
 #include <iostream>
 
+#include <boost/numeric/conversion/cast.hpp>
+
 #include <Swiften/Base/Log.h>
 
 namespace Swift {
@@ -38,7 +40,7 @@ HostAddressPort EnvironmentProxyProvider::getSOCKS5Proxy() const {
 HostAddressPort EnvironmentProxyProvider::getFromEnv(const char* envVarName, std::string proxyProtocol) {
     char* envVar = nullptr;
     std::string address;
-    int port = 0;
+    unsigned short port = 0;
 
     envVar = getenv(envVarName);
 
@@ -46,7 +48,11 @@ HostAddressPort EnvironmentProxyProvider::getFromEnv(const char* envVarName, std
     address = envVar != nullptr ? envVar : "0.0.0.0";
     if(envVar != nullptr && address.compare(0, proxyProtocol.length(), proxyProtocol) == 0) {
         address = address.substr(proxyProtocol.length(), address.length());
-        port = atoi(address.substr(address.find(':') + 1, address.length()).c_str());
+        try {
+            port = boost::numeric_cast<unsigned short>(atoi(address.substr(address.find(':') + 1, address.length()).c_str()));
+        }
+        catch (boost::numeric::bad_numeric_cast&) {
+        }
         address = address.substr(0, address.find(':'));
     }
 
diff --git a/Swiften/Network/GConfProxyProvider.cpp b/Swiften/Network/GConfProxyProvider.cpp
index eade450..7c31868 100644
--- a/Swiften/Network/GConfProxyProvider.cpp
+++ b/Swiften/Network/GConfProxyProvider.cpp
@@ -5,7 +5,7 @@
  */
 
 /*
- * Copyright (c) 2016-2017 Isode Limited.
+ * Copyright (c) 2016-2018 Isode Limited.
  * All rights reserved.
  * See the COPYING file for more information.
  */
@@ -21,6 +21,8 @@ extern "C" {
 #include <gconf/gconf-client.h>
 }
 
+#include <boost/numeric/conversion/cast.hpp>
+
 #include <Swiften/Base/Log.h>
 
 namespace Swift {
@@ -50,13 +52,17 @@ HostAddressPort GConfProxyProvider::getSOCKS5Proxy() const {
 
 HostAddressPort GConfProxyProvider::getFromGConf(const char* gcHost, const char* gcPort) {
     std::string address;
-    int port = 0;
+    unsigned short port = 0;
     gchar* str;
 
     GConfClient* client = gconf_client_get_default();
 
     str = gconf_client_get_string(client, gcHost, NULL);
-    port = static_cast<int> (gconf_client_get_int(client, gcPort, NULL));
+    try {
+        port = boost::numeric_cast<unsigned short>(gconf_client_get_int(client, gcPort, NULL));
+    }
+    catch (const boost::numeric::bad_numeric_cast&) {
+    }
 
     if(str) {
         address = static_cast<char*> (str);
diff --git a/Swiften/Network/HTTPConnectProxiedConnection.cpp b/Swiften/Network/HTTPConnectProxiedConnection.cpp
index b5e521b..8eba49e 100644
--- a/Swiften/Network/HTTPConnectProxiedConnection.cpp
+++ b/Swiften/Network/HTTPConnectProxiedConnection.cpp
@@ -5,7 +5,7 @@
  */
 
 /*
- * Copyright (c) 2011-2016 Isode Limited.
+ * Copyright (c) 2011-2018 Isode Limited.
  * All rights reserved.
  * See the COPYING file for more information.
  */
@@ -36,7 +36,7 @@ HTTPConnectProxiedConnection::HTTPConnectProxiedConnection(
         ConnectionFactory* connectionFactory,
         TimerFactory* timerFactory,
         const std::string& proxyHost,
-        int proxyPort,
+        unsigned short proxyPort,
         const SafeString& authID,
         const SafeString& authPassword) :
             ProxiedConnection(resolver, connectionFactory, timerFactory, proxyHost, proxyPort),
diff --git a/Swiften/Network/HTTPConnectProxiedConnection.h b/Swiften/Network/HTTPConnectProxiedConnection.h
index 6592839..a83d47c 100644
--- a/Swiften/Network/HTTPConnectProxiedConnection.h
+++ b/Swiften/Network/HTTPConnectProxiedConnection.h
@@ -5,7 +5,7 @@
  */
 
 /*
- * Copyright (c) 2011-2017 Isode Limited.
+ * Copyright (c) 2011-2018 Isode Limited.
  * All rights reserved.
  * See the COPYING file for more information.
  */
@@ -30,14 +30,14 @@ namespace Swift {
 
             virtual ~HTTPConnectProxiedConnection();
 
-            static ref create(DomainNameResolver* resolver, ConnectionFactory* connectionFactory, TimerFactory* timerFactory, const std::string& proxyHost, int proxyPort, const SafeString& authID, const SafeString& authPassword) {
+            static ref create(DomainNameResolver* resolver, ConnectionFactory* connectionFactory, TimerFactory* timerFactory, const std::string& proxyHost, unsigned short proxyPort, const SafeString& authID, const SafeString& authPassword) {
                 return ref(new HTTPConnectProxiedConnection(resolver, connectionFactory, timerFactory, proxyHost, proxyPort, authID, authPassword));
             }
 
             void setHTTPTrafficFilter(std::shared_ptr<HTTPTrafficFilter> trafficFilter);
 
         private:
-            HTTPConnectProxiedConnection(DomainNameResolver* resolver, ConnectionFactory* connectionFactory, TimerFactory* timerFactory, const std::string& proxyHost, int proxyPort, const SafeString& authID, const SafeString& authPassword);
+            HTTPConnectProxiedConnection(DomainNameResolver* resolver, ConnectionFactory* connectionFactory, TimerFactory* timerFactory, const std::string& proxyHost, unsigned short proxyPort, const SafeString& authID, const SafeString& authPassword);
 
             virtual void initializeProxy();
             virtual void handleProxyInitializeData(std::shared_ptr<SafeByteArray> data);
diff --git a/Swiften/Network/HTTPConnectProxiedConnectionFactory.cpp b/Swiften/Network/HTTPConnectProxiedConnectionFactory.cpp
index 91ace3d..54b998a 100644
--- a/Swiften/Network/HTTPConnectProxiedConnectionFactory.cpp
+++ b/Swiften/Network/HTTPConnectProxiedConnectionFactory.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012-2016 Isode Limited.
+ * Copyright (c) 2012-2018 Isode Limited.
  * All rights reserved.
  * See the COPYING file for more information.
  */
@@ -16,11 +16,11 @@
 
 namespace Swift {
 
-HTTPConnectProxiedConnectionFactory::HTTPConnectProxiedConnectionFactory(DomainNameResolver* resolver, ConnectionFactory* connectionFactory, TimerFactory* timerFactory, const std::string& proxyHost, int proxyPort, std::shared_ptr<HTTPTrafficFilter> httpTrafficFilter) : resolver_(resolver), connectionFactory_(connectionFactory), timerFactory_(timerFactory), proxyHost_(proxyHost), proxyPort_(proxyPort),  authID_(""), authPassword_(""), httpTrafficFilter_(httpTrafficFilter) {
+HTTPConnectProxiedConnectionFactory::HTTPConnectProxiedConnectionFactory(DomainNameResolver* resolver, ConnectionFactory* connectionFactory, TimerFactory* timerFactory, const std::string& proxyHost, unsigned short proxyPort, std::shared_ptr<HTTPTrafficFilter> httpTrafficFilter) : resolver_(resolver), connectionFactory_(connectionFactory), timerFactory_(timerFactory), proxyHost_(proxyHost), proxyPort_(proxyPort),  authID_(""), authPassword_(""), httpTrafficFilter_(httpTrafficFilter) {
 }
 
 
-HTTPConnectProxiedConnectionFactory::HTTPConnectProxiedConnectionFactory(DomainNameResolver* resolver, ConnectionFactory* connectionFactory, TimerFactory* timerFactory, const std::string& proxyHost, int proxyPort, const SafeString& authID, const SafeString& authPassword, std::shared_ptr<HTTPTrafficFilter> httpTrafficFilter) : resolver_(resolver), connectionFactory_(connectionFactory), timerFactory_(timerFactory), proxyHost_(proxyHost), proxyPort_(proxyPort), authID_(authID), authPassword_(authPassword),  httpTrafficFilter_(httpTrafficFilter) {
+HTTPConnectProxiedConnectionFactory::HTTPConnectProxiedConnectionFactory(DomainNameResolver* resolver, ConnectionFactory* connectionFactory, TimerFactory* timerFactory, const std::string& proxyHost, unsigned short proxyPort, const SafeString& authID, const SafeString& authPassword, std::shared_ptr<HTTPTrafficFilter> httpTrafficFilter) : resolver_(resolver), connectionFactory_(connectionFactory), timerFactory_(timerFactory), proxyHost_(proxyHost), proxyPort_(proxyPort), authID_(authID), authPassword_(authPassword),  httpTrafficFilter_(httpTrafficFilter) {
 }
 
 std::shared_ptr<Connection> HTTPConnectProxiedConnectionFactory::createConnection() {
diff --git a/Swiften/Network/HTTPConnectProxiedConnectionFactory.h b/Swiften/Network/HTTPConnectProxiedConnectionFactory.h
index 395f64f..7a5f527 100644
--- a/Swiften/Network/HTTPConnectProxiedConnectionFactory.h
+++ b/Swiften/Network/HTTPConnectProxiedConnectionFactory.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012-2017 Isode Limited.
+ * Copyright (c) 2012-2018 Isode Limited.
  * All rights reserved.
  * See the COPYING file for more information.
  */
@@ -24,8 +24,8 @@ namespace Swift {
 
     class SWIFTEN_API HTTPConnectProxiedConnectionFactory : public ConnectionFactory {
         public:
-            HTTPConnectProxiedConnectionFactory(DomainNameResolver* resolver, ConnectionFactory* connectionFactory, TimerFactory* timerFactory, const std::string& proxyHost, int proxyPort, std::shared_ptr<HTTPTrafficFilter> httpTrafficFilter = std::shared_ptr<HTTPTrafficFilter>());
-            HTTPConnectProxiedConnectionFactory(DomainNameResolver* resolver, ConnectionFactory* connectionFactory, TimerFactory* timerFactory, const std::string& proxyHost, int proxyPort, const SafeString& authID, const SafeString& authPassword, std::shared_ptr<HTTPTrafficFilter> httpTrafficFilter = std::shared_ptr<HTTPTrafficFilter>());
+            HTTPConnectProxiedConnectionFactory(DomainNameResolver* resolver, ConnectionFactory* connectionFactory, TimerFactory* timerFactory, const std::string& proxyHost, unsigned short proxyPort, std::shared_ptr<HTTPTrafficFilter> httpTrafficFilter = std::shared_ptr<HTTPTrafficFilter>());
+            HTTPConnectProxiedConnectionFactory(DomainNameResolver* resolver, ConnectionFactory* connectionFactory, TimerFactory* timerFactory, const std::string& proxyHost, unsigned short proxyPort, const SafeString& authID, const SafeString& authPassword, std::shared_ptr<HTTPTrafficFilter> httpTrafficFilter = std::shared_ptr<HTTPTrafficFilter>());
 
             virtual std::shared_ptr<Connection> createConnection();
 
@@ -34,7 +34,7 @@ namespace Swift {
             ConnectionFactory* connectionFactory_;
             TimerFactory* timerFactory_;
             std::string proxyHost_;
-            int proxyPort_;
+            unsigned short proxyPort_;
             SafeString authID_;
             SafeString authPassword_;
             std::shared_ptr<HTTPTrafficFilter> httpTrafficFilter_;
diff --git a/Swiften/Network/HostAddressPort.cpp b/Swiften/Network/HostAddressPort.cpp
index 401ddec..248be2d 100644
--- a/Swiften/Network/HostAddressPort.cpp
+++ b/Swiften/Network/HostAddressPort.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
  * All rights reserved.
  * See the COPYING file for more information.
  */
@@ -10,7 +10,7 @@
 
 using namespace Swift;
 
-HostAddressPort::HostAddressPort(const HostAddress& address, int port) : address_(address), port_(port) {
+HostAddressPort::HostAddressPort(const HostAddress& address, unsigned short port) : address_(address), port_(port) {
 }
 
 HostAddressPort::HostAddressPort(const boost::asio::ip::tcp::endpoint& endpoint) {
diff --git a/Swiften/Network/HostAddressPort.h b/Swiften/Network/HostAddressPort.h
index e42e1d1..14c7c66 100644
--- a/Swiften/Network/HostAddressPort.h
+++ b/Swiften/Network/HostAddressPort.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
  * All rights reserved.
  * See the COPYING file for more information.
  */
@@ -14,14 +14,14 @@
 namespace Swift {
     class SWIFTEN_API HostAddressPort {
         public:
-            HostAddressPort(const HostAddress& address = HostAddress(), int port = -1);
+            HostAddressPort(const HostAddress& address = HostAddress(), unsigned short port = 0);
             HostAddressPort(const boost::asio::ip::tcp::endpoint& endpoint);
 
             const HostAddress& getAddress() const {
                 return address_;
             }
 
-            int getPort() const {
+            unsigned short getPort() const {
                 return port_;
             }
 
@@ -37,6 +37,6 @@ namespace Swift {
 
         private:
             HostAddress address_;
-            int port_;
+            unsigned short port_;
     };
 }
diff --git a/Swiften/Network/MacOSXProxyProvider.cpp b/Swiften/Network/MacOSXProxyProvider.cpp
index 232fc60..d3b10dd 100644
--- a/Swiften/Network/MacOSXProxyProvider.cpp
+++ b/Swiften/Network/MacOSXProxyProvider.cpp
@@ -5,7 +5,7 @@
  */
 
 /*
- * Copyright (c) 2013-2016 Isode Limited.
+ * Copyright (c) 2013-2018 Isode Limited.
  * All rights reserved.
  * See the COPYING file for more information.
  */
@@ -40,13 +40,15 @@ static HostAddressPort getFromDictionary(CFDictionaryRef dict, CFStringRef enabl
         CFRelease(zero);
 
         if(result != kCFCompareEqualTo) {
-            int port = 0;
+            unsigned short port = 0;
             std::string host = "";
 
             try {
                 CFNumberRef numberValue = reinterpret_cast<CFNumberRef> (CFDictionaryGetValue(dict, portKey));
                 if(numberValue != nullptr) {
-                    CFNumberGetValue(numberValue, kCFNumberIntType, &port);
+                    int intPort = 0;
+                    CFNumberGetValue(numberValue, kCFNumberIntType, &intPort);
+                    port = boost::numeric_cast<unsigned short>(intPort);
                 }
 
                 CFStringRef stringValue = reinterpret_cast<CFStringRef> (CFDictionaryGetValue(dict, hostKey));
diff --git a/Swiften/Network/MiniUPnPInterface.cpp b/Swiften/Network/MiniUPnPInterface.cpp
index 2c61ad3..af3b67c 100644
--- a/Swiften/Network/MiniUPnPInterface.cpp
+++ b/Swiften/Network/MiniUPnPInterface.cpp
@@ -5,7 +5,7 @@
  */
 
 /*
- * Copyright (c) 2015-2016 Isode Limited.
+ * Copyright (c) 2015-2018 Isode Limited.
  * All rights reserved.
  * See the COPYING file for more information.
  */
@@ -73,7 +73,7 @@ boost::optional<HostAddress> MiniUPnPInterface::getPublicIP() {
     }
 }
 
-boost::optional<NATPortMapping> MiniUPnPInterface::addPortForward(int actualLocalPort, int actualPublicPort) {
+boost::optional<NATPortMapping> MiniUPnPInterface::addPortForward(unsigned short actualLocalPort, unsigned short actualPublicPort) {
     if (!p->isValid) {
         return boost::optional<NATPortMapping>();
     }
diff --git a/Swiften/Network/MiniUPnPInterface.h b/Swiften/Network/MiniUPnPInterface.h
index 89457b8..8c68268 100644
--- a/Swiften/Network/MiniUPnPInterface.h
+++ b/Swiften/Network/MiniUPnPInterface.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011-2016 Isode Limited.
+ * Copyright (c) 2011-2018 Isode Limited.
  * Licensed under the simplified BSD license.
  * See Documentation/Licenses/BSD-simplified.txt for more information.
  */
@@ -23,7 +23,7 @@ namespace Swift {
             virtual bool isAvailable();
 
             boost::optional<HostAddress> getPublicIP();
-            boost::optional<NATPortMapping> addPortForward(int localPort, int publicPort);
+            boost::optional<NATPortMapping> addPortForward(unsigned short localPort, unsigned short publicPort);
             bool removePortForward(const NATPortMapping&);
 
         private:
diff --git a/Swiften/Network/NATPMPInterface.cpp b/Swiften/Network/NATPMPInterface.cpp
index 5e0b3b3..8ab26d4 100644
--- a/Swiften/Network/NATPMPInterface.cpp
+++ b/Swiften/Network/NATPMPInterface.cpp
@@ -5,7 +5,7 @@
  */
 
 /*
- * Copyright (c) 2014-2016 Isode Limited.
+ * Copyright (c) 2014-2018 Isode Limited.
  * All rights reserved.
  * See the COPYING file for more information.
  */
@@ -74,13 +74,13 @@ boost::optional<HostAddress> NATPMPInterface::getPublicIP() {
     }
 }
 
-boost::optional<NATPortMapping> NATPMPInterface::addPortForward(int localPort, int publicPort) {
+boost::optional<NATPortMapping> NATPMPInterface::addPortForward(unsigned short localPort, unsigned short publicPort) {
     NATPortMapping mapping(localPort, publicPort, NATPortMapping::TCP);
     if (sendnewportmappingrequest(
                 &p->natpmp,
                 mapping.getProtocol() == NATPortMapping::TCP ? NATPMP_PROTOCOL_TCP : NATPMP_PROTOCOL_UDP,
-                boost::numeric_cast<uint16_t>(mapping.getLocalPort()),
-                boost::numeric_cast<uint16_t>(mapping.getPublicPort()),
+                mapping.getLocalPort(),
+                mapping.getPublicPort(),
                 boost::numeric_cast<uint32_t>(mapping.getLeaseInSeconds())) < 0) {
         SWIFT_LOG(debug) << "Failed to send NAT-PMP port forwarding request!" << std::endl;
         return boost::optional<NATPortMapping>();
diff --git a/Swiften/Network/NATPMPInterface.h b/Swiften/Network/NATPMPInterface.h
index e1666c8..58d62b6 100644
--- a/Swiften/Network/NATPMPInterface.h
+++ b/Swiften/Network/NATPMPInterface.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011-2016 Isode Limited.
+ * Copyright (c) 2011-2018 Isode Limited.
  * Licensed under the simplified BSD license.
  * See Documentation/Licenses/BSD-simplified.txt for more information.
  */
@@ -23,7 +23,7 @@ namespace Swift {
             virtual bool isAvailable();
 
             virtual boost::optional<HostAddress> getPublicIP();
-            virtual boost::optional<NATPortMapping> addPortForward(int localPort, int publicPort);
+            virtual boost::optional<NATPortMapping> addPortForward(unsigned short localPort, unsigned short publicPort);
             virtual bool removePortForward(const NATPortMapping&);
 
         private:
diff --git a/Swiften/Network/NATPortMapping.h b/Swiften/Network/NATPortMapping.h
index ff8fde3..b68052d 100644
--- a/Swiften/Network/NATPortMapping.h
+++ b/Swiften/Network/NATPortMapping.h
@@ -23,16 +23,16 @@ namespace Swift {
             UDP
         };
 
-        NATPortMapping(int localPort, int publicPort, Protocol protocol = TCP, int leaseInSeconds = 60 * 60 * 24) :
+        NATPortMapping(unsigned short localPort, unsigned short publicPort, Protocol protocol = TCP, int leaseInSeconds = 60 * 60 * 24) :
             publicPort(publicPort), localPort(localPort), protocol(protocol), leaseInSeconds(leaseInSeconds) {
 
         }
 
-        int getPublicPort() const {
+        unsigned short getPublicPort() const {
             return publicPort;
         }
 
-        int getLocalPort() const {
+        unsigned short getLocalPort() const {
             return localPort;
         }
 
@@ -45,8 +45,8 @@ namespace Swift {
         }
 
     private:
-        int publicPort;
-        int localPort;
+        unsigned short publicPort;
+        unsigned short localPort;
         Protocol protocol;
         int leaseInSeconds;
     };
diff --git a/Swiften/Network/NATTraversalInterface.h b/Swiften/Network/NATTraversalInterface.h
index ea9ed6a..1655eb6 100644
--- a/Swiften/Network/NATTraversalInterface.h
+++ b/Swiften/Network/NATTraversalInterface.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011-2015 Isode Limited.
+ * Copyright (c) 2011-2018 Isode Limited.
  * Licensed under the simplified BSD license.
  * See Documentation/Licenses/BSD-simplified.txt for more information.
  */
@@ -19,7 +19,7 @@ namespace Swift {
             virtual bool isAvailable() = 0;
 
             virtual boost::optional<HostAddress> getPublicIP() = 0;
-            virtual boost::optional<NATPortMapping> addPortForward(int localPort, int publicPort) = 0;
+            virtual boost::optional<NATPortMapping> addPortForward(unsigned short localPort, unsigned short publicPort) = 0;
             virtual bool removePortForward(const NATPortMapping&) = 0;
     };
 }
diff --git a/Swiften/Network/NATTraversalRemovePortForwardingRequest.h b/Swiften/Network/NATTraversalRemovePortForwardingRequest.h
index 3db9ee1..83235f9 100644
--- a/Swiften/Network/NATTraversalRemovePortForwardingRequest.h
+++ b/Swiften/Network/NATTraversalRemovePortForwardingRequest.h
@@ -5,7 +5,7 @@
  */
 
 /*
- * Copyright (c) 2015-2016 Isode Limited.
+ * Copyright (c) 2015-2018 Isode Limited.
  * All rights reserved.
  * See the COPYING file for more information.
  */
@@ -26,8 +26,8 @@ namespace Swift {
                     UDP
                 };
 
-                unsigned int publicPort;
-                unsigned int localPort;
+                unsigned short publicPort;
+                unsigned short localPort;
                 Protocol protocol;
                 unsigned long leaseInSeconds;
             };
diff --git a/Swiften/Network/NATTraverser.h b/Swiften/Network/NATTraverser.h
index 716bfcb..7f03c03 100644
--- a/Swiften/Network/NATTraverser.h
+++ b/Swiften/Network/NATTraverser.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011-2016 Isode Limited.
+ * Copyright (c) 2011-2018 Isode Limited.
  * All rights reserved.
  * See the COPYING file for more information.
  */
@@ -20,7 +20,7 @@ namespace Swift {
             virtual ~NATTraverser();
 
             virtual std::shared_ptr<NATTraversalGetPublicIPRequest> createGetPublicIPRequest() = 0;
-            virtual std::shared_ptr<NATTraversalForwardPortRequest> createForwardPortRequest(int localPort, int publicPort) = 0;
-            virtual std::shared_ptr<NATTraversalRemovePortForwardingRequest> createRemovePortForwardingRequest(int localPort, int publicPort) = 0;
+            virtual std::shared_ptr<NATTraversalForwardPortRequest> createForwardPortRequest(unsigned short localPort, unsigned short publicPort) = 0;
+            virtual std::shared_ptr<NATTraversalRemovePortForwardingRequest> createRemovePortForwardingRequest(unsigned short localPort, unsigned short publicPort) = 0;
     };
 }
diff --git a/Swiften/Network/NullNATTraversalInterface.h b/Swiften/Network/NullNATTraversalInterface.h
index ecbf110..eabc197 100644
--- a/Swiften/Network/NullNATTraversalInterface.h
+++ b/Swiften/Network/NullNATTraversalInterface.h
@@ -21,7 +21,7 @@ namespace Swift {
                 return boost::optional<HostAddress>();
             }
 
-            virtual boost::optional<NATPortMapping> addPortForward(int, int) {
+            virtual boost::optional<NATPortMapping> addPortForward(unsigned short, unsigned short) {
                 return boost::optional<NATPortMapping>();
             }
 
diff --git a/Swiften/Network/NullNATTraverser.cpp b/Swiften/Network/NullNATTraverser.cpp
index cc8bae0..0b9464e 100644
--- a/Swiften/Network/NullNATTraverser.cpp
+++ b/Swiften/Network/NullNATTraverser.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011-2016 Isode Limited.
+ * Copyright (c) 2011-2018 Isode Limited.
  * All rights reserved.
  * See the COPYING file for more information.
  */
@@ -72,11 +72,11 @@ std::shared_ptr<NATTraversalGetPublicIPRequest> NullNATTraverser::createGetPubli
     return std::make_shared<NullNATTraversalGetPublicIPRequest>(eventLoop);
 }
 
-std::shared_ptr<NATTraversalForwardPortRequest> NullNATTraverser::createForwardPortRequest(int, int) {
+std::shared_ptr<NATTraversalForwardPortRequest> NullNATTraverser::createForwardPortRequest(unsigned short, unsigned short) {
     return std::make_shared<NullNATTraversalForwardPortRequest>(eventLoop);
 }
 
-std::shared_ptr<NATTraversalRemovePortForwardingRequest> NullNATTraverser::createRemovePortForwardingRequest(int, int) {
+std::shared_ptr<NATTraversalRemovePortForwardingRequest> NullNATTraverser::createRemovePortForwardingRequest(unsigned short, unsigned short) {
     return std::make_shared<NullNATTraversalRemovePortForwardingRequest>(eventLoop);
 }
 
diff --git a/Swiften/Network/NullNATTraverser.h b/Swiften/Network/NullNATTraverser.h
index d3a6640..2f975bf 100644
--- a/Swiften/Network/NullNATTraverser.h
+++ b/Swiften/Network/NullNATTraverser.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011-2016 Isode Limited.
+ * Copyright (c) 2011-2018 Isode Limited.
  * All rights reserved.
  * See the COPYING file for more information.
  */
@@ -16,8 +16,8 @@ namespace Swift {
             NullNATTraverser(EventLoop* eventLoop);
 
             std::shared_ptr<NATTraversalGetPublicIPRequest> createGetPublicIPRequest();
-            std::shared_ptr<NATTraversalForwardPortRequest> createForwardPortRequest(int localPort, int publicPort);
-            std::shared_ptr<NATTraversalRemovePortForwardingRequest> createRemovePortForwardingRequest(int localPort, int publicPort);
+            std::shared_ptr<NATTraversalForwardPortRequest> createForwardPortRequest(unsigned short localPort, unsigned short publicPort);
+            std::shared_ptr<NATTraversalRemovePortForwardingRequest> createRemovePortForwardingRequest(unsigned short localPort, unsigned short publicPort);
 
         private:
             EventLoop* eventLoop;
diff --git a/Swiften/Network/PlatformDomainNameServiceQuery.cpp b/Swiften/Network/PlatformDomainNameServiceQuery.cpp
index a5d180b..f884500 100644
--- a/Swiften/Network/PlatformDomainNameServiceQuery.cpp
+++ b/Swiften/Network/PlatformDomainNameServiceQuery.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
  * All rights reserved.
  * See the COPYING file for more information.
  */
@@ -129,35 +129,42 @@ void PlatformDomainNameServiceQuery::runBlocking() {
         currentEntry += entryLength;
         currentEntry += NS_RRFIXEDSZ;
 
-        // Priority
-        if (currentEntry + 2 >= messageEnd) {
-            emitError();
-            return;
-        }
-        record.priority = boost::numeric_cast<int>(ns_get16(currentEntry));
-        currentEntry += 2;
-
-        // Weight
-        if (currentEntry + 2 >= messageEnd) {
-            emitError();
-            return;
+        try {
+            // Priority
+            if (currentEntry + 2 >= messageEnd) {
+                emitError();
+                return;
+            }
+            record.priority = boost::numeric_cast<int>(ns_get16(currentEntry));
+            currentEntry += 2;
+
+            // Weight
+            if (currentEntry + 2 >= messageEnd) {
+                emitError();
+                return;
+            }
+            record.weight = boost::numeric_cast<int>(ns_get16(currentEntry));
+            currentEntry += 2;
+
+            // Port
+            if (currentEntry + 2 >= messageEnd) {
+                emitError();
+                return;
+            }
+            record.port = boost::numeric_cast<unsigned short>(ns_get16(currentEntry));
+            currentEntry += 2;
+
+            // Hostname
+            if (currentEntry >= messageEnd) {
+                emitError();
+                return;
+            }
         }
-        record.weight = boost::numeric_cast<int>(ns_get16(currentEntry));
-        currentEntry += 2;
-
-        // Port
-        if (currentEntry + 2 >= messageEnd) {
+        catch (const boost::numeric::bad_numeric_cast&) {
             emitError();
             return;
         }
-        record.port = boost::numeric_cast<int>(ns_get16(currentEntry));
-        currentEntry += 2;
 
-        // Hostname
-        if (currentEntry >= messageEnd) {
-            emitError();
-            return;
-        }
         ByteArray entry;
         entry.resize(NS_MAXDNAME);
         entryLength = dn_expand(messageStart, messageEnd, currentEntry, reinterpret_cast<char*>(vecptr(entry)), entry.size());
diff --git a/Swiften/Network/PlatformNATTraversalWorker.cpp b/Swiften/Network/PlatformNATTraversalWorker.cpp
index f56de0b..af12049 100644
--- a/Swiften/Network/PlatformNATTraversalWorker.cpp
+++ b/Swiften/Network/PlatformNATTraversalWorker.cpp
@@ -84,7 +84,7 @@ class PlatformNATTraversalGetPublicIPRequest : public NATTraversalGetPublicIPReq
 
 class PlatformNATTraversalForwardPortRequest : public NATTraversalForwardPortRequest, public PlatformNATTraversalRequest {
     public:
-        PlatformNATTraversalForwardPortRequest(PlatformNATTraversalWorker* worker, unsigned int localIP, unsigned int publicIP) : PlatformNATTraversalRequest(worker), localIP(localIP), publicIP(publicIP) {
+        PlatformNATTraversalForwardPortRequest(PlatformNATTraversalWorker* worker, unsigned short localPort, unsigned short publicPort) : PlatformNATTraversalRequest(worker), localPort(localPort), publicPort(publicPort) {
         }
 
         virtual ~PlatformNATTraversalForwardPortRequest() {
@@ -99,12 +99,12 @@ class PlatformNATTraversalForwardPortRequest : public NATTraversalForwardPortReq
         }
 
         virtual void runBlocking() {
-            getEventLoop()->postEvent(boost::bind(boost::ref(onResult), getNATTraversalInterface()->addPortForward(boost::numeric_cast<int>(localIP), boost::numeric_cast<int>(publicIP))), shared_from_this());
+            getEventLoop()->postEvent(boost::bind(boost::ref(onResult), getNATTraversalInterface()->addPortForward(localPort, publicPort)), shared_from_this());
         }
 
     private:
-        unsigned int localIP;
-        unsigned int publicIP;
+        unsigned short localPort;
+        unsigned short publicPort;
 };
 
 class PlatformNATTraversalRemovePortForwardingRequest : public NATTraversalRemovePortForwardingRequest, public PlatformNATTraversalRequest {
@@ -181,11 +181,11 @@ std::shared_ptr<NATTraversalGetPublicIPRequest> PlatformNATTraversalWorker::crea
     return std::make_shared<PlatformNATTraversalGetPublicIPRequest>(this);
 }
 
-std::shared_ptr<NATTraversalForwardPortRequest> PlatformNATTraversalWorker::createForwardPortRequest(int localPort, int publicPort) {
+std::shared_ptr<NATTraversalForwardPortRequest> PlatformNATTraversalWorker::createForwardPortRequest(unsigned short localPort, unsigned short publicPort) {
     return std::make_shared<PlatformNATTraversalForwardPortRequest>(this, localPort, publicPort);
 }
 
-std::shared_ptr<NATTraversalRemovePortForwardingRequest> PlatformNATTraversalWorker::createRemovePortForwardingRequest(int localPort, int publicPort) {
+std::shared_ptr<NATTraversalRemovePortForwardingRequest> PlatformNATTraversalWorker::createRemovePortForwardingRequest(unsigned short localPort, unsigned short publicPort) {
     NATPortMapping mapping(localPort, publicPort, NATPortMapping::TCP); // FIXME
     return std::make_shared<PlatformNATTraversalRemovePortForwardingRequest>(this, mapping);
 }
diff --git a/Swiften/Network/PlatformNATTraversalWorker.h b/Swiften/Network/PlatformNATTraversalWorker.h
index aee1052..368798e 100644
--- a/Swiften/Network/PlatformNATTraversalWorker.h
+++ b/Swiften/Network/PlatformNATTraversalWorker.h
@@ -5,7 +5,7 @@
  */
 
 /*
- * Copyright (c) 2016-2017 Isode Limited.
+ * Copyright (c) 2016-2018 Isode Limited.
  * All rights reserved.
  * See the COPYING file for more information.
  */
@@ -44,8 +44,8 @@ namespace Swift {
             virtual ~PlatformNATTraversalWorker();
 
             std::shared_ptr<NATTraversalGetPublicIPRequest> createGetPublicIPRequest();
-            std::shared_ptr<NATTraversalForwardPortRequest> createForwardPortRequest(int localPort, int publicPort);
-            std::shared_ptr<NATTraversalRemovePortForwardingRequest> createRemovePortForwardingRequest(int localPort, int publicPort);
+            std::shared_ptr<NATTraversalForwardPortRequest> createForwardPortRequest(unsigned short localPort, unsigned short publicPort);
+            std::shared_ptr<NATTraversalRemovePortForwardingRequest> createRemovePortForwardingRequest(unsigned short localPort, unsigned short publicPort);
 
         private:
             NATTraversalInterface* getNATTraversalInterface() const;
diff --git a/Swiften/Network/ProxiedConnection.cpp b/Swiften/Network/ProxiedConnection.cpp
index aa6c4d2..4c97e31 100644
--- a/Swiften/Network/ProxiedConnection.cpp
+++ b/Swiften/Network/ProxiedConnection.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012-2016 Isode Limited.
+ * Copyright (c) 2012-2018 Isode Limited.
  * All rights reserved.
  * See the COPYING file for more information.
  */
@@ -20,7 +20,7 @@ ProxiedConnection::ProxiedConnection(
         ConnectionFactory* connectionFactory,
         TimerFactory* timerFactory,
         const std::string& proxyHost,
-        int proxyPort) :
+        unsigned short proxyPort) :
             resolver_(resolver),
             connectionFactory_(connectionFactory),
             timerFactory_(timerFactory),
diff --git a/Swiften/Network/ProxiedConnection.h b/Swiften/Network/ProxiedConnection.h
index 440fb86..f79845a 100644
--- a/Swiften/Network/ProxiedConnection.h
+++ b/Swiften/Network/ProxiedConnection.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012-2017 Isode Limited.
+ * Copyright (c) 2012-2018 Isode Limited.
  * All rights reserved.
  * See the COPYING file for more information.
  */
@@ -20,7 +20,7 @@ namespace Swift {
 
     class SWIFTEN_API ProxiedConnection : public Connection, public std::enable_shared_from_this<ProxiedConnection> {
         public:
-            ProxiedConnection(DomainNameResolver* resolver, ConnectionFactory* connectionFactory, TimerFactory* timerFactory, const std::string& proxyHost, int proxyPort);
+            ProxiedConnection(DomainNameResolver* resolver, ConnectionFactory* connectionFactory, TimerFactory* timerFactory, const std::string& proxyHost, unsigned short proxyPort);
             virtual ~ProxiedConnection();
 
             virtual void listen();
@@ -55,7 +55,7 @@ namespace Swift {
             ConnectionFactory* connectionFactory_;
             TimerFactory* timerFactory_;
             std::string proxyHost_;
-            int proxyPort_;
+            unsigned short proxyPort_;
             HostAddressPort server_;
             Connector::ref connector_;
             std::shared_ptr<Connection> connection_;
diff --git a/Swiften/Network/SOCKS5ProxiedConnection.cpp b/Swiften/Network/SOCKS5ProxiedConnection.cpp
index 2492827..d7036f2 100644
--- a/Swiften/Network/SOCKS5ProxiedConnection.cpp
+++ b/Swiften/Network/SOCKS5ProxiedConnection.cpp
@@ -5,7 +5,7 @@
  */
 
 /*
- * Copyright (c) 2014-2016 Isode Limited.
+ * Copyright (c) 2014-2018 Isode Limited.
  * All rights reserved.
  * See the COPYING file for more information.
  */
@@ -27,7 +27,7 @@ SOCKS5ProxiedConnection::SOCKS5ProxiedConnection(
         ConnectionFactory* connectionFactory,
         TimerFactory* timerFactory,
         const std::string& proxyHost,
-        int proxyPort) :
+        unsigned short proxyPort) :
             ProxiedConnection(resolver, connectionFactory, timerFactory, proxyHost, proxyPort),
             proxyState_(Initial) {
             }
diff --git a/Swiften/Network/SOCKS5ProxiedConnection.h b/Swiften/Network/SOCKS5ProxiedConnection.h
index c8faae9..515c5b7 100644
--- a/Swiften/Network/SOCKS5ProxiedConnection.h
+++ b/Swiften/Network/SOCKS5ProxiedConnection.h
@@ -5,7 +5,7 @@
  */
 
 /*
- * Copyright (c) 2015-2016 Isode Limited.
+ * Copyright (c) 2015-2018 Isode Limited.
  * All rights reserved.
  * See the COPYING file for more information.
  */
@@ -24,12 +24,12 @@ namespace Swift {
         public:
             typedef std::shared_ptr<SOCKS5ProxiedConnection> ref;
 
-            static ref create(DomainNameResolver* resolver, ConnectionFactory* connectionFactory, TimerFactory* timerFactory, const std::string& proxyHost, int proxyPort) {
+            static ref create(DomainNameResolver* resolver, ConnectionFactory* connectionFactory, TimerFactory* timerFactory, const std::string& proxyHost, unsigned short proxyPort) {
                 return ref(new SOCKS5ProxiedConnection(resolver, connectionFactory, timerFactory, proxyHost, proxyPort));
             }
 
         private:
-            SOCKS5ProxiedConnection(DomainNameResolver* resolver, ConnectionFactory* connectionFactory, TimerFactory* timerFactory, const std::string& proxyHost, int proxyPort);
+            SOCKS5ProxiedConnection(DomainNameResolver* resolver, ConnectionFactory* connectionFactory, TimerFactory* timerFactory, const std::string& proxyHost, unsigned short proxyPort);
 
             virtual void initializeProxy();
             virtual void handleProxyInitializeData(std::shared_ptr<SafeByteArray> data);
diff --git a/Swiften/Network/SOCKS5ProxiedConnectionFactory.cpp b/Swiften/Network/SOCKS5ProxiedConnectionFactory.cpp
index 01ce8ac..abd7718 100644
--- a/Swiften/Network/SOCKS5ProxiedConnectionFactory.cpp
+++ b/Swiften/Network/SOCKS5ProxiedConnectionFactory.cpp
@@ -16,7 +16,7 @@
 
 namespace Swift {
 
-SOCKS5ProxiedConnectionFactory::SOCKS5ProxiedConnectionFactory(DomainNameResolver* resolver, ConnectionFactory* connectionFactory, TimerFactory* timerFactory, const std::string& proxyHost, int proxyPort) : resolver_(resolver), connectionFactory_(connectionFactory), timerFactory_(timerFactory), proxyHost_(proxyHost), proxyPort_(proxyPort) {
+SOCKS5ProxiedConnectionFactory::SOCKS5ProxiedConnectionFactory(DomainNameResolver* resolver, ConnectionFactory* connectionFactory, TimerFactory* timerFactory, const std::string& proxyHost, unsigned short proxyPort) : resolver_(resolver), connectionFactory_(connectionFactory), timerFactory_(timerFactory), proxyHost_(proxyHost), proxyPort_(proxyPort) {
 }
 
 std::shared_ptr<Connection> SOCKS5ProxiedConnectionFactory::createConnection() {
diff --git a/Swiften/Network/SOCKS5ProxiedConnectionFactory.h b/Swiften/Network/SOCKS5ProxiedConnectionFactory.h
index 8631239..47ae9a3 100644
--- a/Swiften/Network/SOCKS5ProxiedConnectionFactory.h
+++ b/Swiften/Network/SOCKS5ProxiedConnectionFactory.h
@@ -5,7 +5,7 @@
  */
 
 /*
- * Copyright (c) 2015-2016 Isode Limited.
+ * Copyright (c) 2015-2018 Isode Limited.
  * All rights reserved.
  * See the COPYING file for more information.
  */
@@ -23,7 +23,7 @@ namespace Swift {
 
     class SWIFTEN_API SOCKS5ProxiedConnectionFactory : public ConnectionFactory {
         public:
-            SOCKS5ProxiedConnectionFactory(DomainNameResolver* resolver, ConnectionFactory* connectionFactory, TimerFactory* timerFactory, const std::string& proxyHost, int proxyPort);
+            SOCKS5ProxiedConnectionFactory(DomainNameResolver* resolver, ConnectionFactory* connectionFactory, TimerFactory* timerFactory, const std::string& proxyHost, unsigned short proxyPort);
 
             virtual std::shared_ptr<Connection> createConnection();
 
@@ -32,6 +32,6 @@ namespace Swift {
             ConnectionFactory* connectionFactory_;
             TimerFactory* timerFactory_;
             std::string proxyHost_;
-            int proxyPort_;
+            unsigned short proxyPort_;
     };
 }
diff --git a/Swiften/Network/StaticDomainNameResolver.cpp b/Swiften/Network/StaticDomainNameResolver.cpp
index 5a38fc4..eca6687 100644
--- a/Swiften/Network/StaticDomainNameResolver.cpp
+++ b/Swiften/Network/StaticDomainNameResolver.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
  * All rights reserved.
  * See the COPYING file for more information.
  */
@@ -109,7 +109,7 @@ void StaticDomainNameResolver::addXMPPClientService(const std::string& domain, c
     addAddress(hostname, address.getAddress());
 }
 
-void StaticDomainNameResolver::addXMPPClientService(const std::string& domain, const std::string& hostname, int port) {
+void StaticDomainNameResolver::addXMPPClientService(const std::string& domain, const std::string& hostname, unsigned short port) {
     addService("_xmpp-client._tcp." + domain, ServiceQuery::Result(hostname, port, 0, 0));
 }
 
diff --git a/Swiften/Network/StaticDomainNameResolver.h b/Swiften/Network/StaticDomainNameResolver.h
index 76394d0..2064046 100644
--- a/Swiften/Network/StaticDomainNameResolver.h
+++ b/Swiften/Network/StaticDomainNameResolver.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
  * All rights reserved.
  * See the COPYING file for more information.
  */
@@ -31,7 +31,7 @@ namespace Swift {
             void addAddress(const std::string& domain, const HostAddress& address);
             void addService(const std::string& service, const DomainNameServiceQuery::Result& result);
             void addXMPPClientService(const std::string& domain, const HostAddressPort&);
-            void addXMPPClientService(const std::string& domain, const std::string& host, int port);
+            void addXMPPClientService(const std::string& domain, const std::string& host, unsigned short port);
 
             const AddressesMap& getAddresses() const {
                 return addresses;
diff --git a/Swiften/Network/UnitTest/ConnectorTest.cpp b/Swiften/Network/UnitTest/ConnectorTest.cpp
index 658aaf7..065911d 100644
--- a/Swiften/Network/UnitTest/ConnectorTest.cpp
+++ b/Swiften/Network/UnitTest/ConnectorTest.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
  * All rights reserved.
  * See the COPYING file for more information.
  */
@@ -92,7 +92,7 @@ class ConnectorTest : public CppUnit::TestFixture {
         }
 
         void testConnect_NoServiceLookups_DefaultPort() {
-            Connector::ref testling(createConnector(-1, boost::optional<std::string>()));
+            Connector::ref testling(createConnector(0, boost::optional<std::string>()));
             resolver->addXMPPClientService("foo.com", host1);
             resolver->addXMPPClientService("foo.com", host2);
             resolver->addAddress("foo.com", host3.getAddress());
@@ -103,7 +103,7 @@ class ConnectorTest : public CppUnit::TestFixture {
             CPPUNIT_ASSERT_EQUAL(1, static_cast<int>(connections.size()));
             CPPUNIT_ASSERT(connections[0]);
             CPPUNIT_ASSERT(host3.getAddress() == (*(connections[0]->hostAddressPort)).getAddress());
-            CPPUNIT_ASSERT_EQUAL(5222, (*(connections[0]->hostAddressPort)).getPort());
+            CPPUNIT_ASSERT_EQUAL(static_cast<unsigned short>(5222), (*(connections[0]->hostAddressPort)).getPort());
             CPPUNIT_ASSERT(!std::dynamic_pointer_cast<DomainNameResolveError>(error));
         }
 
@@ -328,7 +328,7 @@ class ConnectorTest : public CppUnit::TestFixture {
 
 
     private:
-        Connector::ref createConnector(int port = -1, boost::optional<std::string> serviceLookupPrefix = boost::optional<std::string>("_xmpp-client._tcp.")) {
+        Connector::ref createConnector(unsigned short port = 0, boost::optional<std::string> serviceLookupPrefix = boost::optional<std::string>("_xmpp-client._tcp.")) {
             Connector::ref connector = Connector::create("foo.com", port, serviceLookupPrefix, resolver, connectionFactory, timerFactory);
             connector->onConnectFinished.connect(boost::bind(&ConnectorTest::handleConnectorFinished, this, _1, _2));
             return connector;
diff --git a/Swiften/Network/UnitTest/HTTPConnectProxiedConnectionTest.cpp b/Swiften/Network/UnitTest/HTTPConnectProxiedConnectionTest.cpp
index 1a160b7..065d015 100644
--- a/Swiften/Network/UnitTest/HTTPConnectProxiedConnectionTest.cpp
+++ b/Swiften/Network/UnitTest/HTTPConnectProxiedConnectionTest.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
  * All rights reserved.
  * See the COPYING file for more information.
  */
@@ -421,7 +421,7 @@ class HTTPConnectProxiedConnectionTest : public CppUnit::TestFixture {
     private:
         std::string proxyHost;
         HostAddressPort proxyHostAddress;
-        int proxyPort;
+        unsigned short proxyPort;
         HostAddressPort host;
         DummyEventLoop* eventLoop;
         StaticDomainNameResolver* resolver;
diff --git a/Swiften/Network/WindowsProxyProvider.cpp b/Swiften/Network/WindowsProxyProvider.cpp
index 78bd72f..9a60bb4 100644
--- a/Swiften/Network/WindowsProxyProvider.cpp
+++ b/Swiften/Network/WindowsProxyProvider.cpp
@@ -17,6 +17,7 @@
 #include <stdlib.h>
 
 #include <boost/lexical_cast.hpp>
+#include <boost/numeric/conversion/cast.hpp>
 
 #include <windows.h>
 
@@ -77,11 +78,11 @@ HostAddressPort WindowsProxyProvider::getAsHostAddressPort(std::string proxy) {
 
     try {
         std::pair<std::string, std::string> tmp;
-        int port = 0;
+        unsigned short port = 0;
         tmp = String::getSplittedAtFirst(proxy, ':');
         // .c_str() is needed as tmp.second can include a \0 char which will end in an exception of the lexical cast.
         // with .c_str() the \0 will not be part of the string which is to be casted
-        port = boost::lexical_cast<int> (tmp.second.c_str());
+        port = boost::numeric_cast<unsigned short>(boost::lexical_cast<int> (tmp.second.c_str()));
         ret = HostAddressPort(HostAddress::fromString(tmp.first).get(), port);
     }
     catch(...) {
diff --git a/Swiften/Parser/PayloadParsers/BytestreamsParser.cpp b/Swiften/Parser/PayloadParsers/BytestreamsParser.cpp
index 405c593..71bce54 100644
--- a/Swiften/Parser/PayloadParsers/BytestreamsParser.cpp
+++ b/Swiften/Parser/PayloadParsers/BytestreamsParser.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
  * All rights reserved.
  * See the COPYING file for more information.
  */
@@ -7,6 +7,7 @@
 #include <Swiften/Parser/PayloadParsers/BytestreamsParser.h>
 
 #include <boost/lexical_cast.hpp>
+#include <boost/numeric/conversion/cast.hpp>
 
 namespace Swift {
 
@@ -23,7 +24,9 @@ void BytestreamsParser::handleStartElement(const std::string& element, const std
     else if (level == PayloadLevel) {
         if (element == "streamhost") {
             try {
-                getPayloadInternal()->addStreamHost(Bytestreams::StreamHost(attributes.getAttribute("host"), JID(attributes.getAttribute("jid")), boost::lexical_cast<int>(attributes.getAttribute("port"))));
+                getPayloadInternal()->addStreamHost(Bytestreams::StreamHost(attributes.getAttribute("host"), JID(attributes.getAttribute("jid")), boost::numeric_cast<unsigned short>(boost::lexical_cast<int>(attributes.getAttribute("port")))));
+            }
+            catch (boost::numeric::bad_numeric_cast&) {
             }
             catch (boost::bad_lexical_cast&) {
             }
diff --git a/Swiften/Parser/PayloadParsers/JingleS5BTransportMethodPayloadParser.cpp b/Swiften/Parser/PayloadParsers/JingleS5BTransportMethodPayloadParser.cpp
index e639e20..a405e0e 100644
--- a/Swiften/Parser/PayloadParsers/JingleS5BTransportMethodPayloadParser.cpp
+++ b/Swiften/Parser/PayloadParsers/JingleS5BTransportMethodPayloadParser.cpp
@@ -5,7 +5,7 @@
  */
 
 /*
- * Copyright (c) 2014-2016 Isode Limited.
+ * Copyright (c) 2014-2018 Isode Limited.
  * All rights reserved.
  * See the COPYING file for more information.
  */
@@ -13,6 +13,7 @@
 #include <Swiften/Parser/PayloadParsers/JingleS5BTransportMethodPayloadParser.h>
 
 #include <boost/lexical_cast.hpp>
+#include <boost/numeric/conversion/cast.hpp>
 #include <boost/optional.hpp>
 
 #include <Swiften/Base/Log.h>
@@ -40,10 +41,10 @@ namespace Swift {
                 JingleS5BTransportPayload::Candidate candidate;
                 candidate.cid = attributes.getAttributeValue("cid").get_value_or("");
 
-                int port = -1;
+                unsigned short port = 0;
                 try {
-                    port = boost::lexical_cast<int>(attributes.getAttributeValue("port").get_value_or("-1"));
-                } catch(boost::bad_lexical_cast &) { }
+                    port = boost::numeric_cast<unsigned short>(boost::lexical_cast<int>(attributes.getAttributeValue("port").get_value_or("0")));
+                } catch(...) { }
                 candidate.hostPort = HostAddressPort(HostAddress::fromString(attributes.getAttributeValue("host").get_value_or("")).get_value_or(HostAddress()), port);
                 candidate.jid = JID(attributes.getAttributeValue("jid").get_value_or(""));
                 int priority = -1;
diff --git a/Swiften/Parser/PayloadParsers/S5BProxyRequestParser.cpp b/Swiften/Parser/PayloadParsers/S5BProxyRequestParser.cpp
index 502f400..7a5a1fd 100644
--- a/Swiften/Parser/PayloadParsers/S5BProxyRequestParser.cpp
+++ b/Swiften/Parser/PayloadParsers/S5BProxyRequestParser.cpp
@@ -5,7 +5,7 @@
  */
 
 /*
- * Copyright (c) 2015-2016 Isode Limited.
+ * Copyright (c) 2015-2018 Isode Limited.
  * All rights reserved.
  * See the COPYING file for more information.
  */
@@ -13,6 +13,7 @@
 #include <Swiften/Parser/PayloadParsers/S5BProxyRequestParser.h>
 
 #include <boost/lexical_cast.hpp>
+#include <boost/numeric/conversion/cast.hpp>
 #include <boost/optional.hpp>
 
 namespace Swift {
@@ -27,15 +28,14 @@ void S5BProxyRequestParser::handleStartElement(const std::string& element, const
     if (element == "streamhost") {
         if (attributes.getAttributeValue("host") && attributes.getAttributeValue("jid") && attributes.getAttributeValue("port")) {
             std::string host = attributes.getAttributeValue("host").get_value_or("");
-            int port = -1;
+            unsigned short port = 0;
             JID jid = attributes.getAttributeValue("jid").get_value_or("");
 
             try {
-                port = boost::lexical_cast<int>(attributes.getAttributeValue("port").get());
-            } catch (boost::bad_lexical_cast &) {
-                port = -1;
+                port = boost::numeric_cast<unsigned short>(boost::lexical_cast<int>(attributes.getAttributeValue("port").get()));
+            } catch (...) {
             }
-            if (!host.empty() && port != -1 && jid.isValid()) {
+            if (!host.empty() && port != 0 && jid.isValid()) {
                 S5BProxyRequest::StreamHost streamHost;
                 streamHost.host = host;
                 streamHost.port = port;
diff --git a/Swiften/QA/ClientTest/ClientTest.cpp b/Swiften/QA/ClientTest/ClientTest.cpp
index 5cb1765..c5117fa 100644
--- a/Swiften/QA/ClientTest/ClientTest.cpp
+++ b/Swiften/QA/ClientTest/ClientTest.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
  * All rights reserved.
  * See the COPYING file for more information.
  */
@@ -8,6 +8,7 @@
 #include <thread>
 
 #include <boost/bind.hpp>
+#include <boost/numeric/conversion/cast.hpp>
 
 #include <Swiften/Client/Client.h>
 #include <Swiften/Client/ClientXMLTracer.h>
@@ -74,7 +75,17 @@ int main(int, char**) {
 
     if (boshHost && boshPort && boshPath) {
         std::cout << "Using BOSH with URL: http://" << boshHost << ":" << boshPort << boshPath << std::endl;
-        options.boshURL = URL("http", boshHost, atoi(boshPort), boshPath);
+        try {
+            options.boshURL = URL("http", boshHost, boost::numeric_cast<unsigned short>(boost::lexical_cast<int>(boshPort)), boshPath);
+        }
+        catch (const boost::numeric::bad_numeric_cast& e) {
+            std::cerr << "SWIFT_CLIENTTEST_BOSH_PORT doesn't hold a valid port number: " << e.what() << std::endl;
+            return -1;
+        }
+        catch (const boost::bad_lexical_cast& e) {
+            std::cerr << "SWIFT_CLIENTTEST_BOSH_PORT doesn't hold a valid port number: " << e.what() << std::endl;
+            return -1;
+        }
     }
 
     client = new Swift::Client(JID(jid), std::string(pass), &networkFactories);
diff --git a/Swiften/QA/NetworkTest/DomainNameResolverTest.cpp b/Swiften/QA/NetworkTest/DomainNameResolverTest.cpp
index 95ebb6d..69e6fe8 100644
--- a/Swiften/QA/NetworkTest/DomainNameResolverTest.cpp
+++ b/Swiften/QA/NetworkTest/DomainNameResolverTest.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2018 Isode Limited.
  * All rights reserved.
  * See the COPYING file for more information.
  */
@@ -179,19 +179,19 @@ class DomainNameResolverTest : public CppUnit::TestFixture {
 
             CPPUNIT_ASSERT_EQUAL(4, static_cast<int>(serviceQueryResult.size()));
             CPPUNIT_ASSERT_EQUAL(std::string("xmpp1.test.swift.im"), serviceQueryResult[0].hostname);
-            CPPUNIT_ASSERT_EQUAL(5000, serviceQueryResult[0].port);
+            CPPUNIT_ASSERT_EQUAL(static_cast<unsigned short>(5000), serviceQueryResult[0].port);
             CPPUNIT_ASSERT_EQUAL(0, serviceQueryResult[0].priority);
             CPPUNIT_ASSERT_EQUAL(1, serviceQueryResult[0].weight);
             CPPUNIT_ASSERT_EQUAL(std::string("xmpp-invalid.test.swift.im"), serviceQueryResult[1].hostname);
-            CPPUNIT_ASSERT_EQUAL(5000, serviceQueryResult[1].port);
+            CPPUNIT_ASSERT_EQUAL(static_cast<unsigned short>(5000), serviceQueryResult[1].port);
             CPPUNIT_ASSERT_EQUAL(1, serviceQueryResult[1].priority);
             CPPUNIT_ASSERT_EQUAL(100, serviceQueryResult[1].weight);
             CPPUNIT_ASSERT_EQUAL(std::string("xmpp3.test.swift.im"), serviceQueryResult[2].hostname);
-            CPPUNIT_ASSERT_EQUAL(5000, serviceQueryResult[2].port);
+            CPPUNIT_ASSERT_EQUAL(static_cast<unsigned short>(5000), serviceQueryResult[2].port);
             CPPUNIT_ASSERT_EQUAL(3, serviceQueryResult[2].priority);
             CPPUNIT_ASSERT_EQUAL(100, serviceQueryResult[2].weight);
             CPPUNIT_ASSERT_EQUAL(std::string("xmpp2.test.swift.im"), serviceQueryResult[3].hostname);
-            CPPUNIT_ASSERT_EQUAL(5000, serviceQueryResult[3].port);
+            CPPUNIT_ASSERT_EQUAL(static_cast<unsigned short>(5000), serviceQueryResult[3].port);
             CPPUNIT_ASSERT_EQUAL(5, serviceQueryResult[3].priority);
             CPPUNIT_ASSERT_EQUAL(100, serviceQueryResult[3].weight);
         }
-- 
cgit v0.10.2-6-g49f6