diff options
author | Matthias Andree <matthias.andree@gmx.de> | 2006-03-21 22:08:35 +0000 |
---|---|---|
committer | Matthias Andree <matthias.andree@gmx.de> | 2006-03-21 22:08:35 +0000 |
commit | 709883cf99eee0c5a7643b677731decc88b3fce8 (patch) | |
tree | 9a55151240d6f37f1b9e883d252eb882d40e470a /driver.c | |
parent | 7804fb63eb0b6fb6c4f9108cfafbf1af74e20e7b (diff) | |
download | fetchmail-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.c | 10 |
1 files changed, 9 insertions, 1 deletions
@@ -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); |