From 8f671041a52dd28fa473762b637b03c402f0db04 Mon Sep 17 00:00:00 2001 From: Ryan Dahl Date: Wed, 7 Apr 2010 16:04:33 -0700 Subject: [PATCH] Check for ip address in dns_cares.lookup --- lib/dns_cares.js | 37 ++++++++++++++++++++++++------------- src/node_cares.cc | 29 +++++++++++++++++++++++++++++ test/simple/test-c-ares.js | 20 +++++++++++++++----- 3 files changed, 68 insertions(+), 18 deletions(-) diff --git a/lib/dns_cares.js b/lib/dns_cares.js index fbb10d3..11caa3a 100644 --- a/lib/dns_cares.js +++ b/lib/dns_cares.js @@ -95,19 +95,30 @@ exports.getHostByName = function (domain, callback) { // Easy DNS A/AAAA look up exports.lookup = function (domain, callback) { - channel.getHostByName(domain, dns.AF_INET, function (err, domains4) { - if (domains4 && domains4.length) { - callback(null, domains4[0], 4); - } else { - channel.getHostByName(domain, dns.AF_INET6, function (err, domains6) { - if (domains6 && domains6.length) { - callback(null, domains6[0], 6); - } else { - callback(err, []); - } - }); - } - }); + var addressType = dns.isIP(domain); + if (addressType) { + process.nextTick(function () { + callback(null, domain, addressType); + }); + } else { + sys.puts('AF_INET look up ' + domain); + channel.getHostByName(domain, dns.AF_INET, function (err, domains4) { + sys.puts('AF_INET result ' + domain + ' ' + sys.inspect(domains4)); + if (domains4 && domains4.length) { + callback(null, domains4[0], 4); + } else { + sys.puts('AF_INET6 look up ' + domain); + channel.getHostByName(domain, dns.AF_INET6, function (err, domains6) { + sys.puts('AF_INET6 result ' + domain + ' ' + sys.inspect(domains6)); + if (domains6 && domains6.length) { + callback(null, domains6[0], 6); + } else { + callback(err, []); + } + }); + } + }); + } }; diff --git a/src/node_cares.cc b/src/node_cares.cc index cba6220..82d2a64 100644 --- a/src/node_cares.cc +++ b/src/node_cares.cc @@ -13,6 +13,31 @@ namespace node { using namespace v8; +static Handle IsIP(const Arguments& args) { + HandleScope scope; + + if (!args[0]->IsString()) { + return scope.Close(Integer::New(4)); + } + + String::Utf8Value s(args[0]->ToString()); + + // avoiding buffer overflows in the following strcat + // 2001:0db8:85a3:08d3:1319:8a2e:0370:7334 + // 39 = max ipv6 address. + if (s.length() > INET6_ADDRSTRLEN) { + return scope.Close(Integer::New(0)); + } + + struct sockaddr_in6 a; + + if (inet_pton(AF_INET, *s, &(a.sin6_addr)) > 0) return scope.Close(Integer::New(4)); + if (inet_pton(AF_INET6, *s, &(a.sin6_addr)) > 0) return scope.Close(Integer::New(6)); + + return scope.Close(Integer::New(0)); +} + + class Channel : public ObjectWrap { public: static void Initialize(Handle target); @@ -104,6 +129,8 @@ void Cares::Initialize(Handle target) { target->Set(String::NewSymbol("EREFUSED"), Integer::New(ARES_EREFUSED)); target->Set(String::NewSymbol("SERVFAIL"), Integer::New(ARES_ESERVFAIL)); + NODE_SET_METHOD(target, "isIP", IsIP); + Channel::Initialize(target); } @@ -657,4 +684,6 @@ void Channel::SockStateCb(void *data, int sock, int read, int write) { } + + } // namespace node diff --git a/test/simple/test-c-ares.js b/test/simple/test-c-ares.js index 683babc..e24225e 100644 --- a/test/simple/test-c-ares.js +++ b/test/simple/test-c-ares.js @@ -15,14 +15,24 @@ dns.getHostByName('127.0.0.1', function (error, result) { assert.deepEqual(['127.0.0.1'], result); }); -dns.lookup('127.0.0.1', function (error, result, ipVersion) { - assert.deepEqual('127.0.0.1', result); - assert.equal(4, ipVersion); +dns.lookup(null, function (error, result, addressType) { + assert.equal(null, result); + assert.equal(4, addressType); }); -dns.lookup('ipv6.google.com', function (error, result, ipVersion) { +dns.lookup('127.0.0.1', function (error, result, addressType) { + assert.equal('127.0.0.1', result); + assert.equal(4, addressType); +}); + +dns.lookup('::1', function (error, result, addressType) { + assert.equal('::1', result); + assert.equal(6, addressType); +}); + +dns.lookup('ipv6.google.com', function (error, result, addressType) { if (error) throw error; p(arguments); //assert.equal('string', typeof result); - assert.equal(6, ipVersion); + assert.equal(6, addressType); }); -- 2.7.4