199 lines
6.8 KiB
Diff
199 lines
6.8 KiB
Diff
From da10c78f9fa9b865ccc1a780a77f405dc093d04a Mon Sep 17 00:00:00 2001
|
|
From: yinbin <yinbin8@huawei.com>
|
|
Date: Mon, 15 Jul 2024 15:27:53 +0800
|
|
Subject: [PATCH] fix some error of NULL pointer
|
|
|
|
---
|
|
src/lstack/api/lstack_epoll.c | 23 ++++++++++++++++++-----
|
|
src/lstack/core/lstack_lwip.c | 15 ++++++++-------
|
|
src/lstack/core/lstack_port_map.c | 2 +-
|
|
src/lstack/core/lstack_protocol_stack.c | 2 +-
|
|
src/lstack/netif/lstack_ethdev.c | 8 ++++++--
|
|
src/lstack/netif/lstack_tx_cache.c | 1 +
|
|
6 files changed, 35 insertions(+), 16 deletions(-)
|
|
|
|
diff --git a/src/lstack/api/lstack_epoll.c b/src/lstack/api/lstack_epoll.c
|
|
index 7d00de7..566443e 100644
|
|
--- a/src/lstack/api/lstack_epoll.c
|
|
+++ b/src/lstack/api/lstack_epoll.c
|
|
@@ -740,6 +740,7 @@ static int32_t init_poll_wakeup_data(struct wakeup_poll *wakeup)
|
|
wakeup->events = calloc(POLL_KERNEL_EVENTS, sizeof(struct epoll_event));
|
|
if (wakeup->events == NULL) {
|
|
free(wakeup->last_fds);
|
|
+ wakeup->last_fds = NULL;
|
|
GAZELLE_RETURN(EINVAL);
|
|
}
|
|
|
|
@@ -760,7 +761,7 @@ static int32_t init_poll_wakeup_data(struct wakeup_poll *wakeup)
|
|
return 0;
|
|
}
|
|
|
|
-static void resize_kernel_poll(struct wakeup_poll *wakeup, nfds_t nfds)
|
|
+static int resize_kernel_poll(struct wakeup_poll *wakeup, nfds_t nfds)
|
|
{
|
|
if (wakeup->last_fds) {
|
|
free(wakeup->last_fds);
|
|
@@ -768,6 +769,7 @@ static void resize_kernel_poll(struct wakeup_poll *wakeup, nfds_t nfds)
|
|
wakeup->last_fds = calloc(nfds, sizeof(struct pollfd));
|
|
if (wakeup->last_fds == NULL) {
|
|
LSTACK_LOG(ERR, LSTACK, "calloc failed errno=%d\n", errno);
|
|
+ return -1;
|
|
}
|
|
|
|
if (wakeup->events) {
|
|
@@ -776,9 +778,12 @@ static void resize_kernel_poll(struct wakeup_poll *wakeup, nfds_t nfds)
|
|
wakeup->events = calloc(nfds, sizeof(struct epoll_event));
|
|
if (wakeup->events == NULL) {
|
|
LSTACK_LOG(ERR, LSTACK, "calloc failed errno=%d\n", errno);
|
|
+ free(wakeup->last_fds);
|
|
+ return -1;
|
|
}
|
|
|
|
wakeup->last_max_nfds = nfds;
|
|
+ return 0;
|
|
}
|
|
|
|
static void poll_bind_statck(struct wakeup_poll *wakeup, int32_t *stack_count)
|
|
@@ -811,14 +816,18 @@ static void update_kernel_poll(struct wakeup_poll *wakeup, uint32_t index, struc
|
|
}
|
|
}
|
|
|
|
-static void poll_init(struct wakeup_poll *wakeup, struct pollfd *fds, nfds_t nfds)
|
|
+static int poll_init(struct wakeup_poll *wakeup, struct pollfd *fds, nfds_t nfds)
|
|
{
|
|
int32_t stack_count[PROTOCOL_STACK_MAX] = {0};
|
|
int32_t poll_change = 0;
|
|
+ int ret = 0;
|
|
|
|
/* poll fds num more, recalloc fds size */
|
|
if (nfds > wakeup->last_max_nfds) {
|
|
- resize_kernel_poll(wakeup, nfds);
|
|
+ ret = resize_kernel_poll(wakeup, nfds);
|
|
+ if (ret < 0) {
|
|
+ return -1;
|
|
+ }
|
|
poll_change = 1;
|
|
}
|
|
|
|
@@ -855,13 +864,14 @@ static void poll_init(struct wakeup_poll *wakeup, struct pollfd *fds, nfds_t nfd
|
|
}
|
|
|
|
if (poll_change == 0) {
|
|
- return;
|
|
+ return 0;
|
|
}
|
|
wakeup->last_nfds = nfds;
|
|
|
|
if (get_global_cfg_params()->app_bind_numa) {
|
|
poll_bind_statck(wakeup, stack_count);
|
|
}
|
|
+ return 0;
|
|
}
|
|
|
|
int32_t lstack_poll(struct pollfd *fds, nfds_t nfds, int32_t timeout)
|
|
@@ -880,7 +890,10 @@ int32_t lstack_poll(struct pollfd *fds, nfds_t nfds, int32_t timeout)
|
|
}
|
|
}
|
|
|
|
- poll_init(wakeup, fds, nfds);
|
|
+ if (poll_init(wakeup, fds, nfds) < 0) {
|
|
+ free(wakeup);
|
|
+ GAZELLE_RETURN(EINVAL);
|
|
+ }
|
|
|
|
int32_t kernel_num = 0;
|
|
int32_t lwip_num = 0;
|
|
diff --git a/src/lstack/core/lstack_lwip.c b/src/lstack/core/lstack_lwip.c
|
|
index 75ef5f6..4d73d44 100644
|
|
--- a/src/lstack/core/lstack_lwip.c
|
|
+++ b/src/lstack/core/lstack_lwip.c
|
|
@@ -333,7 +333,7 @@ static ssize_t do_app_write(struct lwip_sock *sock, struct pbuf *pbufs[], void *
|
|
}
|
|
|
|
/* reduce the branch in loop */
|
|
- uint16_t copy_len = len - send_len;
|
|
+ size_t copy_len = len - send_len;
|
|
rte_memcpy((char *)pbufs[i]->payload, (char *)buf + send_len, copy_len);
|
|
pbufs[i]->tot_len = pbufs[i]->len = copy_len;
|
|
send_len += copy_len;
|
|
@@ -1358,12 +1358,13 @@ void netif_poll(struct netif *netif)
|
|
/* processes on same node handshake packet use this function */
|
|
err_t netif_loop_output(struct netif *netif, struct pbuf *p)
|
|
{
|
|
- if (p != NULL) {
|
|
- const struct ip_hdr *iphdr;
|
|
- iphdr = (const struct ip_hdr *)p->payload;
|
|
- if (IPH_PROTO(iphdr) == IP_PROTO_UDP) {
|
|
- return udp_netif_loop_output(netif, p);
|
|
- }
|
|
+ if (!p) {
|
|
+ return ERR_ARG;
|
|
+ }
|
|
+ const struct ip_hdr *iphdr;
|
|
+ iphdr = (const struct ip_hdr *)p->payload;
|
|
+ if (IPH_PROTO(iphdr) == IP_PROTO_UDP) {
|
|
+ return udp_netif_loop_output(netif, p);
|
|
}
|
|
|
|
struct tcp_pcb *pcb = p->pcb;
|
|
diff --git a/src/lstack/core/lstack_port_map.c b/src/lstack/core/lstack_port_map.c
|
|
index 5439394..ce9d8df 100644
|
|
--- a/src/lstack/core/lstack_port_map.c
|
|
+++ b/src/lstack/core/lstack_port_map.c
|
|
@@ -39,4 +39,4 @@ uint16_t port_map_get(uint16_t port)
|
|
}
|
|
pthread_mutex_unlock(&g_rule_map_mutex);
|
|
return val;
|
|
-}
|
|
\ No newline at end of file
|
|
+}
|
|
diff --git a/src/lstack/core/lstack_protocol_stack.c b/src/lstack/core/lstack_protocol_stack.c
|
|
index d8bdd3c..d1bbf9b 100644
|
|
--- a/src/lstack/core/lstack_protocol_stack.c
|
|
+++ b/src/lstack/core/lstack_protocol_stack.c
|
|
@@ -1000,7 +1000,7 @@ void stack_broadcast_arp(struct rte_mbuf *mbuf, struct protocol_stack *cur_stack
|
|
return;
|
|
}
|
|
copy_mbuf(mbuf_copy, mbuf);
|
|
- virtio_tap_process_tx(stack->queue_id, mbuf_copy);
|
|
+ virtio_tap_process_tx(cur_stack->queue_id, mbuf_copy);
|
|
}
|
|
return;
|
|
}
|
|
diff --git a/src/lstack/netif/lstack_ethdev.c b/src/lstack/netif/lstack_ethdev.c
|
|
index 5685d11..d4d0878 100644
|
|
--- a/src/lstack/netif/lstack_ethdev.c
|
|
+++ b/src/lstack/netif/lstack_ethdev.c
|
|
@@ -319,10 +319,14 @@ static err_t eth_dev_init(struct netif *netif)
|
|
int32_t ethdev_init(struct protocol_stack *stack)
|
|
{
|
|
struct cfg_params *cfg = get_global_cfg_params();
|
|
-
|
|
+ int ret = 0;
|
|
+
|
|
vdev_dev_ops_init(&stack->dev_ops);
|
|
if (cfg->send_cache_mode) {
|
|
- tx_cache_init(stack->queue_id, stack, &stack->dev_ops);
|
|
+ ret = tx_cache_init(stack->queue_id, stack, &stack->dev_ops);
|
|
+ if (ret < 0) {
|
|
+ return ret;
|
|
+ }
|
|
}
|
|
|
|
if (use_ltran()) {
|
|
diff --git a/src/lstack/netif/lstack_tx_cache.c b/src/lstack/netif/lstack_tx_cache.c
|
|
index cda0003..9a48307 100644
|
|
--- a/src/lstack/netif/lstack_tx_cache.c
|
|
+++ b/src/lstack/netif/lstack_tx_cache.c
|
|
@@ -45,6 +45,7 @@ int tx_cache_init(uint16_t queue_id, void *priv, struct lstack_dev_ops *dev_ops)
|
|
struct tx_cache *tx_cache = calloc(1, sizeof(struct tx_cache));
|
|
if (tx_cache == NULL) {
|
|
LSTACK_LOG(ERR, LSTACK, "queue(%d) tx cache init failed\n", queue_id);
|
|
+ return -1;
|
|
}
|
|
|
|
tx_cache->queue_id = queue_id;
|
|
--
|
|
2.33.0
|
|
|