]> source.dussan.org Git - rspamd.git/commitdiff
[Fix] Fix crash with cname replies
authorVsevolod Stakhov <vsevolod@rspamd.com>
Sun, 25 Sep 2022 12:02:22 +0000 (13:02 +0100)
committerVsevolod Stakhov <vsevolod@rspamd.com>
Sun, 25 Sep 2022 12:02:22 +0000 (13:02 +0100)
src/lua/lua_http.c

index a53145c7c9db81c46867bf41f2ae004b9b18c114..4e8d98abb52a55e43a38b21e04f52211edcdfb9f 100644 (file)
@@ -20,6 +20,7 @@
 #include "ref.h"
 #include "unix-std.h"
 #include "zlib.h"
+#include "utlist.h"
 
 /***
  * @module rspamd_http
@@ -511,28 +512,40 @@ lua_http_dns_handler (struct rdns_reply *reply, gpointer ud)
                REF_RELEASE (cbd);
        }
        else {
-               if (reply->entries->type == RDNS_REQUEST_A) {
-                       cbd->addr = rspamd_inet_address_new (AF_INET,
-                                       &reply->entries->content.a.addr);
+               struct rdns_reply_entry *entry;
+
+               DL_FOREACH(reply->entries, entry) {
+                       if (entry->type == RDNS_REQUEST_A) {
+                               cbd->addr = rspamd_inet_address_new(AF_INET,
+                                               &entry->content.a.addr);
+                               break;
+                       }
+                       else if (entry->type == RDNS_REQUEST_AAAA) {
+                               cbd->addr = rspamd_inet_address_new(AF_INET6,
+                                               &entry->content.aaa.addr);
+                               break;
+                       }
                }
-               else if (reply->entries->type == RDNS_REQUEST_AAAA) {
-                       cbd->addr = rspamd_inet_address_new (AF_INET6,
-                                       &reply->entries->content.aaa.addr);
+
+               if (cbd->addr == NULL) {
+                       lua_http_push_error (cbd, "unable to resolve host: no records with such name");
+                       REF_RELEASE (cbd);
                }
+               else {
+                       REF_RETAIN (cbd);
+                       if (!lua_http_make_connection(cbd)) {
+                               lua_http_push_error(cbd, "unable to make connection to the host");
 
-               REF_RETAIN (cbd);
-               if (!lua_http_make_connection (cbd)) {
-                       lua_http_push_error (cbd, "unable to make connection to the host");
+                               if (cbd->ref.refcount > 1) {
+                                       REF_RELEASE (cbd);
+                               }
 
-                       if (cbd->ref.refcount > 1) {
                                REF_RELEASE (cbd);
-                       }
 
+                               return;
+                       }
                        REF_RELEASE (cbd);
-
-                       return;
                }
-               REF_RELEASE (cbd);
        }
 
        if (item) {