kernel: use struct group to wipe psb6970 volatile priv data
authorAleksander Jan Bajkowski <olek2@wp.pl>
Thu, 25 May 2023 20:20:15 +0000 (22:20 +0200)
committerChristian Lamparter <chunkeey@gmail.com>
Sat, 10 Jun 2023 17:06:15 +0000 (19:06 +0200)
Instead of reference vlan and do strange subtraction, use the handy
struct_group() to create a virtual struct of the same size of the
members. This permits to have a more secure memset and fix compilation
warning in 6.1 where additional checks are done.

Fix compilation warning:
| inlined from 'psb6970_reset_switch' at drivers/net/phy/psb6970.c:275:2:
| ./include/linux/fortify-string.h:314:25: error: call to '__write_overflow_field'
| declared with attribute warning: detected write beyond size of field
| (1st parameter); maybe use struct_group()? [-Werror=attribute-warning]
|  314 |                         __write_overflow_field(p_size_field, size);
|      |                         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|cc1: all warnings being treated as errors

Signed-off-by: Aleksander Jan Bajkowski <olek2@wp.pl>
(cherry picked from commit d69becd3071d560cd1c9ea655cbba26adce91f61)

target/linux/generic/files/drivers/net/phy/psb6970.c

index af64704b16429e974dee6cb7fe2aa5f0097d783b..2587b9991384745ff5cad54524dc23e6a9e3aa43 100644 (file)
@@ -60,11 +60,13 @@ struct psb6970_priv {
        struct mutex reg_mutex;
 
        /* all fields below are cleared on reset */
-       bool vlan;
-       u16 vlan_id[PSB6970_MAX_VLANS];
-       u8 vlan_table[PSB6970_MAX_VLANS];
-       u8 vlan_tagged;
-       u16 pvid[PSB6970_NUM_PORTS];
+       struct_group(psb6970_priv_volatile,
+               bool vlan;
+               u16 vlan_id[PSB6970_MAX_VLANS];
+               u8 vlan_table[PSB6970_MAX_VLANS];
+               u8 vlan_tagged;
+               u16 pvid[PSB6970_NUM_PORTS];
+       );
 };
 
 #define to_psb6970(_dev) container_of(_dev, struct psb6970_priv, dev)
@@ -272,8 +274,8 @@ static int psb6970_reset_switch(struct switch_dev *dev)
 
        mutex_lock(&priv->reg_mutex);
 
-       memset(&priv->vlan, 0, sizeof(struct psb6970_priv) -
-              offsetof(struct psb6970_priv, vlan));
+       memset(&priv->psb6970_priv_volatile, 0,
+               sizeof(priv->psb6970_priv_volatile));
 
        for (i = 0; i < PSB6970_MAX_VLANS; i++)
                priv->vlan_id[i] = i;