]> source.dussan.org Git - rspamd.git/commitdiff
[Fix] Do not try to connect to non-supported addresses
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Sat, 25 Nov 2017 12:50:02 +0000 (12:50 +0000)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Sat, 25 Nov 2017 12:50:02 +0000 (12:50 +0000)
contrib/hiredis/net.c
lualib/lua_redis.lua
src/libserver/fuzzy_backend_redis.c

index e4aa920ad0fa9ef4bf33687f5e2557050a67ab93..6aada0a6f95ec4efb458f03d56efbb5f033e1dd1 100644 (file)
@@ -310,6 +310,10 @@ static int _redisContextConnectTcp(redisContext *c, const char *addr, int port,
     memset(&hints,0,sizeof(hints));
     hints.ai_family = AF_INET;
     hints.ai_socktype = SOCK_STREAM;
+    if (!blocking) {
+        /* Rspamd specific: never try to resolve on non-blocking conn requests */
+        hints.ai_flags = AI_NUMERICHOST | AI_NUMERICSERV;
+    }
 
     /* Try with IPv6 if no IPv4 address was found. We do it in this order since
      * in a Redis client you can't afford to test if you have IPv6 connectivity
index 7ecb3d424f4178fd44b3b1524e704babb2c2b7fa..eda8dc37f5126777a4234f0f05e1f7cf906dd11d 100644 (file)
@@ -479,10 +479,11 @@ local function rspamd_redis_make_request(task, redis_params, key, is_write, call
     end
   end
 
+  local ip_addr = addr:get_addr()
   local options = {
     task = task,
     callback = rspamd_redis_make_request_cb,
-    host = addr:get_addr(),
+    host = ip_addr,
     timeout = redis_params['timeout'],
     cmd = command,
     args = args
@@ -497,6 +498,12 @@ local function rspamd_redis_make_request(task, redis_params, key, is_write, call
   end
 
   local ret,conn = rspamd_redis.make_request(options)
+
+  if not ret then
+    addr:fail()
+    logger.warnx(task, "cannot make redis request to: %s", tostring(ip_addr))
+  end
+
   return ret,conn,addr
 end
 
@@ -550,6 +557,7 @@ local function redis_make_request_taskless(ev_base, cfg, redis_params, key, is_w
   local ret,conn = rspamd_redis.make_request(options)
   if not ret then
     logger.errx('cannot execute redis request')
+    addr:fail()
   end
   return ret,conn,addr
 end
index a660a852387f7f1e421b68c205324d6fa4e44c83..a44f116a87fe57e24c351ba5cdb07e4eab34a257 100644 (file)
@@ -649,6 +649,7 @@ rspamd_fuzzy_backend_check_redis (struct rspamd_fuzzy_backend *bk,
                        rspamd_inet_address_get_port (addr));
 
        if (session->ctx == NULL) {
+               rspamd_upstream_fail (up);
                rspamd_fuzzy_redis_session_dtor (session, TRUE);
 
                if (cb) {
@@ -772,6 +773,7 @@ rspamd_fuzzy_backend_count_redis (struct rspamd_fuzzy_backend *bk,
                        rspamd_inet_address_get_port (addr));
 
        if (session->ctx == NULL) {
+               rspamd_upstream_fail (up);
                rspamd_fuzzy_redis_session_dtor (session, TRUE);
 
                if (cb) {
@@ -894,6 +896,7 @@ rspamd_fuzzy_backend_version_redis (struct rspamd_fuzzy_backend *bk,
                        rspamd_inet_address_get_port (addr));
 
        if (session->ctx == NULL) {
+               rspamd_upstream_fail (up);
                rspamd_fuzzy_redis_session_dtor (session, TRUE);
 
                if (cb) {
@@ -1326,6 +1329,7 @@ rspamd_fuzzy_backend_update_redis (struct rspamd_fuzzy_backend *bk,
                        rspamd_inet_address_get_port (addr));
 
        if (session->ctx == NULL) {
+               rspamd_upstream_fail (up);
                rspamd_fuzzy_redis_session_dtor (session, TRUE);
 
                if (cb) {