aboutsummaryrefslogtreecommitdiffstats
path: root/driver.c
diff options
context:
space:
mode:
authorMatthias Andree <matthias.andree@gmx.de>2006-03-21 22:08:35 +0000
committerMatthias Andree <matthias.andree@gmx.de>2006-03-21 22:08:35 +0000
commit709883cf99eee0c5a7643b677731decc88b3fce8 (patch)
tree9a55151240d6f37f1b9e883d252eb882d40e470a /driver.c
parent7804fb63eb0b6fb6c4f9108cfafbf1af74e20e7b (diff)
downloadfetchmail-709883cf99eee0c5a7643b677731decc88b3fce8.tar.gz
fetchmail-709883cf99eee0c5a7643b677731decc88b3fce8.tar.bz2
fetchmail-709883cf99eee0c5a7643b677731decc88b3fce8.zip
Work around C libraries that return a NULL in getaddrinfo()'s ai_canonname
record, to avoid a segfault. Affects, for instance, FreeBSD 4.11. Reported and patched by "Voldemar" via fetchmail-users@. svn path=/branches/BRANCH_6-3/; revision=4750
Diffstat (limited to 'driver.c')
-rw-r--r--driver.c10
1 files changed, 9 insertions, 1 deletions
diff --git a/driver.c b/driver.c
index 1d39f068..f58779f5 100644
--- a/driver.c
+++ b/driver.c
@@ -1028,7 +1028,15 @@ static int do_session(
else
{
xfree(ctl->server.truename);
- ctl->server.truename = xstrdup(res->ai_canonname);
+ /* Older FreeBSD versions return NULL in ai_canonname
+ * if they cannot canonicalize, rather than copying
+ * the queryname here, as IEEE Std 1003.1-2001
+ * requires. Work around NULL. */
+ if (res->ai_canonname != NULL) {
+ ctl->server.truename = xstrdup(res->ai_canonname);
+ } else {
+ ctl->server.truename = xstrdup(ctl->server.queryname);
+ }
ctl->server.trueaddr = (struct sockaddr *)xmalloc(res->ai_addrlen);
ctl->server.trueaddr_len = res->ai_addrlen;
memcpy(ctl->server.trueaddr, res->ai_addr, res->ai_addrlen);