diff --git a/dirmngr/dns-stuff.c b/dirmngr/dns-stuff.c index c500c34e7..639388f55 100644 --- a/dirmngr/dns-stuff.c +++ b/dirmngr/dns-stuff.c @@ -651,7 +651,7 @@ getsrv (const char *name,struct srventry **list) struct srventry *srv = NULL; struct srventry *newlist; - if (strlen (answer->rrs.srvha[count].ha.host) >= MAXDNAME) + if (strlen (answer->rrs.srvha[count].ha.host) >= sizeof srv->target) { log_info ("hostname in SRV record too long - skipped\n"); continue; @@ -747,7 +747,7 @@ getsrv (const char *name,struct srventry **list) /* Get the name. 2782 doesn't allow name compression, but dn_expand still works to pull the name out of the packet. */ - rc = dn_expand(answer,emsg,pt,srv->target,MAXDNAME); + rc = dn_expand(answer,emsg,pt,srv->target, sizeof srv->target); if (rc == 1 && srv->target[0] == 0) /* "." */ { xfree(*list); diff --git a/dirmngr/dns-stuff.h b/dirmngr/dns-stuff.h index 5ffa0178f..13c47df52 100644 --- a/dirmngr/dns-stuff.h +++ b/dirmngr/dns-stuff.h @@ -71,18 +71,13 @@ struct dns_addrinfo_s }; - -#ifndef MAXDNAME -#define MAXDNAME 1025 -#endif - struct srventry { unsigned short priority; unsigned short weight; unsigned short port; int run_count; - char target[MAXDNAME]; + char target[1025]; }; diff --git a/dirmngr/http.c b/dirmngr/http.c index 4387b96b5..de5edc348 100644 --- a/dirmngr/http.c +++ b/dirmngr/http.c @@ -2251,13 +2251,23 @@ connect_server (const char *server, unsigned short port, if (srvtag) { /* We're using SRV, so append the tags. */ - if (1+strlen (srvtag) + 6 + strlen (server) + 1 <= MAXDNAME) + if (1 + strlen (srvtag) + 6 + strlen (server) + 1 + <= DIMof (struct srventry, target)) { - char srvname[MAXDNAME]; + char *srvname = xtrymalloc (DIMof (struct srventry, target)); - stpcpy (stpcpy (stpcpy (stpcpy (srvname,"_"), srvtag), - "._tcp."), server); - srvcount = getsrv (srvname, &serverlist); + if (!srvname) /* Out of core */ + { + serverlist = NULL; + srvcount = 0; + } + else + { + stpcpy (stpcpy (stpcpy (stpcpy (srvname,"_"), srvtag), + "._tcp."), server); + srvcount = getsrv (srvname, &serverlist); + xfree (srvname); + } } } #else @@ -2273,8 +2283,8 @@ connect_server (const char *server, unsigned short port, if (!serverlist) return -1; /* Out of core. */ serverlist->port = port; - strncpy (serverlist->target, server, MAXDNAME); - serverlist->target[MAXDNAME-1] = '\0'; + strncpy (serverlist->target, server, DIMof (struct srventry, target)); + serverlist->target[DIMof (struct srventry, target)-1] = '\0'; srvcount = 1; }