Date: Mon, 29 Nov 2021 22:05:28 GMT From: Brooks Davis <brooks@FreeBSD.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org Subject: git: 28f047188492 - main - uipc: rework recvfrom, getsockname, getpeername Message-ID: <202111292205.1ATM5Sll075560@gitrepo.freebsd.org>
next in thread | raw e-mail | index | archive | help
The branch main has been updated by brooks: URL: https://cgit.FreeBSD.org/src/commit/?id=28f047188492c8f2ddca66f162fd2ac9bdc170a6 commit 28f047188492c8f2ddca66f162fd2ac9bdc170a6 Author: Brooks Davis <brooks@FreeBSD.org> AuthorDate: 2021-11-29 22:02:59 +0000 Commit: Brooks Davis <brooks@FreeBSD.org> CommitDate: 2021-11-29 22:04:41 +0000 uipc: rework recvfrom, getsockname, getpeername Stop using <foo>_args structs as part of internal kernel APIs. Add a kern_recvfrom and adjust getsockname and getpeername's equivalent functions to take individual arguments rather than a uap pointer. Adopt a convention from CheriBSD that a function interacting with userspace pointers and sitting between the sys_<foo> syscall and kern_<foo> implementation is named user_<foo>. Reviewed by: kib, imp --- sys/kern/uipc_syscalls.c | 79 +++++++++++++++++++++++------------------------- 1 file changed, 37 insertions(+), 42 deletions(-) diff --git a/sys/kern/uipc_syscalls.c b/sys/kern/uipc_syscalls.c index 44079bae1e9b..3111ce7e16e4 100644 --- a/sys/kern/uipc_syscalls.c +++ b/sys/kern/uipc_syscalls.c @@ -78,10 +78,6 @@ static int recvit(struct thread *td, int s, struct msghdr *mp, void *namelenp); static int accept1(struct thread *td, int s, struct sockaddr *uname, socklen_t *anamelen, int flags); -static int getsockname1(struct thread *td, struct getsockname_args *uap, - int compat); -static int getpeername1(struct thread *td, struct getpeername_args *uap, - int compat); static int sockargs(struct mbuf **, char *, socklen_t, int); /* @@ -1069,40 +1065,48 @@ recvit(struct thread *td, int s, struct msghdr *mp, void *namelenp) return (error); } -int -sys_recvfrom(struct thread *td, struct recvfrom_args *uap) +static int +kern_recvfrom(struct thread *td, int s, void *buf, size_t len, int flags, + struct sockaddr *from, socklen_t *fromlenaddr) { struct msghdr msg; struct iovec aiov; int error; - if (uap->fromlenaddr) { - error = copyin(uap->fromlenaddr, - &msg.msg_namelen, sizeof (msg.msg_namelen)); + if (fromlenaddr != NULL) { + error = copyin(fromlenaddr, &msg.msg_namelen, + sizeof (msg.msg_namelen)); if (error != 0) goto done2; } else { msg.msg_namelen = 0; } - msg.msg_name = uap->from; + msg.msg_name = from; msg.msg_iov = &aiov; msg.msg_iovlen = 1; - aiov.iov_base = uap->buf; - aiov.iov_len = uap->len; + aiov.iov_base = buf; + aiov.iov_len = len; msg.msg_control = 0; - msg.msg_flags = uap->flags; - error = recvit(td, uap->s, &msg, uap->fromlenaddr); + msg.msg_flags = flags; + error = recvit(td, s, &msg, fromlenaddr); done2: return (error); } +int +sys_recvfrom(struct thread *td, struct recvfrom_args *uap) +{ + return (kern_recvfrom(td, uap->s, uap->buf, uap->len, + uap->flags, uap->from, uap->fromlenaddr)); +} + + #ifdef COMPAT_OLDSOCK int orecvfrom(struct thread *td, struct recvfrom_args *uap) { - - uap->flags |= MSG_COMPAT; - return (sys_recvfrom(td, uap)); + return (kern_recvfrom(td, uap->s, uap->buf, uap->len, + uap->flags | MSG_COMPAT, uap->from, uap->fromlenaddr)); } #endif @@ -1331,21 +1335,19 @@ kern_getsockopt(struct thread *td, int s, int level, int name, void *val, return (error); } -/* - * getsockname1() - Get socket name. - */ static int -getsockname1(struct thread *td, struct getsockname_args *uap, int compat) +user_getsockname(struct thread *td, int fdes, struct sockaddr *asa, + socklen_t *alen, bool compat) { struct sockaddr *sa; socklen_t len; int error; - error = copyin(uap->alen, &len, sizeof(len)); + error = copyin(alen, &len, sizeof(len)); if (error != 0) return (error); - error = kern_getsockname(td, uap->fdes, &sa, &len); + error = kern_getsockname(td, fdes, &sa, &len); if (error != 0) return (error); @@ -1354,11 +1356,11 @@ getsockname1(struct thread *td, struct getsockname_args *uap, int compat) if (compat && SV_PROC_FLAG(td->td_proc, SV_AOUT)) ((struct osockaddr *)sa)->sa_family = sa->sa_family; #endif - error = copyout(sa, uap->asa, (u_int)len); + error = copyout(sa, asa, len); } free(sa, M_SONAME); if (error == 0) - error = copyout(&len, uap->alen, sizeof(len)); + error = copyout(&len, alen, sizeof(len)); return (error); } @@ -1404,34 +1406,30 @@ bad: int sys_getsockname(struct thread *td, struct getsockname_args *uap) { - - return (getsockname1(td, uap, 0)); + return (user_getsockname(td, uap->fdes, uap->asa, uap->alen, false)); } #ifdef COMPAT_OLDSOCK int ogetsockname(struct thread *td, struct getsockname_args *uap) { - - return (getsockname1(td, uap, 1)); + return (user_getsockname(td, uap->fdes, uap->asa, uap->alen, true)); } #endif /* COMPAT_OLDSOCK */ -/* - * getpeername1() - Get name of peer for connected socket. - */ static int -getpeername1(struct thread *td, struct getpeername_args *uap, int compat) +user_getpeername(struct thread *td, int fdes, struct sockaddr *asa, + socklen_t *alen, int compat) { struct sockaddr *sa; socklen_t len; int error; - error = copyin(uap->alen, &len, sizeof (len)); + error = copyin(alen, &len, sizeof (len)); if (error != 0) return (error); - error = kern_getpeername(td, uap->fdes, &sa, &len); + error = kern_getpeername(td, fdes, &sa, &len); if (error != 0) return (error); @@ -1440,11 +1438,11 @@ getpeername1(struct thread *td, struct getpeername_args *uap, int compat) if (compat && SV_PROC_FLAG(td->td_proc, SV_AOUT)) ((struct osockaddr *)sa)->sa_family = sa->sa_family; #endif - error = copyout(sa, uap->asa, (u_int)len); + error = copyout(sa, asa, len); } free(sa, M_SONAME); if (error == 0) - error = copyout(&len, uap->alen, sizeof(len)); + error = copyout(&len, alen, sizeof(len)); return (error); } @@ -1495,17 +1493,14 @@ done: int sys_getpeername(struct thread *td, struct getpeername_args *uap) { - - return (getpeername1(td, uap, 0)); + return (user_getpeername(td, uap->fdes, uap->asa, uap->alen, 0)); } #ifdef COMPAT_OLDSOCK int ogetpeername(struct thread *td, struct ogetpeername_args *uap) { - - /* XXX uap should have type `getpeername_args *' to begin with. */ - return (getpeername1(td, (struct getpeername_args *)uap, 1)); + return (user_getpeername(td, uap->fdes, uap->asa, uap->alen, 1)); } #endif /* COMPAT_OLDSOCK */
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202111292205.1ATM5Sll075560>