From: Luke S. <lsc...@us...> - 2004-03-20 16:04:20
|
the patch changing this came with the following explaination: " If getaddrinfo() is used, the addrlen and addr returned through that function are written through the pipe to the child Gaim processes. getaddrinfo() sets the addrlen and addr fields through the following structure, defined in <netdb.h>: struct addrinfo { int ai_flags; int ai_family; int ai_socktype; int ai_protocol; size_t ai_addrlen; char *ai_canonname; struct sockaddr *ai_addr; struct addrinfo *ai_next; }; This is from FreeBSD/amd64 5.2.1-RELEASE. This structure is defined differently on different systems. Take, for example, this OpenBSD/i386 3.5-beta system: struct addrinfo { int ai_flags; int ai_family; int ai_socktype; int ai_protocol; socklen_t ai_addrlen; struct sockaddr *ai_addr; char *ai_canonname; struct addrinfo *ai_next; }; After being read, the addrlen and addr of each host is written through the descriptor: src/proxy.c: 466 rc = getaddrinfo(dns_params.hostname, servname, &hints, &res); ... 478 while(res) { 479 write(child_out[1], &(res->ai_addrlen), sizeof(res->ai_addrlen)); 480 write(child_out[1], res->ai_addr, res->ai_addrlen); 481 res = res->ai_next; 482 } And later subsequently read: 286 rc=read(req->fd_out, &addrlen, sizeof(addrlen)); 287 if(rc>0 && addrlen > 0) { 288 addr=g_malloc(addrlen); 289 rc=read(req->fd_out, addr, addrlen); So hence, the type of addrlen that is used in host_resolved() must match that of the addrlen used in the addrinfo structure, or they must at least be guarenteed to be the same size." --jarady so it seems that we are breaking either one system or another here. is there any way to avoid this? luke On Sat, Mar 20, 2004 at 11:13:10AM +0100, Pekka Riikonen wrote: > Hi, > > When I was doing the FT API rework for the SILC prpl last week I noticed, > but then forgot to mention when I sent the patch, that the proxy.c is > broken on AMD64 and probably on all other 64-bit system as well. This is > because the latest socklen_t -> size_t changes. On AMD64 size_t is 64 > bits and socklen_t 32 bits. This means that when sending the addresses > via the write() and read() will not work, and in fact crashes the Gaim. > > The following patch would fix the crash while connecting but all other > similar instances should be verified as well, or if size_t has to be used > then socklen_t shouldn't be used at all... > > Index: proxy.c > =================================================================== > RCS file: /cvsroot/gaim/gaim/src/proxy.c,v > retrieving revision 1.88 > diff -u -r1.88 proxy.c > --- proxy.c 12 Mar 2004 16:59:22 -0000 1.88 > +++ proxy.c 20 Mar 2004 10:04:59 -0000 > @@ -315,7 +315,7 @@ > int rc, err; > GSList *hosts = NULL; > struct sockaddr *addr = NULL; > - size_t addrlen; > + socklen_t addrlen; > > gaim_debug(GAIM_DEBUG_INFO, "dns", "Host '%s' resolved\n", req->host); > gaim_input_remove(req->inpa); > > > Pekka > ___________________________________________________________________________ > Pekka Riikonen | Email: pri...@ik... > SILC - http://silcnet.org/ | http://iki.fi/priikone/ > Tel. +358 (0)40 580 6673 | Snellmaninkatu 34 A 15, 70100 Kuopio > PGP KeyID A924ED4F: http://iki.fi/~priikone/pubkey.asc > > > ------------------------------------------------------- > This SF.Net email is sponsored by: IBM Linux Tutorials > Free Linux tutorial presented by Daniel Robbins, President and CEO of > GenToo technologies. Learn everything from fundamentals to system > administration.http://ads.osdn.com/?ad_id=1470&alloc_id=3638&op=click > _______________________________________________ > Gaim-devel mailing list > Gai...@li... > https://lists.sourceforge.net/lists/listinfo/gaim-devel > -- -This email is made of 100% recycled electrons. |