Add missing return statements after failed calloc NULL checks to
prevent null pointer dereferences.
Free previously allocated memory on error paths to prevent
leaked storage when a subsequent allocation fails.
Fixes: 3ebb8789136a ("examples/flow_filtering: add more snippets")
Signed-off-by: Shani Peretz <[email protected]>
---
.../snippets/snippet_match_gre.c | 13 +++++++---
.../snippets/snippet_match_integrity_flags.c | 26 +++++++++++++++----
.../snippets/snippet_match_ipv4.c | 13 +++++++---
.../snippets/snippet_match_mpls.c | 8 ++++--
.../snippets/snippet_match_nsh.c | 13 +++++++---
.../snippets/snippet_match_nvgre.c | 26 +++++++++++++++----
.../snippets/snippet_match_packet_type.c | 13 +++++++---
.../snippets/snippet_match_port_affinity.c | 1 +
.../snippets/snippet_match_roce_ib_bth.c | 8 ++++--
.../snippets/snippet_match_vxlan_gbp.c | 13 +++++++---
.../snippets/snippet_match_vxlan_gpe.c | 8 ++++--
.../snippets/snippet_modify_ecn.c | 9 +++++--
.../flow_filtering/snippets/snippet_nat64.c | 10 +++++++
.../snippets/snippet_random_match.c | 8 ++++--
.../snippets/snippet_switch_granularity.c | 4 ++-
15 files changed, 137 insertions(+), 36 deletions(-)
diff --git a/examples/flow_filtering/snippets/snippet_match_gre.c
b/examples/flow_filtering/snippets/snippet_match_gre.c
index 477ec59451..f1638f38c5 100644
--- a/examples/flow_filtering/snippets/snippet_match_gre.c
+++ b/examples/flow_filtering/snippets/snippet_match_gre.c
@@ -21,8 +21,10 @@ snippet_match_gre_create_actions(__rte_unused uint16_t
port_id, struct rte_flow_
{
/* Create one action that moves the packet to the selected queue. */
struct rte_flow_action_queue *queue = calloc(1, sizeof(struct
rte_flow_action_queue));
- if (queue == NULL)
+ if (queue == NULL) {
fprintf(stderr, "Failed to allocate memory for queue\n");
+ return;
+ }
/* Set the selected queue. */
queue->index = 1;
@@ -40,12 +42,17 @@ snippet_match_gre_create_patterns(struct rte_flow_item
*pattern)
struct rte_flow_item_gre_opt *gre_opt_spec;
gre_spec = calloc(1, sizeof(struct rte_flow_item_gre));
- if (gre_spec == NULL)
+ if (gre_spec == NULL) {
fprintf(stderr, "Failed to allocate memory for gre_spec\n");
+ return;
+ }
gre_opt_spec = calloc(1, sizeof(struct rte_flow_item_gre_opt));
- if (gre_opt_spec == NULL)
+ if (gre_opt_spec == NULL) {
fprintf(stderr, "Failed to allocate memory for gre_opt_spec\n");
+ free(gre_spec);
+ return;
+ }
/* Set the Checksum GRE option. */
gre_spec->c_rsvd0_ver = RTE_BE16(0x8000);
diff --git a/examples/flow_filtering/snippets/snippet_match_integrity_flags.c
b/examples/flow_filtering/snippets/snippet_match_integrity_flags.c
index 0f05c902b9..3d37b5f2a5 100644
--- a/examples/flow_filtering/snippets/snippet_match_integrity_flags.c
+++ b/examples/flow_filtering/snippets/snippet_match_integrity_flags.c
@@ -20,8 +20,10 @@ snippet_match_integrity_flags_create_actions(__rte_unused
uint16_t port_id,
{
/* Create one action that moves the packet to the selected queue. */
struct rte_flow_action_queue *queue = calloc(1, sizeof(struct
rte_flow_action_queue));
- if (queue == NULL)
+ if (queue == NULL) {
fprintf(stderr, "Failed to allocate memory for queue\n");
+ return;
+ }
queue->index = 1;
action[0].type = RTE_FLOW_ACTION_TYPE_QUEUE;
@@ -38,16 +40,21 @@ snippet_match_integrity_flags_create_patterns(struct
rte_flow_item *pattern)
struct rte_flow_item_integrity *integrity_mask;
integrity_spec = calloc(1, sizeof(struct rte_flow_item_integrity));
- if (integrity_spec == NULL)
+ if (integrity_spec == NULL) {
fprintf(stderr, "Failed to allocate memory for
integrity_spec\n");
+ return;
+ }
integrity_spec->level = 0;
integrity_spec->l3_ok = 1;
integrity_spec->ipv4_csum_ok = 1;
integrity_mask = calloc(1, sizeof(struct rte_flow_item_integrity));
- if (integrity_mask == NULL)
+ if (integrity_mask == NULL) {
fprintf(stderr, "Failed to allocate memory for
integrity_mask\n");
+ free(integrity_spec);
+ return;
+ }
integrity_mask->level = 0;
integrity_mask->l3_ok = 1;
@@ -55,12 +62,21 @@ snippet_match_integrity_flags_create_patterns(struct
rte_flow_item *pattern)
integrity_mask->ipv4_csum_ok = 1;
ip_spec = calloc(1, sizeof(struct rte_flow_item_ipv4));
- if (ip_spec == NULL)
+ if (ip_spec == NULL) {
fprintf(stderr, "Failed to allocate memory for ip_spec\n");
+ free(integrity_spec);
+ free(integrity_mask);
+ return;
+ }
ip_mask = calloc(1, sizeof(struct rte_flow_item_ipv4));
- if (ip_mask == NULL)
+ if (ip_mask == NULL) {
fprintf(stderr, "Failed to allocate memory for ip_mask\n");
+ free(integrity_spec);
+ free(integrity_mask);
+ free(ip_spec);
+ return;
+ }
ip_spec->hdr.dst_addr = htonl(((192<<24) + (168<<16) + (1<<8) + 1));
ip_mask->hdr.dst_addr = 0xffffffff;
diff --git a/examples/flow_filtering/snippets/snippet_match_ipv4.c
b/examples/flow_filtering/snippets/snippet_match_ipv4.c
index 7f8aba66bb..6fcaacdc42 100644
--- a/examples/flow_filtering/snippets/snippet_match_ipv4.c
+++ b/examples/flow_filtering/snippets/snippet_match_ipv4.c
@@ -24,8 +24,10 @@ snippet_ipv4_flow_create_actions(__rte_unused uint16_t
port_id, struct rte_flow_
* one action only, move packet to queue
*/
struct rte_flow_action_queue *queue = calloc(1, sizeof(struct
rte_flow_action_queue));
- if (queue == NULL)
+ if (queue == NULL) {
fprintf(stderr, "Failed to allocate memory for queue\n");
+ return;
+ }
queue->index = 1; /* The selected target queue.*/
action[0].type = RTE_FLOW_ACTION_TYPE_QUEUE;
action[0].conf = queue;
@@ -53,12 +55,17 @@ snippet_ipv4_flow_create_patterns(struct rte_flow_item
*patterns)
patterns[1].type = RTE_FLOW_ITEM_TYPE_IPV4;
ip_spec = calloc(1, sizeof(struct rte_flow_item_ipv4));
- if (ip_spec == NULL)
+ if (ip_spec == NULL) {
fprintf(stderr, "Failed to allocate memory for ip_spec\n");
+ return;
+ }
ip_mask = calloc(1, sizeof(struct rte_flow_item_ipv4));
- if (ip_mask == NULL)
+ if (ip_mask == NULL) {
fprintf(stderr, "Failed to allocate memory for ip_mask\n");
+ free(ip_spec);
+ return;
+ }
/* Match destination IP 192.168.1.1 with full mask */
ip_spec->hdr.dst_addr = htonl(((192<<24) + (168<<16) + (1<<8) + 1));
diff --git a/examples/flow_filtering/snippets/snippet_match_mpls.c
b/examples/flow_filtering/snippets/snippet_match_mpls.c
index 494a2d873d..0a54586c98 100644
--- a/examples/flow_filtering/snippets/snippet_match_mpls.c
+++ b/examples/flow_filtering/snippets/snippet_match_mpls.c
@@ -25,8 +25,10 @@ snippet_mpls_create_actions(__rte_unused uint16_t port_id,
struct rte_flow_actio
struct rte_flow_action_queue *queue;
queue = calloc(1, sizeof(struct rte_flow_item_ipv4));
- if (queue == NULL)
+ if (queue == NULL) {
fprintf(stderr, "Failed to allocate memory for queue\n");
+ return;
+ }
/* Set the selected queue. */
queue->index = UINT16_MAX;
@@ -43,8 +45,10 @@ snippet_mpls_create_patterns(struct rte_flow_item *pattern)
struct rte_flow_item_mpls *mpls_item;
mpls_item = calloc(1, sizeof(struct rte_flow_item_ipv4));
- if (mpls_item == NULL)
+ if (mpls_item == NULL) {
fprintf(stderr, "Failed to allocate memory for mpls_item\n");
+ return;
+ }
memcpy(mpls_item->label_tc_s, "\xab\xcd\xe1",
sizeof(mpls_item->label_tc_s));
diff --git a/examples/flow_filtering/snippets/snippet_match_nsh.c
b/examples/flow_filtering/snippets/snippet_match_nsh.c
index 262d0c8d81..6a8ac5b942 100644
--- a/examples/flow_filtering/snippets/snippet_match_nsh.c
+++ b/examples/flow_filtering/snippets/snippet_match_nsh.c
@@ -25,8 +25,10 @@ snippet_match_nsh_create_actions(uint16_t port_id, struct
rte_flow_action *actio
create_jump_flow(port_id, 1, &error);
struct rte_flow_action_port_id *portid = calloc(1, sizeof(struct
rte_flow_action_port_id));
- if (portid == NULL)
+ if (portid == NULL) {
fprintf(stderr, "Failed to allocate memory for port_id\n");
+ return;
+ }
/* To match on NSH to port_id 1. */
portid->id = 1;
@@ -43,12 +45,17 @@ snippet_match_nsh_create_patterns(struct rte_flow_item
*pattern)
struct rte_flow_item_udp *mask;
spec = calloc(1, sizeof(struct rte_flow_item_udp));
- if (spec == NULL)
+ if (spec == NULL) {
fprintf(stderr, "Failed to allocate memory for spec\n");
+ return;
+ }
mask = calloc(1, sizeof(struct rte_flow_item_udp));
- if (mask == NULL)
+ if (mask == NULL) {
fprintf(stderr, "Failed to allocate memory for mask\n");
+ free(spec);
+ return;
+ }
/* Set the patterns. */
pattern[0].type = RTE_FLOW_ITEM_TYPE_ETH;
diff --git a/examples/flow_filtering/snippets/snippet_match_nvgre.c
b/examples/flow_filtering/snippets/snippet_match_nvgre.c
index 4ae06c5f1a..3ed62db4a2 100644
--- a/examples/flow_filtering/snippets/snippet_match_nvgre.c
+++ b/examples/flow_filtering/snippets/snippet_match_nvgre.c
@@ -23,8 +23,10 @@ snippet_match_nvgre_create_actions(uint16_t port_id, struct
rte_flow_action *act
create_jump_flow(port_id, 1, &error);
struct rte_flow_action_queue *queue = calloc(1, sizeof(struct
rte_flow_action_queue));
- if (queue == NULL)
+ if (queue == NULL) {
fprintf(stderr, "Failed to allocate memory for queue\n");
+ return;
+ }
queue->index = 1;
action[0].type = RTE_FLOW_ACTION_TYPE_QUEUE;
@@ -36,20 +38,34 @@ void
snippet_match_nvgre_create_patterns(struct rte_flow_item *pattern)
{
struct rte_flow_item_nvgre *nvgre = calloc(1, sizeof(struct
rte_flow_item_nvgre));
- if (nvgre == NULL)
+ if (nvgre == NULL) {
fprintf(stderr, "Failed to allocate memory for nvgre\n");
+ return;
+ }
struct rte_flow_item_udp *udp = calloc(1, sizeof(struct
rte_flow_item_udp));
- if (udp == NULL)
+ if (udp == NULL) {
fprintf(stderr, "Failed to allocate memory for udp\n");
+ free(nvgre);
+ return;
+ }
struct rte_flow_item_nvgre *nvgre_mask = calloc(1, sizeof(struct
rte_flow_item_nvgre));
- if (nvgre_mask == NULL)
+ if (nvgre_mask == NULL) {
fprintf(stderr, "Failed to allocate memory for nvgre_mask\n");
+ free(nvgre);
+ free(udp);
+ return;
+ }
struct rte_flow_item_udp *udp_mask = calloc(1, sizeof(struct
rte_flow_item_udp));
- if (udp_mask == NULL)
+ if (udp_mask == NULL) {
fprintf(stderr, "Failed to allocate memory for udp_mask\n");
+ free(nvgre);
+ free(udp);
+ free(nvgre_mask);
+ return;
+ }
/* build rule to match specific NVGRE:
* tni = 0x12346, flow_id = 0x78, inner_udp_src = 0x1234
diff --git a/examples/flow_filtering/snippets/snippet_match_packet_type.c
b/examples/flow_filtering/snippets/snippet_match_packet_type.c
index 3b16d4b0ab..97c0a88f3d 100644
--- a/examples/flow_filtering/snippets/snippet_match_packet_type.c
+++ b/examples/flow_filtering/snippets/snippet_match_packet_type.c
@@ -20,8 +20,10 @@ snippet_match_packet_type_create_actions(__rte_unused
uint16_t port_id,
{
/* Create one action that moves the packet to the selected queue. */
struct rte_flow_action_queue *queue = calloc(1, sizeof(struct
rte_flow_action_queue));
- if (queue == NULL)
+ if (queue == NULL) {
fprintf(stderr, "Failed to allocate memory for queue\n");
+ return;
+ }
/*
* create the action sequence.
@@ -38,15 +40,20 @@ snippet_match_packet_type_create_patterns(struct
rte_flow_item *pattern)
{
struct rte_flow_item_ptype *ptype_spec;
ptype_spec = calloc(1, sizeof(struct rte_flow_item_ptype));
- if (ptype_spec == NULL)
+ if (ptype_spec == NULL) {
fprintf(stderr, "Failed to allocate memory for ptype_spec\n");
+ return;
+ }
ptype_spec->packet_type = RTE_PTYPE_L3_IPV4 | RTE_PTYPE_L4_TCP;
struct rte_flow_item_ptype *ptype_mask;
ptype_mask = calloc(1, sizeof(struct rte_flow_item_ptype));
- if (ptype_mask == NULL)
+ if (ptype_mask == NULL) {
fprintf(stderr, "Failed to allocate memory for ptype_mask\n");
+ free(ptype_spec);
+ return;
+ }
ptype_mask->packet_type = RTE_PTYPE_L3_MASK | RTE_PTYPE_L4_MASK;
diff --git a/examples/flow_filtering/snippets/snippet_match_port_affinity.c
b/examples/flow_filtering/snippets/snippet_match_port_affinity.c
index 3709121173..a7fb8a49b4 100644
--- a/examples/flow_filtering/snippets/snippet_match_port_affinity.c
+++ b/examples/flow_filtering/snippets/snippet_match_port_affinity.c
@@ -86,6 +86,7 @@ snippet_match_port_affinity_create_patterns(struct
rte_flow_item *pattern)
calloc(1, sizeof(struct rte_flow_item_aggr_affinity));
if (affinity_mask == NULL) {
fprintf(stderr, "Failed to allocate memory for
affinity_mask\n");
+ free(affinity_spec);
return;
}
diff --git a/examples/flow_filtering/snippets/snippet_match_roce_ib_bth.c
b/examples/flow_filtering/snippets/snippet_match_roce_ib_bth.c
index f3c7e3eb70..6714fa734e 100644
--- a/examples/flow_filtering/snippets/snippet_match_roce_ib_bth.c
+++ b/examples/flow_filtering/snippets/snippet_match_roce_ib_bth.c
@@ -26,8 +26,10 @@ snippet_match_roce_ib_bth_create_actions(uint16_t port_id,
struct rte_flow_actio
/* Create one action that moves the packet to the selected queue. */
struct rte_flow_action_queue *queue = calloc(1, sizeof(struct
rte_flow_action_queue));
- if (queue == NULL)
+ if (queue == NULL) {
fprintf(stderr, "Failed to allocate memory for queue\n");
+ return;
+ }
/* Set the selected queue. */
queue->index = 1;
@@ -44,8 +46,10 @@ snippet_match_roce_ib_bth_create_patterns(struct
rte_flow_item *pattern)
struct rte_flow_item_ib_bth *bth;
bth = calloc(1, sizeof(struct rte_flow_item_ib_bth));
- if (bth == NULL)
+ if (bth == NULL) {
fprintf(stderr, "Failed to allocate memory for bth\n");
+ return;
+ }
bth->hdr.opcode = 0x81;
bth->hdr.dst_qp[0] = 0x0;
diff --git a/examples/flow_filtering/snippets/snippet_match_vxlan_gbp.c
b/examples/flow_filtering/snippets/snippet_match_vxlan_gbp.c
index 521e9aae94..ccd66f8d44 100644
--- a/examples/flow_filtering/snippets/snippet_match_vxlan_gbp.c
+++ b/examples/flow_filtering/snippets/snippet_match_vxlan_gbp.c
@@ -21,8 +21,10 @@ snippet_match_vxlan_gbp_create_actions(__rte_unused uint16_t
port_id,
struct rte_flow_action *action)
{
struct rte_flow_action_queue *queue = calloc(1, sizeof(struct
rte_flow_action_queue));
- if (queue == NULL)
+ if (queue == NULL) {
fprintf(stderr, "Failed to allocate memory for queue\n");
+ return;
+ }
queue->index = 1;
@@ -35,12 +37,17 @@ void
snippet_match_vxlan_gbp_create_patterns(struct rte_flow_item *pattern)
{
struct rte_flow_item_vxlan *vxlan_gbp = calloc(1, sizeof(struct
rte_flow_item_vxlan));
- if (vxlan_gbp == NULL)
+ if (vxlan_gbp == NULL) {
fprintf(stderr, "Failed to allocate memory for vxlan_gbp\n");
+ return;
+ }
struct rte_flow_item_vxlan *vxlan_gbp_mask = calloc(1, sizeof(struct
rte_flow_item_vxlan));
- if (vxlan_gbp_mask == NULL)
+ if (vxlan_gbp_mask == NULL) {
fprintf(stderr, "Failed to allocate memory for
vxlan_gbp_mask\n");
+ free(vxlan_gbp);
+ return;
+ }
uint8_t vni[] = {0x00, 0x00, 0x00};
uint16_t group_policy_id = 0x200;
diff --git a/examples/flow_filtering/snippets/snippet_match_vxlan_gpe.c
b/examples/flow_filtering/snippets/snippet_match_vxlan_gpe.c
index 08c71a58e0..62b70ba5c9 100644
--- a/examples/flow_filtering/snippets/snippet_match_vxlan_gpe.c
+++ b/examples/flow_filtering/snippets/snippet_match_vxlan_gpe.c
@@ -23,8 +23,10 @@ snippet_match_vxlan_gpe_create_actions(uint16_t port_id,
struct rte_flow_action
create_jump_flow(port_id, 1, &error);
struct rte_flow_action_queue *queue = calloc(1, sizeof(struct
rte_flow_action_queue));
- if (queue == NULL)
+ if (queue == NULL) {
fprintf(stderr, "Failed to allocate memory for queue\n");
+ return;
+ }
queue->index = 1;
action[0].type = RTE_FLOW_ACTION_TYPE_QUEUE;
@@ -37,8 +39,10 @@ snippet_match_vxlan_gpe_create_patterns(struct rte_flow_item
*pattern)
{
struct rte_flow_item_vxlan_gpe *vxlan_gpe_mask = calloc(1,
sizeof(struct rte_flow_item_vxlan_gpe));
- if (vxlan_gpe_mask == NULL)
+ if (vxlan_gpe_mask == NULL) {
fprintf(stderr, "Failed to allocate memory for
vxlan_gpe_mask\n");
+ return;
+ }
memset(vxlan_gpe_mask->hdr.vni, 0xff, 3);
pattern[0].type = RTE_FLOW_ITEM_TYPE_ETH;
diff --git a/examples/flow_filtering/snippets/snippet_modify_ecn.c
b/examples/flow_filtering/snippets/snippet_modify_ecn.c
index 74bc708036..563a394dc6 100644
--- a/examples/flow_filtering/snippets/snippet_modify_ecn.c
+++ b/examples/flow_filtering/snippets/snippet_modify_ecn.c
@@ -22,13 +22,18 @@ snippet_match_modify_ecn_create_actions(__rte_unused
uint16_t port_id,
{
/* Create one action that moves the packet to the selected queue. */
struct rte_flow_action_queue *queue = calloc(1, sizeof(struct
rte_flow_action_queue));
- if (queue == NULL)
+ if (queue == NULL) {
fprintf(stderr, "Failed to allocate memory for queue\n");
+ return;
+ }
struct rte_flow_action_modify_field *modify_field =
calloc(1, sizeof(struct
rte_flow_action_modify_field));
- if (modify_field == NULL)
+ if (modify_field == NULL) {
fprintf(stderr, "Failed to allocate memory for modify_field\n");
+ free(queue);
+ return;
+ }
queue->index = 1;
modify_field->operation = RTE_FLOW_MODIFY_SET;
diff --git a/examples/flow_filtering/snippets/snippet_nat64.c
b/examples/flow_filtering/snippets/snippet_nat64.c
index 5c87abb3be..2190a625fd 100644
--- a/examples/flow_filtering/snippets/snippet_nat64.c
+++ b/examples/flow_filtering/snippets/snippet_nat64.c
@@ -23,7 +23,17 @@ snippet_match_nat64_create_actions(uint16_t port_id, struct
rte_flow_action *act
create_jump_flow(port_id, 1, &error);
struct rte_flow_action_nat64 *nat64_v = calloc(1, sizeof(struct
rte_flow_action_nat64));
+ if (nat64_v == NULL) {
+ fprintf(stderr, "Failed to allocate memory for nat64_v\n");
+ return;
+ }
+
struct rte_flow_action_jump *jump_v = calloc(1, sizeof(struct
rte_flow_action_jump));
+ if (jump_v == NULL) {
+ fprintf(stderr, "Failed to allocate memory for jump_v\n");
+ free(nat64_v);
+ return;
+ }
nat64_v->type = RTE_FLOW_NAT64_4TO6;
jump_v->group = 2;
diff --git a/examples/flow_filtering/snippets/snippet_random_match.c
b/examples/flow_filtering/snippets/snippet_random_match.c
index 60e252a6ca..36adfdfa6b 100644
--- a/examples/flow_filtering/snippets/snippet_random_match.c
+++ b/examples/flow_filtering/snippets/snippet_random_match.c
@@ -20,8 +20,10 @@ snippet_match_random_value_create_actions(__rte_unused
uint16_t port_id,
struct rte_flow_action *action)
{
struct rte_flow_action_queue *queue = calloc(1, sizeof(struct
rte_flow_action_queue));
- if (queue == NULL)
+ if (queue == NULL) {
fprintf(stderr, "Failed to allocate memory for queue\n");
+ return;
+ }
queue->index = UINT16_MAX; /* The selected target queue.*/
action[0].type = RTE_FLOW_ACTION_TYPE_QUEUE;
action[0].conf = queue;
@@ -33,8 +35,10 @@ snippet_match_random_value_create_patterns(struct
rte_flow_item *pattern)
{
struct rte_flow_item_random *random_item;
random_item = calloc(1, sizeof(struct rte_flow_item_random));
- if (random_item == NULL)
+ if (random_item == NULL) {
fprintf(stderr, "Failed to allocate memory for
port_representor_spec\n");
+ return;
+ }
random_item->value = 0;
diff --git a/examples/flow_filtering/snippets/snippet_switch_granularity.c
b/examples/flow_filtering/snippets/snippet_switch_granularity.c
index 414870bf89..a6b40e8d90 100644
--- a/examples/flow_filtering/snippets/snippet_switch_granularity.c
+++ b/examples/flow_filtering/snippets/snippet_switch_granularity.c
@@ -27,8 +27,10 @@ snippet_match_switch_granularity_create_actions(uint16_t
port_id, struct rte_flo
struct rte_flow_action_ethdev *represented_port = calloc(1,
sizeof(struct rte_flow_action_ethdev));
- if (represented_port == NULL)
+ if (represented_port == NULL) {
fprintf(stderr, "Failed to allocate memory for
represented_port\n");
+ return;
+ }
represented_port->port_id = 0;
action[0].type = RTE_FLOW_ACTION_TYPE_REPRESENTED_PORT;
--
2.43.0