summaryrefslogtreecommitdiff
path: root/ares_getnameinfo.c
diff options
context:
space:
mode:
authorYang Tse <yangsita@gmail.com>2010-11-16 19:41:03 +0100
committerYang Tse <yangsita@gmail.com>2010-11-16 19:41:03 +0100
commit85520d66e0ac7ac73411bc25e98769a88b2f85cc (patch)
treebfce67c63e3ed46396e212ba10be187b38dcc335 /ares_getnameinfo.c
parent690f9a726c20b1d0b4b4132b3d4110658f65e776 (diff)
downloadc-ares-85520d66e0ac7ac73411bc25e98769a88b2f85cc.tar.gz
c-ares-85520d66e0ac7ac73411bc25e98769a88b2f85cc.tar.bz2
c-ares-85520d66e0ac7ac73411bc25e98769a88b2f85cc.zip
ares_getnameinfo: Validate socket address family and length.
Validate socket address family and that the socket address length is appropriate for the specified family. Failure is reported with ARES_EBADFAMILY in callback.
Diffstat (limited to 'ares_getnameinfo.c')
-rw-r--r--ares_getnameinfo.c10
1 files changed, 6 insertions, 4 deletions
diff --git a/ares_getnameinfo.c b/ares_getnameinfo.c
index fc95d3b..e5b5d9f 100644
--- a/ares_getnameinfo.c
+++ b/ares_getnameinfo.c
@@ -99,20 +99,22 @@ void ares_getnameinfo(ares_channel channel, const struct sockaddr *sa,
struct nameinfo_query *niquery;
unsigned int port = 0;
- /* Verify the buffer size */
- if (salen == sizeof(struct sockaddr_in))
+ /* Validate socket address family and length */
+ if ((sa->sa_family == AF_INET) &&
+ (salen == sizeof(struct sockaddr_in)))
{
addr = (struct sockaddr_in *)sa;
port = addr->sin_port;
}
- else if (salen == sizeof(struct sockaddr_in6))
+ else if ((sa->sa_family == AF_INET6) &&
+ (salen == sizeof(struct sockaddr_in6)))
{
addr6 = (struct sockaddr_in6 *)sa;
port = addr6->sin6_port;
}
else
{
- callback(arg, ARES_ENOTIMP, 0, NULL, NULL);
+ callback(arg, ARES_EBADFAMILY, 0, NULL, NULL);
return;
}