diff options
| -rw-r--r-- | usr/src/uts/common/brand/lx/syscall/lx_socket.c | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/usr/src/uts/common/brand/lx/syscall/lx_socket.c b/usr/src/uts/common/brand/lx/syscall/lx_socket.c index d714a8865e..e363a865aa 100644 --- a/usr/src/uts/common/brand/lx/syscall/lx_socket.c +++ b/usr/src/uts/common/brand/lx/syscall/lx_socket.c @@ -211,6 +211,8 @@ static const int stol_socktype[SOCK_SEQPACKET + 1] = { #define ABST_PRFX "/tmp/.ABSK_" #define ABST_PRFX_LEN (sizeof (ABST_PRFX) - 1) +#define DATAFILT "datafilt" + typedef enum { lxa_none, lxa_abstract, @@ -2750,6 +2752,7 @@ lx_setsockopt_tcp(sonode_t *so, int optname, void *optval, socklen_t optlen) if (optname == LX_TCP_DEFER_ACCEPT) { int *intval; + char *dfp; /* * Emulate TCP_DEFER_ACCEPT using the datafilt(7M) socket @@ -2761,20 +2764,27 @@ lx_setsockopt_tcp(sonode_t *so, int optname, void *optval, socklen_t optlen) } intval = (int *)optval; + /* + * socket_setsockopt asserts that the optval is aligned, so + * we use kmem_alloc to ensure this. + */ + dfp = (char *)kmem_alloc(sizeof (DATAFILT), KM_SLEEP); + (void) strcpy(dfp, DATAFILT); if (*intval > 0) { error = socket_setsockopt(so, SOL_FILTER, FIL_ATTACH, - "datafilt", 9, CRED()); + dfp, 9, CRED()); if (error == EEXIST) { error = 0; } } else { error = socket_setsockopt(so, SOL_FILTER, FIL_DETACH, - "datafilt", 9, CRED()); + dfp, 9, CRED()); if (error == ENXIO) { error = 0; } } + kmem_free(dfp, sizeof (DATAFILT)); return (error); } |
