#! /bin/sh /usr/share/dpatch/dpatch-run ## 05_fix_maxhostnamelen.dpatch by Cyril Brulebois ## ## All lines beginning with `## DP:' are a description of the patch. ## DP: Fix unconditional use of MAXHOSTNAMELEN (POSIX incompatibility) ## DP: Original patch by Alfred M. Szmidt ## DP: Pulled from ams@gnu.org--2005-update/hackerlab/hackerlab--gnu ## DP: Reported by Michael Banck on Debian BTS: #281870 @DPATCH@ diff -urNad bazaar-1.4.2~/src/hackerlab/vu-network/url-socket.c bazaar-1.4.2/src/hackerlab/vu-network/url-socket.c --- bazaar-1.4.2~/src/hackerlab/vu-network/url-socket.c 2006-07-17 16:12:40.000000000 +0000 +++ bazaar-1.4.2/src/hackerlab/vu-network/url-socket.c 2006-07-17 16:26:47.000000000 +0000 @@ -1406,7 +1406,7 @@ int fd; struct url_socket_params params; struct sockaddr_in addr; - t_uchar myhost[MAXHOSTNAMELEN + 1]; + t_uchar *myhost; mem_set0 ((t_uchar *)&addr, sizeof (addr)); @@ -1417,10 +1417,20 @@ { if (host_id_is) { - if (0 > gethostname (myhost, sizeof (myhost))) + size_t size = 64; + int err; + myhost = (t_uchar *) must_malloc (size + 1); + while (1) { - *errn = errno; - return -1; + int i = size - 1; + myhost[i] = '\0'; + err = gethostname (myhost, size); + if (err >= 0 && myhost[i] == '\0') + break; + else if (err < 0 && errno != ENAMETOOLONG && errno != 0) + must_free (myhost); + size *= 2; + myhost = must_realloc (myhost, size + 1); } *host_id_is = str_save (limits, myhost); } @@ -1482,17 +1492,25 @@ } else { - char my_name[MAXHOSTNAMELEN + 1]; struct hostent * hostent; - - if (0 > gethostname (my_name, sizeof (my_name))) + size_t size = 64; + int err; + t_uchar *my_name; + + my_name = (t_uchar *) must_malloc (size + 1); + while (1) { - int ign; - *errn = errno; - vu_close (&ign, fd); - return -1; + int i = size - 1; + my_name[i] = '\0'; + err = gethostname (my_name, size); + if (err >= 0 && my_name[i] == '\0') + break; + else if (err < 0 && errno != ENAMETOOLONG && errno != 0) + must_free (my_name); + size *= 2; + my_name = must_realloc (my_name, size + 1); } - + hostent = gethostbyname (my_name); if (!hostent) {