if ((upstream->flags & RSPAMD_UPSTREAM_FLAG_DNS)) {
/* For DNS upstreams: resolve synchronously using getaddrinfo if name */
if (upstream->name[0] != '/') {
- char dns_name[253 + 1]; /* host part */
+ /* If marked NORESOLVE at init (numeric address), keep old behaviour */
+ if (upstream->flags & RSPAMD_UPSTREAM_FLAG_NORESOLVE) {
+ return;
+ }
+
+ /* Extract host part without port */
+ char dns_name[253 + 1];
const char *semicolon_pos = strchr(upstream->name, ':');
if (semicolon_pos != NULL && semicolon_pos > upstream->name) {
rspamd_strlcpy(dns_name, upstream->name, sizeof(dns_name));
}
- /* Skip if already IP */
- rspamd_inet_addr_t *tmp_ip = NULL;
- if (rspamd_parse_inet_address(&tmp_ip, dns_name, strlen(dns_name),
- RSPAMD_INET_ADDRESS_PARSE_DEFAULT)) {
- if (tmp_ip) {
- rspamd_inet_address_free(tmp_ip);
- }
- return;
- }
-
+ /* Use saved port from current address */
unsigned int port = 0;
if (upstream->addrs.addr && upstream->addrs.addr->len > 0) {
struct upstream_addr_elt *addr_elt = g_ptr_array_index(upstream->addrs.addr, 0);
char portbuf[8];
if (port == 0) {
+ /* Fallback to default 53 if unknown */
rspamd_strlcpy(portbuf, "53", sizeof(portbuf));
}
else {