Skip to content

Commit 90e0857

Browse files
committed
Validate LinuxKM I/O lengths
Reject negative lengths and normalize to size_t before calling kernel_sendmsg/kernel_recvmsg so the kernel transport can’t be tricked into huge or wrapped iov_len values.
1 parent 2596700 commit 90e0857

1 file changed

Lines changed: 26 additions & 4 deletions

File tree

src/wolfio.c

Lines changed: 26 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1153,20 +1153,42 @@ int EmbedGenerateCookie(WOLFSSL* ssl, byte *buf, int sz, void *ctx)
11531153
static int linuxkm_send(struct socket *socket, void *buf, int size,
11541154
unsigned int flags)
11551155
{
1156+
size_t len;
11561157
int ret;
1157-
struct kvec vec = { .iov_base = buf, .iov_len = size };
1158+
struct kvec vec;
11581159
struct msghdr msg = { .msg_flags = flags };
1159-
ret = kernel_sendmsg(socket, &msg, &vec, 1, size);
1160+
1161+
if (size < 0)
1162+
return -EINVAL;
1163+
if (size == 0)
1164+
return 0;
1165+
1166+
len = (size_t)size;
1167+
vec.iov_base = buf;
1168+
vec.iov_len = len;
1169+
1170+
ret = kernel_sendmsg(socket, &msg, &vec, 1, len);
11601171
return ret;
11611172
}
11621173

11631174
static int linuxkm_recv(struct socket *socket, void *buf, int size,
11641175
unsigned int flags)
11651176
{
1177+
size_t len;
11661178
int ret;
1167-
struct kvec vec = { .iov_base = buf, .iov_len = size };
1179+
struct kvec vec;
11681180
struct msghdr msg = { .msg_flags = flags };
1169-
ret = kernel_recvmsg(socket, &msg, &vec, 1, size, msg.msg_flags);
1181+
1182+
if (size < 0)
1183+
return -EINVAL;
1184+
if (size == 0)
1185+
return 0;
1186+
1187+
len = (size_t)size;
1188+
vec.iov_base = buf;
1189+
vec.iov_len = len;
1190+
1191+
ret = kernel_recvmsg(socket, &msg, &vec, 1, len, msg.msg_flags);
11701192
return ret;
11711193
}
11721194
#endif /* WOLFSSL_LINUXKM */

0 commit comments

Comments
 (0)