devip: fix addrlen in connect() and bind()

On some systems, the third argument of connect() and bind()
is expected to be the length of the address family instead
of the length of the sockaddr structure.

R=rsc
http://codereview.appspot.com/6492074
This commit is contained in:
David du Colombier 2012-09-10 19:51:39 +02:00
parent 23a48c7cfe
commit 2f4516ba69
2 changed files with 30 additions and 6 deletions

View File

@ -26,6 +26,18 @@ family(unsigned char *addr)
return AF_INET6;
}
static int
addrlen(struct sockaddr_storage *ss)
{
switch(ss->ss_family){
case AF_INET:
return sizeof(struct sockaddr_in);
case AF_INET6:
return sizeof(struct sockaddr_in6);
}
return 0;
}
void
osipinit(void)
{
@ -84,7 +96,7 @@ so_connect(int fd, unsigned char *raddr, unsigned short rport)
break;
}
if(connect(fd, (struct sockaddr*)&ss, sizeof(ss)) < 0)
if(connect(fd, (struct sockaddr*)&ss, addrlen(&ss)) < 0)
oserror();
}
@ -172,7 +184,7 @@ so_bind(int fd, int su, unsigned short port, unsigned char *addr)
break;
}
if(bind(fd, (struct sockaddr*)&ss, sizeof(ss)) >= 0)
if(bind(fd, (struct sockaddr*)&ss, addrlen(&ss)) >= 0)
return;
}
oserror();
@ -190,7 +202,7 @@ so_bind(int fd, int su, unsigned short port, unsigned char *addr)
break;
}
if(bind(fd, (struct sockaddr*)&ss, sizeof(ss)) < 0)
if(bind(fd, (struct sockaddr*)&ss, addrlen(&ss)) < 0)
oserror();
}

View File

@ -25,6 +25,18 @@ family(unsigned char *addr)
return AF_INET6;
}
static int
addrlen(struct sockaddr_storage *ss)
{
switch(ss->ss_family){
case AF_INET:
return sizeof(struct sockaddr_in);
case AF_INET6:
return sizeof(struct sockaddr_in6);
}
return 0;
}
void
osipinit(void)
{
@ -88,7 +100,7 @@ so_connect(int fd, unsigned char *raddr, unsigned short rport)
break;
}
if(connect(fd, (struct sockaddr*)&ss, sizeof(ss)) < 0)
if(connect(fd, (struct sockaddr*)&ss, addrlen(&ss)) < 0)
oserror();
}
@ -176,7 +188,7 @@ so_bind(int fd, int su, unsigned short port, unsigned char *addr)
break;
}
if(bind(fd, (struct sockaddr*)&ss, sizeof(ss)) >= 0)
if(bind(fd, (struct sockaddr*)&ss, addrlen(&ss)) >= 0)
return;
}
oserror();
@ -194,7 +206,7 @@ so_bind(int fd, int su, unsigned short port, unsigned char *addr)
break;
}
if(bind(fd, (struct sockaddr*)&ss, sizeof(ss)) < 0)
if(bind(fd, (struct sockaddr*)&ss, addrlen(&ss)) < 0)
oserror();
}