diff --git a/src/kernel/emulation/linux/network/getsockopt.c b/src/kernel/emulation/linux/network/getsockopt.c index 927fbd83d..6a49ff94b 100644 --- a/src/kernel/emulation/linux/network/getsockopt.c +++ b/src/kernel/emulation/linux/network/getsockopt.c @@ -17,7 +17,7 @@ long sys_getsockopt(int fd, int level, int optname, void* optval, int* optlen) ret = sockopt_bsd_to_linux(&linux_level, &linux_optname, NULL, NULL); - if (ret != 0) + if (ret != 0 || !linux_optname) return ret; #ifdef __NR_socketcall @@ -104,6 +104,8 @@ int sockopt_bsd_to_linux(int* level, int* optname, void** optval, void* optbuf) *optname = LINUX_SO_TYPE; break; case BSD_SO_LINGER_SEC: *optname = LINUX_SO_LINGER; break; + case BSD_SO_NOSIGNAL: + *optname = 0; break; // FIXME: send() with MSG_NOSIGNAL... default: return -EINVAL; } diff --git a/src/kernel/emulation/linux/network/getsockopt.h b/src/kernel/emulation/linux/network/getsockopt.h index fca22e5c7..c224a0ef8 100644 --- a/src/kernel/emulation/linux/network/getsockopt.h +++ b/src/kernel/emulation/linux/network/getsockopt.h @@ -59,6 +59,7 @@ enum BSD_SO_RCVTIMEO, BSD_SO_ERROR, BSD_SO_TYPE, + BSD_SO_NOSIGNAL = 0x1022, BSD_SO_LINGER_SEC = 0x1080, }; diff --git a/src/kernel/emulation/linux/network/setsockopt.c b/src/kernel/emulation/linux/network/setsockopt.c index ad61a1af1..cbdcd5119 100644 --- a/src/kernel/emulation/linux/network/setsockopt.c +++ b/src/kernel/emulation/linux/network/setsockopt.c @@ -20,7 +20,7 @@ long sys_setsockopt(int fd, int level, int optname, const void* optval, int optl ret = sockopt_bsd_to_linux(&linux_level, &linux_optname, (void**) &optval, buf); - if (ret != 0) + if (ret != 0 || !linux_optname) return ret; #ifdef __NR_socketcall