diff -ur tmp/bazaar-1.3.2/src/hackerlab/vu-network/url-socket.c bazaar-1.3.2/src/hackerlab/vu-network/url-socket.c --- tmp/bazaar-1.3.2/src/hackerlab/vu-network/url-socket.c 2005-04-14 10:52:19.000000000 +0200 +++ bazaar-1.3.2/src/hackerlab/vu-network/url-socket.c 2005-06-08 16:13:07.000000000 +0200 @@ -1390,6 +1390,7 @@ return connection_fd; } +#define CHK_SIZE 255 int url_inet_server (alloc_limits limits, @@ -1401,9 +1402,10 @@ int port) { int fd; + int err, pass=1; struct url_socket_params params; struct sockaddr_in addr; - t_uchar myhost[MAXHOSTNAMELEN + 1]; + t_uchar *myhost=NULL; mem_set0 ((t_uchar *)&addr, sizeof (addr)); @@ -1414,12 +1416,22 @@ { if (host_id_is) { - if (0 > gethostname (myhost, sizeof (myhost))) + do + { + myhost = (t_uchar*)realloc(myhost, CHK_SIZE*pass*sizeof(t_uchar)); + err = gethostname (myhost, CHK_SIZE*pass); + pass++; + } + while ( err < 0 && ( errno == ENAMETOOLONG || errno == EINVAL ) ); + + if (0 > err) { *errn = errno; + free(myhost); return -1; } *host_id_is = str_save (limits, myhost); + free(myhost); } addr.sin_addr.s_addr = htonl (INADDR_ANY); } @@ -1479,18 +1491,30 @@ } else { - char my_name[MAXHOSTNAMELEN + 1]; + char *my_name; struct hostent * hostent; + + pass = 1; + do + { + my_name = (t_uchar*)realloc(myhost, CHK_SIZE*pass*sizeof(t_uchar)); + err = gethostname (my_name, CHK_SIZE*pass); + pass++; + } + while ( err < 0 && ( errno == ENAMETOOLONG || errno == EINVAL ) ); - if (0 > gethostname (my_name, sizeof (my_name))) + if (0 > err) { int ign; *errn = errno; vu_close (&ign, fd); + free(my_name); return -1; } hostent = gethostbyname (my_name); + free(my_name); + if (!hostent) { int ign;