mod_s2s: Log certificate identity validation result
[prosody.git] / net / dns.lua
index 7bf5653b99f20c339f4370d1366ad91021a89489..cdd949a22309fe2be2be70f64eee6e9ae3dc8622 100644 (file)
@@ -223,7 +223,7 @@ end
 
 
 function dns.random(...)    -- - - - - - - - - - - - - - - - - - -  dns.random
-       math.randomseed(math.floor(10000*socket.gettime()));
+       math.randomseed(math.floor(10000*socket.gettime()) % 0x100000000);
        dns.random = math.random;
        return dns.random(...);
 end
@@ -358,6 +358,7 @@ function resolver:name()    -- - - - - - - - - - - - - - - - - - - - - -  name
        local remember, pointers = nil, 0;
        local len = self:byte();
        local n = {};
+       if len == 0 then return "." end -- Root label
        while len > 0 do
                if len >= 0xc0 then    -- name is "compressed"
                        pointers = pointers + 1;
@@ -548,6 +549,7 @@ function resolver:decode(packet, force)    -- - - - - - - - - - - - - - decode
 
        if not force then
                if not self.active[response.header.id] or not self.active[response.header.id][response.question.raw] then
+                       self.active[response.header.id] = nil;
                        return nil;
                end
        end
@@ -620,10 +622,10 @@ function resolver:getsocket(servernum)    -- - - - - - - - - - - - - getsocket
 
        local err;
        sock, err = socket.udp();
+       if sock and self.socket_wrapper then sock, err = self.socket_wrapper(sock, self); end
        if not sock then
                return nil, err;
        end
-       if self.socket_wrapper then sock = self.socket_wrapper(sock, self); end
        sock:settimeout(0);
        -- todo: attempt to use a random port, fallback to 0
        sock:setsockname('*', 0);
@@ -641,6 +643,7 @@ function resolver:voidsocket(sock)
                self.socket[self.socketset[sock]] = nil;
                self.socketset[sock] = nil;
        end
+       sock:close();
 end
 
 function resolver:socket_wrapper_set(func)  -- - - - - - - socket_wrapper_set
@@ -705,7 +708,7 @@ function resolver:purge(soft)    -- - - - - - - - - - - - - - - - - - -  purge
                                end
                        end
                end
-       else self.cache = {}; end
+       else self.cache = setmetatable({}, cache_metatable); end
 end
 
 
@@ -795,6 +798,9 @@ function resolver:servfail(sock)
                                end
                        end
                end
+               if next(queries) == nil then
+                       self.active[id] = nil;
+               end
        end
 
        if num == self.best_server then
@@ -851,6 +857,7 @@ function resolver:receive(rset)    -- - - - - - - - - - - - - - - - -  receive
                                                set(self.wanted, q.class, q.type, q.name, nil);
                                        end
                                end
+                               
                        end
                end
        end
@@ -1065,6 +1072,10 @@ function dns.settimeout(...)
        return _resolver:settimeout(...);
 end
 
+function dns.cache()
+       return _resolver.cache;
+end
+
 function dns.socket_wrapper_set(...)    -- - - - - - - - -  socket_wrapper_set
        return _resolver:socket_wrapper_set(...);
 end