Skip to content

Commit

Permalink
net/tap: fix potential IPC buffer overrun
Browse files Browse the repository at this point in the history
When secondary to primary process synchronization occurs
there is no check for number of fds which could cause buffer overrun.

Bugzilla ID: 252
Fixes: c9aa56e ("net/tap: access primary process queues from secondary")
Cc: stable@dpdk.org

Signed-off-by: Herakliusz Lipiec <herakliusz.lipiec@intel.com>
Reviewed-by: Anatoly Burakov <anatoly.burakov@intel.com>
Reviewed-by: Ferruh Yigit <ferruh.yigit@intel.com>
  • Loading branch information
hero24 authored and Ferruh Yigit committed May 3, 2019
1 parent d1e64fb commit 9ad43ad
Showing 1 changed file with 12 additions and 2 deletions.
14 changes: 12 additions & 2 deletions drivers/net/tap/rte_eth_tap.c
Original file line number Diff line number Diff line change
Expand Up @@ -2111,6 +2111,11 @@ tap_mp_attach_queues(const char *port_name, struct rte_eth_dev *dev)
TAP_LOG(DEBUG, "Received IPC reply for %s", reply_param->port_name);

/* Attach the queues from received file descriptors */
if (reply_param->rxq_count + reply_param->txq_count != reply->num_fds) {
TAP_LOG(ERR, "Unexpected number of fds received");
return -1;
}

dev->data->nb_rx_queues = reply_param->rxq_count;
dev->data->nb_tx_queues = reply_param->txq_count;
fd_iterator = 0;
Expand Down Expand Up @@ -2151,19 +2156,24 @@ tap_mp_sync_queues(const struct rte_mp_msg *request, const void *peer)
/* Fill file descriptors for all queues */
reply.num_fds = 0;
reply_param->rxq_count = 0;
if (dev->data->nb_rx_queues + dev->data->nb_tx_queues >
RTE_MP_MAX_FD_NUM){
TAP_LOG(ERR, "Number of rx/tx queues exceeds max number of fds");
return -1;
}

for (queue = 0; queue < dev->data->nb_rx_queues; queue++) {
reply.fds[reply.num_fds++] = process_private->rxq_fds[queue];
reply_param->rxq_count++;
}
RTE_ASSERT(reply_param->rxq_count == dev->data->nb_rx_queues);
RTE_ASSERT(reply_param->txq_count == dev->data->nb_tx_queues);
RTE_ASSERT(reply.num_fds <= RTE_MP_MAX_FD_NUM);

reply_param->txq_count = 0;
for (queue = 0; queue < dev->data->nb_tx_queues; queue++) {
reply.fds[reply.num_fds++] = process_private->txq_fds[queue];
reply_param->txq_count++;
}
RTE_ASSERT(reply_param->txq_count == dev->data->nb_tx_queues);

/* Send reply */
strlcpy(reply.name, request->name, sizeof(reply.name));
Expand Down

0 comments on commit 9ad43ad

Please sign in to comment.