Skip to content

Commit ce1bb56

Browse files
committed
Throwing on invalid ip address
1 parent fc37c08 commit ce1bb56

File tree

2 files changed

+54
-26
lines changed

2 files changed

+54
-26
lines changed

src/http_utils.cpp

Lines changed: 26 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -243,41 +243,41 @@ std::string get_ip_str(
243243
socklen_t maxlen
244244
)
245245
{
246-
std::string result;
246+
if (!sa) throw new std::invalid_argument("socket pointer is null");
247247

248-
if(sa)
248+
char to_ret[NI_MAXHOST];
249+
if (AF_INET6 == sa->sa_family)
249250
{
250-
char to_ret[NI_MAXHOST];
251-
if (AF_INET6 == sa->sa_family)
252-
{
253-
inet_ntop(AF_INET6, &(((sockaddr_in6*) sa)->sin6_addr), to_ret, INET6_ADDRSTRLEN);
254-
result = to_ret;
255-
}
256-
else
257-
{
258-
inet_ntop(AF_INET, &(((sockaddr_in*) sa)->sin_addr), to_ret, INET_ADDRSTRLEN);
259-
result = to_ret;
260-
}
251+
inet_ntop(AF_INET6, &(((sockaddr_in6*) sa)->sin6_addr), to_ret, INET6_ADDRSTRLEN);
252+
return to_ret;
253+
}
254+
else if (AF_INET == sa->sa_family)
255+
{
256+
inet_ntop(AF_INET, &(((sockaddr_in*) sa)->sin_addr), to_ret, INET_ADDRSTRLEN);
257+
return to_ret;
258+
}
259+
else
260+
{
261+
throw new std::invalid_argument("IP family must be either AF_INET or AF_INET6");
261262
}
262-
263-
return result;
264263
}
265264

266265
unsigned short get_port(const struct sockaddr* sa)
267266
{
268-
if(sa)
267+
if (!sa) throw new std::invalid_argument("socket pointer is null");
268+
269+
if (sa->sa_family == AF_INET)
269270
{
270-
switch(sa->sa_family)
271-
{
272-
case AF_INET:
273-
return ((struct sockaddr_in*) sa)->sin_port;
274-
case AF_INET6:
275-
return ((struct sockaddr_in6*) sa)->sin6_port;
276-
default:
277-
return 0;
278-
}
271+
return ((struct sockaddr_in*) sa)->sin_port;
272+
}
273+
else if (sa->sa_family == AF_INET6)
274+
{
275+
return ((struct sockaddr_in6*) sa)->sin6_port;
276+
}
277+
else
278+
{
279+
throw new std::invalid_argument("IP family must be either AF_INET or AF_INET6");
279280
}
280-
return 0;
281281
}
282282

283283
size_t http_unescape(char *val)

test/unit/http_utils_test.cpp

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,34 @@ LT_BEGIN_AUTO_TEST(http_utils_suite, ip_to_str6)
108108
LT_CHECK_EQ(port, htons(3490));
109109
LT_END_AUTO_TEST(ip_to_str6)
110110

111+
LT_BEGIN_AUTO_TEST(http_utils_suite, ip_to_str_invalid_family)
112+
struct sockaddr_in ip4addr;
113+
114+
ip4addr.sin_family = 55;
115+
ip4addr.sin_port = htons(3490);
116+
ip4addr.sin_addr.s_addr = inet_addr("127.0.0.1");
117+
118+
LT_CHECK_THROW(http::get_ip_str((struct sockaddr*) &ip4addr));
119+
LT_END_AUTO_TEST(ip_to_str_invalid_family)
120+
121+
LT_BEGIN_AUTO_TEST(http_utils_suite, ip_to_str_null)
122+
LT_CHECK_THROW(http::get_ip_str((struct sockaddr*) 0x0));
123+
LT_END_AUTO_TEST(ip_to_str_null)
124+
125+
LT_BEGIN_AUTO_TEST(http_utils_suite, get_port_invalid_family)
126+
struct sockaddr_in ip4addr;
127+
128+
ip4addr.sin_family = 55;
129+
ip4addr.sin_port = htons(3490);
130+
ip4addr.sin_addr.s_addr = inet_addr("127.0.0.1");
131+
132+
LT_CHECK_THROW(http::get_port((struct sockaddr*) &ip4addr));
133+
LT_END_AUTO_TEST(get_port_invalid_family)
134+
135+
LT_BEGIN_AUTO_TEST(http_utils_suite, get_port_null)
136+
LT_CHECK_THROW(http::get_port((struct sockaddr*) 0x0));
137+
LT_END_AUTO_TEST(get_port_null)
138+
111139
LT_BEGIN_AUTO_TEST_ENV()
112140
AUTORUN_TESTS()
113141
LT_END_AUTO_TEST_ENV()

0 commit comments

Comments
 (0)