diff options
author | dchagin <dchagin@FreeBSD.org> | 2016-06-05 07:38:56 +0000 |
---|---|---|
committer | dchagin <dchagin@FreeBSD.org> | 2016-06-05 07:38:56 +0000 |
commit | e8e944c226a0adc2138f6e72bce80f5e6e162ac9 (patch) | |
tree | 0ae9e7684ade950c2e681f7582ae1c754803f5dd | |
parent | 74905f75d44b12c8f5f872c554ef67e0e7c1ee48 (diff) | |
download | FreeBSD-src-e8e944c226a0adc2138f6e72bce80f5e6e162ac9.zip FreeBSD-src-e8e944c226a0adc2138f6e72bce80f5e6e162ac9.tar.gz |
MFC r300416:
Add a missing errno translation for SO_ERROR optname.
PR: 135458
Reported by: Stefan Schmidt
-rw-r--r-- | sys/compat/linux/linux_socket.c | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/sys/compat/linux/linux_socket.c b/sys/compat/linux/linux_socket.c index b33b260..4bc4798 100644 --- a/sys/compat/linux/linux_socket.c +++ b/sys/compat/linux/linux_socket.c @@ -1594,10 +1594,10 @@ linux_getsockopt(struct thread *td, struct linux_getsockopt_args *args) } */ bsd_args; l_timeval linux_tv; struct timeval tv; - socklen_t tv_len, xulen; + socklen_t tv_len, xulen, len; struct xucred xu; struct l_ucred lxu; - int error, name; + int error, name, newval; bsd_args.s = args->s; bsd_args.level = linux_to_bsd_sockopt_level(args->level); @@ -1636,6 +1636,15 @@ linux_getsockopt(struct thread *td, struct linux_getsockopt_args *args) return (copyout(&lxu, PTRIN(args->optval), sizeof(lxu))); /* NOTREACHED */ break; + case SO_ERROR: + len = sizeof(newval); + error = kern_getsockopt(td, args->s, bsd_args.level, + name, &newval, UIO_SYSSPACE, &len); + if (error) + return (error); + newval = -SV_ABI_ERRNO(td->td_proc, newval); + return (copyout(&newval, PTRIN(args->optval), len)); + /* NOTREACHED */ default: break; } |