[v6,08/12] net/dpaa2: fix possible use of uninitialized vars

Message ID 20191029141212.4907-9-aostruszka@marvell.com (mailing list archive)
State Superseded, archived
Delegated to: Thomas Monjalon
Headers
Series Add an option to use LTO for DPDK build |

Checks

Context Check Description
ci/Intel-compilation fail Compilation issues
ci/checkpatch success coding style OK

Commit Message

Andrzej Ostruszka [C] Oct. 29, 2019, 2:12 p.m. UTC
  This patch fixes 'maybe-uninitialized' warnings reported by compiler
when using LTO.

Compiler warning pointing to this error (with LTO enabled):
error: ‘kg_cfg.extracts[0].masks[0].mask’ may be used uninitialized in
this function [-Werror=maybe-uninitialized]
    extr->masks[j].mask = cfg->extracts[i].masks[j].mask;

Fixes: 16bbc98a3e63 ("bus/fslmc: update MC to 10.3.x")
Signed-off-by: Andrzej Ostruszka <aostruszka@marvell.com>
---
 drivers/net/dpaa2/base/dpaa2_hw_dpni.c | 1 +
 drivers/net/dpaa2/mc/dpkg.c            | 2 +-
 drivers/net/dpaa2/mc/dpni.c            | 9 ++++++---
 3 files changed, 8 insertions(+), 4 deletions(-)
  

Comments

Hemant Agrawal Nov. 4, 2019, 11:46 a.m. UTC | #1
Hi Andrzej

