Skip to content
Snippets Groups Projects
Commit a525291c authored by Guy Zana's avatar Guy Zana
Browse files

net: fix. accept() didn't return sockaddr to the user

kern_accept() used to return a newly allocated sockaddr struct instead
of modifying the given one. this is a porting issue, since we're not
copying the struct to the user when kern_accept finish.

change the calling convention of kern_accept so it'll modify the given
sockaddr struct instead of returning a newly allocated one.
parent a8d1cce6
No related branches found
No related tags found
No related merge requests found
...@@ -195,14 +195,14 @@ accept1(int s, ...@@ -195,14 +195,14 @@ accept1(int s,
return error; return error;
} }
error = kern_accept(s, &name, namelen, &fp, out_fp); error = kern_accept(s, name, namelen, &fp, out_fp);
fdrop(fp); fdrop(fp);
return (error); return (error);
} }
int int
kern_accept(int s, struct sockaddr **name, kern_accept(int s, struct sockaddr *name,
socklen_t *namelen, struct file **fp, int *out_fd) socklen_t *namelen, struct file **fp, int *out_fd)
{ {
struct file *headfp, *nfp = NULL; struct file *headfp, *nfp = NULL;
...@@ -213,9 +213,7 @@ kern_accept(int s, struct sockaddr **name, ...@@ -213,9 +213,7 @@ kern_accept(int s, struct sockaddr **name,
u_int fflag; u_int fflag;
int tmp; int tmp;
if (name) { if ((name) && (*namelen < 0)) {
*name = NULL;
if (*namelen < 0)
return (EINVAL); return (EINVAL);
} }
...@@ -295,26 +293,15 @@ kern_accept(int s, struct sockaddr **name, ...@@ -295,26 +293,15 @@ kern_accept(int s, struct sockaddr **name,
(void) fo_ioctl(nfp, FIOASYNC, &tmp); (void) fo_ioctl(nfp, FIOASYNC, &tmp);
sa = 0; sa = 0;
error = soaccept(so, &sa); error = soaccept(so, &sa);
if (error) { if (error)
/*
* return a namelen of zero for older code which might
* ignore the return value from accept.
*/
if (name)
*namelen = 0;
goto noconnection; goto noconnection;
} if (sa == NULL)
if (sa == NULL) {
if (name)
*namelen = 0;
goto done; goto done;
}
if (name) { if (name) {
/* check sa_len before it is destroyed */ /* check sa_len before it is destroyed */
if (*namelen > sa->sa_len) if (*namelen > sa->sa_len)
*namelen = sa->sa_len; *namelen = sa->sa_len;
*name = sa; bcopy(sa, name, *namelen);
sa = NULL;
} }
noconnection: noconnection:
if (sa) if (sa)
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
/* Private interface */ /* Private interface */
int kern_bind(int fd, struct sockaddr *sa); int kern_bind(int fd, struct sockaddr *sa);
int kern_accept(int s, struct sockaddr **name, int kern_accept(int s, struct sockaddr *name,
socklen_t *namelen, struct file **fp, int *out_fd); socklen_t *namelen, struct file **fp, int *out_fd);
int kern_connect(int fd, struct sockaddr *sa); int kern_connect(int fd, struct sockaddr *sa);
int kern_sendit(int s, struct msghdr *mp, int flags, int kern_sendit(int s, struct msghdr *mp, int flags,
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment