diff --git a/ext/include/opentelemetry/ext/http/server/http_server.h b/ext/include/opentelemetry/ext/http/server/http_server.h
index b0f8299047..d714792523 100644
--- a/ext/include/opentelemetry/ext/http/server/http_server.h
+++ b/ext/include/opentelemetry/ext/http/server/http_server.h
@@ -199,13 +199,20 @@ class HttpServer : private SocketTools::Reactor::SocketCallback
void setServerName(std::string const &name) { m_serverHost = name; }
- int addListeningPort(int port)
+ int addListeningPort(uint16_t port)
{
+
+
+ SocketTools::SocketAddr addr(0, port);
+ if (addr.port() == -1)
+ {
+ return -1;
+ }
+
SocketTools::Socket socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
socket.setNonBlocking();
socket.setReuseAddr();
- SocketTools::SocketAddr addr(0, port);
socket.bind(addr);
socket.getsockname(addr);
diff --git a/ext/include/opentelemetry/ext/http/server/socket_tools.h b/ext/include/opentelemetry/ext/http/server/socket_tools.h
index 3a5baf99eb..440fb41825 100644
--- a/ext/include/opentelemetry/ext/http/server/socket_tools.h
+++ b/ext/include/opentelemetry/ext/http/server/socket_tools.h
@@ -174,8 +174,9 @@ struct SocketAddr
/// SocketAddr
SocketAddr() {}
- SocketAddr(u_long addr, int port)
+ SocketAddr(u_long addr, u_int16_t port)
{
+
sockaddr_in &inet4 = reinterpret_cast(m_data);
inet4.sin_family = AF_INET;
inet4.sin_port = htons(static_cast(port));
diff --git a/ext/test/http/socket_tools_test.cc b/ext/test/http/socket_tools_test.cc
index 34f9dac51b..87ff73a76f 100644
--- a/ext/test/http/socket_tools_test.cc
+++ b/ext/test/http/socket_tools_test.cc
@@ -71,6 +71,13 @@ TEST(SocketAddrTest, AcceptsLeadingZeroPort)
EXPECT_EQ(addr.port(), 80);
}
+TEST(SocketAddrTest, RejectsOutOfRangeIntegerPorts)
+{
+ ExpectInvalid(SocketTools::SocketAddr(0, -1));
+ ExpectInvalid(SocketTools::SocketAddr(0, 65536));
+ ExpectInvalid(SocketTools::SocketAddr(0, 99999));
+}
+
TEST(SocketAddrTest, RejectsOutOfRangePort)
{
SocketTools::SocketAddr addr("127.0.0.1:99999");