> -----Original Message-----
> From: Andrzej Ostruszka <aostruszka@marvell.com>
> Sent: Tuesday, October 29, 2019 7:42 PM
> To: dev@dpdk.org; Hemant Agrawal <hemant.agrawal@nxp.com>; Sachin
> Saxena <sachin.saxena@nxp.com>
> Cc: mattias.ronnblom@ericsson.com; stephen@networkplumber.org
> Subject: [PATCH v6 08/12] net/dpaa2: fix possible use of uninitialized vars
> Importance: High
> 
> This patch fixes 'maybe-uninitialized' warnings reported by compiler when
> using LTO.
> 
> Compiler warning pointing to this error (with LTO enabled):
> error: ‘kg_cfg.extracts[0].masks[0].mask’ may be used uninitialized in this
> function [-Werror=maybe-uninitialized]
>     extr->masks[j].mask = cfg->extracts[i].masks[j].mask;
> 
> Fixes: 16bbc98a3e63 ("bus/fslmc: update MC to 10.3.x")
> Signed-off-by: Andrzej Ostruszka <aostruszka@marvell.com>
> ---
>  drivers/net/dpaa2/base/dpaa2_hw_dpni.c | 1 +
>  drivers/net/dpaa2/mc/dpkg.c            | 2 +-
>  drivers/net/dpaa2/mc/dpni.c            | 9 ++++++---
>  3 files changed, 8 insertions(+), 4 deletions(-)
> 
> diff --git a/drivers/net/dpaa2/base/dpaa2_hw_dpni.c
> b/drivers/net/dpaa2/base/dpaa2_hw_dpni.c
> index 16555d7b0..47a8bda6a 100644
> --- a/drivers/net/dpaa2/base/dpaa2_hw_dpni.c
> +++ b/drivers/net/dpaa2/base/dpaa2_hw_dpni.c
> @@ -51,6 +51,7 @@ rte_pmd_dpaa2_set_custom_hash(uint16_t port_id,
>  	kg_cfg.extracts[0].type = DPKG_EXTRACT_FROM_DATA;
>  	kg_cfg.extracts[0].extract.from_data.offset = offset;
>  	kg_cfg.extracts[0].extract.from_data.size = size;
> +	kg_cfg.extracts[0].num_of_byte_masks = 0;
>  	kg_cfg.num_extracts = 1;
> 
>  	ret = dpkg_prepare_key_cfg(&kg_cfg, p_params); diff --git
> a/drivers/net/dpaa2/mc/dpkg.c b/drivers/net/dpaa2/mc/dpkg.c index
> 80f94f40e..7aa63ea12 100644
> --- a/drivers/net/dpaa2/mc/dpkg.c
> +++ b/drivers/net/dpaa2/mc/dpkg.c
> @@ -63,7 +63,7 @@ dpkg_prepare_key_cfg(const struct dpkg_profile_cfg
> *cfg, uint8_t *key_cfg_buf)
>  		dpkg_set_field(extr->extract_type, EXTRACT_TYPE,
>  			       cfg->extracts[i].type);
> 
[Hemant] Please add a check here to avoid array overrun
+		if (extr->num_of_byte_masks > DPKG_NUM_OF_MASKS)
+			return -EINVAL;
+
> -		for (j = 0; j < DPKG_NUM_OF_MASKS; j++) {
> +		for (j = 0; j < extr->num_of_byte_masks; j++) {
>  			extr->masks[j].mask = cfg-
> >extracts[i].masks[j].mask;
>  			extr->masks[j].offset =
>  				cfg->extracts[i].masks[j].offset;
> diff --git a/drivers/net/dpaa2/mc/dpni.c b/drivers/net/dpaa2/mc/dpni.c
> index 0950ee007..89a64b0ab 100644
> --- a/drivers/net/dpaa2/mc/dpni.c
> +++ b/drivers/net/dpaa2/mc/dpni.c
> @@ -1839,10 +1839,13 @@ int dpni_set_congestion_notification(struct
> fsl_mc_io *mc_io,
>  	cmd_params->qtype = qtype;
>  	cmd_params->tc = tc_id;
>  	cmd_params->congestion_point = cfg->cg_point;
> -	cmd_params->cgid = (uint8_t)cfg->cgid;
> -	cmd_params->dest_id = cpu_to_le32(cfg->dest_cfg.dest_id);
> +	if (cfg->cg_point == DPNI_CP_CONGESTION_GROUP)
> +		cmd_params->cgid = (uint8_t)cfg->cgid;
> +	if (cfg->dest_cfg.dest_type != DPNI_DEST_NONE) {
> +		cmd_params->dest_id = cpu_to_le32(cfg-
> >dest_cfg.dest_id);
> +		cmd_params->dest_priority = cfg->dest_cfg.priority;
> +	}
[Hemant]  What is the explicit error you got here? 
In the calling function, we are resetting the structure to 0. Which should have avoided
Any un-initialized var errors? 
struct dpni_congestion_notification_cfg cong_notif_cfg = {0};


>  	cmd_params->notification_mode = cpu_to_le16(cfg-
> >notification_mode);
> -	cmd_params->dest_priority = cfg->dest_cfg.priority;
>  	cmd_params->message_iova = cpu_to_le64(cfg->message_iova);
>  	cmd_params->message_ctx = cpu_to_le64(cfg->message_ctx);
>  	cmd_params->threshold_entry = cpu_to_le32(cfg-
> >threshold_entry);
> --
> 2.17.1
  
Andrzej Ostruszka Nov. 4, 2019, 2:33 p.m. UTC | #2
On 11/4/19 12:46 PM, Hemant Agrawal wrote:
> Hi Andrzej

Hello Hemant,

Thank you for your comments.

>> -----Original Message-----
>> From: Andrzej Ostruszka <aostruszka@marvell.com>
[...]
>> a/drivers/net/dpaa2/mc/dpkg.c b/drivers/net/dpaa2/mc/dpkg.c index
>> 80f94f40e..7aa63ea12 100644
>> --- a/drivers/net/dpaa2/mc/dpkg.c
>> +++ b/drivers/net/dpaa2/mc/dpkg.c
>> @@ -63,7 +63,7 @@ dpkg_prepare_key_cfg(const struct dpkg_profile_cfg
>> *cfg, uint8_t *key_cfg_buf)
>>  		dpkg_set_field(extr->extract_type, EXTRACT_TYPE,
>>  			       cfg->extracts[i].type);
>>
> [Hemant] Please add a check here to avoid array overrun
> +		if (extr->num_of_byte_masks > DPKG_NUM_OF_MASKS)
> +			return -EINVAL;
> +

Will do, thank you.

>> -		for (j = 0; j < DPKG_NUM_OF_MASKS; j++) {
>> +		for (j = 0; j < extr->num_of_byte_masks; j++) {
>>  			extr->masks[j].mask = cfg-
>>> extracts[i].masks[j].mask;
>>  			extr->masks[j].offset =
>>  				cfg->extracts[i].masks[j].offset;
>> diff --git a/drivers/net/dpaa2/mc/dpni.c b/drivers/net/dpaa2/mc/dpni.c
>> index 0950ee007..89a64b0ab 100644
>> --- a/drivers/net/dpaa2/mc/dpni.c
>> +++ b/drivers/net/dpaa2/mc/dpni.c
>> @@ -1839,10 +1839,13 @@ int dpni_set_congestion_notification(struct
>> fsl_mc_io *mc_io,
>>  	cmd_params->qtype = qtype;
>>  	cmd_params->tc = tc_id;
>>  	cmd_params->congestion_point = cfg->cg_point;
>> -	cmd_params->cgid = (uint8_t)cfg->cgid;
>> -	cmd_params->dest_id = cpu_to_le32(cfg->dest_cfg.dest_id);
>> +	if (cfg->cg_point == DPNI_CP_CONGESTION_GROUP)
>> +		cmd_params->cgid = (uint8_t)cfg->cgid;
>> +	if (cfg->dest_cfg.dest_type != DPNI_DEST_NONE) {
>> +		cmd_params->dest_id = cpu_to_le32(cfg-
>>> dest_cfg.dest_id);
>> +		cmd_params->dest_priority = cfg->dest_cfg.priority;
>> +	}
> [Hemant]  What is the explicit error you got here? 
> In the calling function, we are resetting the structure to 0. Which should have avoided
> Any un-initialized var errors? 
> struct dpni_congestion_notification_cfg cong_notif_cfg = {0};

Indeed there is no warning from compiler here at the current version.
The original version was developed against 18.05 and this is what I used
to make compiler happy.  I've kept this change (even though compiler
does not report anything here) since to me it looked like a good change
(use the cgid only in case of "congestion group" and use dest_* only
when not DEST_NONE).

You have obviously more authority here so I will remove these changes
(unless you prefer them to stay - in which case please indicate so).

Again thank you for the comments.

Regards
Andrzej
  

Patch

diff --git a/drivers/net/dpaa2/base/dpaa2_hw_dpni.c b/drivers/net/dpaa2/base/dpaa2_hw_dpni.c
index 16555d7b0..47a8bda6a 100644
--- a/drivers/net/dpaa2/base/dpaa2_hw_dpni.c
+++ b/drivers/net/dpaa2/base/dpaa2_hw_dpni.c
@@ -51,6 +51,7 @@  rte_pmd_dpaa2_set_custom_hash(uint16_t port_id,
 	kg_cfg.extracts[0].type = DPKG_EXTRACT_FROM_DATA;
 	kg_cfg.extracts[0].extract.from_data.offset = offset;
 	kg_cfg.extracts[0].extract.from_data.size = size;
+	kg_cfg.extracts[0].num_of_byte_masks = 0;
 	kg_cfg.num_extracts = 1;
 
 	ret = dpkg_prepare_key_cfg(&kg_cfg, p_params);
diff --git a/drivers/net/dpaa2/mc/dpkg.c b/drivers/net/dpaa2/mc/dpkg.c
index 80f94f40e..7aa63ea12 100644
--- a/drivers/net/dpaa2/mc/dpkg.c
+++ b/drivers/net/dpaa2/mc/dpkg.c
@@ -63,7 +63,7 @@  dpkg_prepare_key_cfg(const struct dpkg_profile_cfg *cfg, uint8_t *key_cfg_buf)
 		dpkg_set_field(extr->extract_type, EXTRACT_TYPE,
 			       cfg->extracts[i].type);
 
-		for (j = 0; j < DPKG_NUM_OF_MASKS; j++) {
+		for (j = 0; j < extr->num_of_byte_masks; j++) {
 			extr->masks[j].mask = cfg->extracts[i].masks[j].mask;
 			extr->masks[j].offset =
 				cfg->extracts[i].masks[j].offset;
diff --git a/drivers/net/dpaa2/mc/dpni.c b/drivers/net/dpaa2/mc/dpni.c
index 0950ee007..89a64b0ab 100644
--- a/drivers/net/dpaa2/mc/dpni.c
+++ b/drivers/net/dpaa2/mc/dpni.c
@@ -1839,10 +1839,13 @@  int dpni_set_congestion_notification(struct fsl_mc_io *mc_io,
 	cmd_params->qtype = qtype;
 	cmd_params->tc = tc_id;
 	cmd_params->congestion_point = cfg->cg_point;
-	cmd_params->cgid = (uint8_t)cfg->cgid;
-	cmd_params->dest_id = cpu_to_le32(cfg->dest_cfg.dest_id);
+	if (cfg->cg_point == DPNI_CP_CONGESTION_GROUP)
+		cmd_params->cgid = (uint8_t)cfg->cgid;
+	if (cfg->dest_cfg.dest_type != DPNI_DEST_NONE) {
+		cmd_params->dest_id = cpu_to_le32(cfg->dest_cfg.dest_id);
+		cmd_params->dest_priority = cfg->dest_cfg.priority;
+	}
 	cmd_params->notification_mode = cpu_to_le16(cfg->notification_mode);
-	cmd_params->dest_priority = cfg->dest_cfg.priority;
 	cmd_params->message_iova = cpu_to_le64(cfg->message_iova);
 	cmd_params->message_ctx = cpu_to_le64(cfg->message_ctx);
 	cmd_params->threshold_entry = cpu_to_le32(cfg->threshold_entry);