]> source.dussan.org Git - rspamd.git/commitdiff
[Minor] Plug memory leak when rescheduling requests over TCP
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Sun, 20 Mar 2022 12:36:06 +0000 (12:36 +0000)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Sun, 20 Mar 2022 12:36:06 +0000 (12:36 +0000)
contrib/librdns/resolver.c

index c12180ec1a9673259438d7ecc96e8633a41aa133..cb9824ed420ecadefb3a0584deaab847b07e50b2 100644 (file)
@@ -554,11 +554,12 @@ rdns_process_udp_read (int fd, struct rdns_io_channel *ioc)
                        if (!(rep->flags & RDNS_TRUNCATED)) {
                                req->state = RDNS_REQUEST_REPLIED;
                                req->func(rep, req->arg);
+                               /* This will free reply as well */
                                REF_RELEASE (req);
                        }
                        else {
-                               rdns_debug("truncated UDP reply for %s", req->requested_names[0].name);
                                if (req->io->srv->tcp_io_cnt > 0) {
+                                       rdns_debug("truncated UDP reply for %s; schedule over TCP", req->requested_names[0].name);
                                        /* Reschedule via TCP */
                                        if (!rdns_reschedule_req_over_tcp (req, req->io->srv)) {
                                                /* Use truncated reply as we have no other options */
@@ -566,6 +567,18 @@ rdns_process_udp_read (int fd, struct rdns_io_channel *ioc)
                                                req->func(rep, req->arg);
                                                REF_RELEASE (req);
                                        }
+                                       else {
+                                               /* Remove and free the truncated reply, as we have rescheduled the reply */
+                                               req->reply = NULL;
+                                               rdns_reply_free(rep);
+                                       }
+                               }
+                               else {
+                                       /* No TCP channels available */
+                                       req->state = RDNS_REQUEST_REPLIED;
+                                       req->func(rep, req->arg);
+                                       /* This will free reply as well */
+                                       REF_RELEASE (req);
                                }
                        }
                }