diff --git a/src/modules/files/file.c b/src/modules/files/file.c index a4ebbdfd153a54f67c24c3b3a9a11719bdc2c63a..71c1b9516a5ee78a425efa39424fcc58f4b9817e 100644 --- a/src/modules/files/file.c +++ b/src/modules/files/file.c @@ -722,7 +722,7 @@ static void file_set_buffer(INT32 args) extern int errno; int socketpair(int family, int type, int protocol, int sv[2]) { - struct sockaddr_in addr,addr2; + struct sockaddr_in addr,addr2, addr3; int len, fd; MEMSET((char *)&addr,0,sizeof(struct sockaddr_in)); @@ -753,6 +753,7 @@ int socketpair(int family, int type, int protocol, int sv[2]) if(bind(sv[1], (struct sockaddr *)&addr2, sizeof(addr2)) < 0) return -1; /* Check what ports we got.. */ + len=sizeof(addr); if(getsockname(fd,(struct sockaddr *)&addr,&len) < 0) return -1; if(getsockname(sv[1],(struct sockaddr *)&addr2,&len) < 0) return -1; @@ -769,14 +770,15 @@ int socketpair(int family, int type, int protocol, int sv[2]) * just the right time... uLPC is supposed to be * pretty safe... */ + addr3=addr2; do { len=sizeof(addr2); sv[0]=accept(fd,(struct sockaddr_in *)&addr2,&len); if(sv[0] < 0) return -1; } while(len < sizeof(addr2) || - addr2.sin_addr.s_addr != addr.sin_addr.s_addr || - addr2.sin_port != addr.sin_port); + addr2.sin_addr.s_addr != addr3.sin_addr.s_addr || + addr2.sin_port != addr3.sin_port); if(close(fd) <0) return -1;