Skip to content

Commit

Permalink
[sctp] fix invalid memory access
Browse files Browse the repository at this point in the history
and add more tests to the SCTP matrix

Signed-off-by: Fabio M. Di Nitto <fdinitto@redhat.com>
  • Loading branch information
fabbione committed Jul 23, 2021
1 parent 3901924 commit 3761691
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 7 deletions.
15 changes: 11 additions & 4 deletions libknet/tests/api_knet_send_sync.c
Expand Up @@ -92,7 +92,7 @@ static int dhost_filter(void *pvt_data,
return dhost_filter_ret;
}

static void test(void)
static void test(int transport)
{
knet_handle_t knet_h;
int logfds[2];
Expand Down Expand Up @@ -291,13 +291,14 @@ static void test(void)
exit(FAIL);
}

if (_knet_link_set_config(knet_h, 1, 0, KNET_TRANSPORT_UDP, 0, AF_INET, 0, &lo) < 0) {
if (_knet_link_set_config(knet_h, 1, 0, transport, 0, AF_INET, 0, &lo) < 0) {
int exit_status = transport == KNET_TRANSPORT_SCTP && errno == EPROTONOSUPPORT ? SKIP : FAIL;
printf("Unable to configure link: %s\n", strerror(errno));
knet_host_remove(knet_h, 1);
knet_handle_free(knet_h);
flush_logs(logfds[0], stdout);
close_logpipes(logfds);
exit(FAIL);
exit(exit_status);
}

if (knet_link_set_enable(knet_h, 1, 0, 1) < 0) {
Expand Down Expand Up @@ -391,7 +392,13 @@ static void test(void)

int main(int argc, char *argv[])
{
test();
printf("Testing with UDP\n");
test(KNET_TRANSPORT_UDP);

#ifdef HAVE_NETINET_SCTP_H
printf("Testing with SCTP\n");
test(KNET_TRANSPORT_SCTP);
#endif

return PASS;
}
9 changes: 6 additions & 3 deletions libknet/transport_sctp.c
Expand Up @@ -492,8 +492,10 @@ int sctp_transport_rx_is_data(knet_handle_t knet_h, int sockfd, struct knet_mmsg
* copy the incoming data into mread_buf + mread_len (incremental)
* and increase mread_len
*/
memmove(listen_info->mread_buf + listen_info->mread_len, iov->iov_base, msg->msg_len);
listen_info->mread_len = listen_info->mread_len + msg->msg_len;
if (knet_h->knet_transport_fd_tracker[sockfd].data_type != SCTP_CONNECT_LINK_INFO) {
memmove(listen_info->mread_buf + listen_info->mread_len, iov->iov_base, msg->msg_len);
listen_info->mread_len = listen_info->mread_len + msg->msg_len;
}
return KNET_TRANSPORT_RX_NOT_DATA_CONTINUE;
}
/*
Expand All @@ -502,7 +504,8 @@ int sctp_transport_rx_is_data(knet_handle_t knet_h, int sockfd, struct knet_mmsg
* complete reassembling the packet in mread_buf, copy it back in the iov
* and set the iov/msg len numbers (size) correctly
*/
if (listen_info->mread_len) {
if ((knet_h->knet_transport_fd_tracker[sockfd].data_type != SCTP_CONNECT_LINK_INFO) &&
(listen_info->mread_len)) {
/*
* add last fragment to mread_buf
*/
Expand Down

0 comments on commit 3761691

Please sign in to comment.