Lose more string-copy operations
[exim.git] / src / src / lookups / redis.c
index e8989ca3a1580733c786d0a64b0650e1d6945c1a..a4b672a5e58101041d8edb030afc68b912eeb234 100644 (file)
@@ -2,7 +2,7 @@
 *     Exim - an Internet mail transport agent    *
 *************************************************/
 
-/* Copyright (c) University of Cambridge 1995 - 2015 */
+/* Copyright (c) University of Cambridge 1995 - 2018 */
 /* See the file NOTICE for conditions of use and distribution. */
 
 #include "../exim.h"
@@ -241,7 +241,20 @@ switch (redis_reply->type)
   {
   case REDIS_REPLY_ERROR:
     *errmsg = string_sprintf("REDIS: lookup result failed: %s\n", redis_reply->str);
-    *defer_break = FALSE;
+
+    /* trap MOVED cluster responses and follow them */
+    if (Ustrncmp(redis_reply->str, "MOVED", 5) == 0)
+      {
+      DEBUG(D_lookup)
+        debug_printf("REDIS: cluster redirect %s\n", redis_reply->str);
+      /* follow redirect
+      This is cheating, we simply set defer_break = FALSE to move on to
+      the next server in the redis_servers list */
+      *defer_break = FALSE;
+      return DEFER;
+      } else {
+      *defer_break = TRUE;
+      }
     *do_cache = 0;
     goto REDIS_EXIT;
     /* NOTREACHED */
@@ -278,7 +291,7 @@ switch (redis_reply->type)
       switch (entry->type)
        {
        case REDIS_REPLY_INTEGER:
-         result = string_cat(result, string_sprintf("%d", entry->integer));
+         result = string_fmt_append(result, "%d", entry->integer);
          break;
        case REDIS_REPLY_STRING:
          result = string_catn(result, US entry->str, entry->len);
@@ -294,7 +307,7 @@ switch (redis_reply->type)
            switch (tentry->type)
              {
              case REDIS_REPLY_INTEGER:
-               result = string_cat(result, string_sprintf("%d", tentry->integer));
+               result = string_fmt_append(result, "%d", tentry->integer);
                break;
              case REDIS_REPLY_STRING:
                result = string_catn(result, US tentry->str, tentry->len);