diff options
author | Yang Tse <yangsita@gmail.com> | 2010-11-16 19:41:03 +0100 |
---|---|---|
committer | Yang Tse <yangsita@gmail.com> | 2010-11-16 19:41:03 +0100 |
commit | 85520d66e0ac7ac73411bc25e98769a88b2f85cc (patch) | |
tree | bfce67c63e3ed46396e212ba10be187b38dcc335 | |
parent | 690f9a726c20b1d0b4b4132b3d4110658f65e776 (diff) | |
download | c-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.
-rw-r--r-- | ares_getnameinfo.c | 10 |
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; } |