aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWerner Koch <[email protected]>2015-10-22 07:52:51 +0000
committerWerner Koch <[email protected]>2015-10-22 07:52:51 +0000
commite03a4a94bb67d4a6c958b37671f83456e203f325 (patch)
tree2f51a601a5e487a7cbf7863c84be1b63c4cf4669
parentMove SRV RR code from common/ to dirmngr/. (diff)
downloadgnupg-e03a4a94bb67d4a6c958b37671f83456e203f325.tar.gz
gnupg-e03a4a94bb67d4a6c958b37671f83456e203f325.zip
dirmngr: Do not use MAXDNAME.
* dirmngr/dns-stuff.c (getsrv): Replace MAXDNAME. * dirmngr/dns-stuff.h (MAXDNAME): Remove. (struct srventry): Use a fixed value instead of MAXDNAME. * dirmngr/http.c (connect_server): Use DIMof instead of MAXDNAME. Malloc a helper array. -- Depending on the order of included headers it might be that we allocate the array with a different size than what we test against in another module. To make it more robust we use the actual known size of checking. A better would be to use a linked list and avoid these large arrays. Signed-off-by: Werner Koch <[email protected]>
Diffstat (limited to '')
-rw-r--r--dirmngr/dns-stuff.c4
-rw-r--r--dirmngr/dns-stuff.h7
-rw-r--r--dirmngr/http.c24
3 files changed, 20 insertions, 15 deletions
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;
}