]> git.proxmox.com Git - mirror_ubuntu-focal-kernel.git/commitdiff
cxgb4: Fix unintentional sign extension issues
authorColin Ian King <colin.king@canonical.com>
Fri, 9 Apr 2021 11:08:57 +0000 (12:08 +0100)
committerKleber Sacilotto de Souza <kleber.souza@canonical.com>
Wed, 26 May 2021 13:39:20 +0000 (15:39 +0200)
BugLink: https://bugs.launchpad.net/bugs/1929615
[ Upstream commit dd2c79677375c37f8f9f8d663eb4708495d595ef ]

The shifting of the u8 integers f->fs.nat_lip[] by 24 bits to
the left will be promoted to a 32 bit signed int and then
sign-extended to a u64. In the event that the top bit of the u8
is set then all then all the upper 32 bits of the u64 end up as
also being set because of the sign-extension. Fix this by
casting the u8 values to a u64 before the 24 bit left shift.

Addresses-Coverity: ("Unintended sign extension")
Fixes: 12b276fbf6e0 ("cxgb4: add support to create hash filters")
Signed-off-by: Colin Ian King <colin.king@canonical.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Sasha Levin <sashal@kernel.org>
Signed-off-by: Kamal Mostafa <kamal@canonical.com>
Signed-off-by: Kleber Sacilotto de Souza <kleber.souza@canonical.com>
drivers/net/ethernet/chelsio/cxgb4/cxgb4_filter.c

index cb50b41cd3df25c7a7fbdd0609455bc70ecc6060..64a2453e06ba1ba7a83debe170f4f532648a8a6b 100644 (file)
@@ -174,31 +174,31 @@ static void set_nat_params(struct adapter *adap, struct filter_entry *f,
                                      WORD_MASK, f->fs.nat_lip[15] |
                                      f->fs.nat_lip[14] << 8 |
                                      f->fs.nat_lip[13] << 16 |
-                                     f->fs.nat_lip[12] << 24, 1);
+                                     (u64)f->fs.nat_lip[12] << 24, 1);
 
                        set_tcb_field(adap, f, tid, TCB_SND_UNA_RAW_W + 1,
                                      WORD_MASK, f->fs.nat_lip[11] |
                                      f->fs.nat_lip[10] << 8 |
                                      f->fs.nat_lip[9] << 16 |
-                                     f->fs.nat_lip[8] << 24, 1);
+                                     (u64)f->fs.nat_lip[8] << 24, 1);
 
                        set_tcb_field(adap, f, tid, TCB_SND_UNA_RAW_W + 2,
                                      WORD_MASK, f->fs.nat_lip[7] |
                                      f->fs.nat_lip[6] << 8 |
                                      f->fs.nat_lip[5] << 16 |
-                                     f->fs.nat_lip[4] << 24, 1);
+                                     (u64)f->fs.nat_lip[4] << 24, 1);
 
                        set_tcb_field(adap, f, tid, TCB_SND_UNA_RAW_W + 3,
                                      WORD_MASK, f->fs.nat_lip[3] |
                                      f->fs.nat_lip[2] << 8 |
                                      f->fs.nat_lip[1] << 16 |
-                                     f->fs.nat_lip[0] << 24, 1);
+                                     (u64)f->fs.nat_lip[0] << 24, 1);
                } else {
                        set_tcb_field(adap, f, tid, TCB_RX_FRAG3_LEN_RAW_W,
                                      WORD_MASK, f->fs.nat_lip[3] |
                                      f->fs.nat_lip[2] << 8 |
                                      f->fs.nat_lip[1] << 16 |
-                                     f->fs.nat_lip[0] << 24, 1);
+                                     (u64)f->fs.nat_lip[0] << 25, 1);
                }
        }
 
@@ -208,25 +208,25 @@ static void set_nat_params(struct adapter *adap, struct filter_entry *f,
                                      WORD_MASK, f->fs.nat_fip[15] |
                                      f->fs.nat_fip[14] << 8 |
                                      f->fs.nat_fip[13] << 16 |
-                                     f->fs.nat_fip[12] << 24, 1);
+                                     (u64)f->fs.nat_fip[12] << 24, 1);
 
                        set_tcb_field(adap, f, tid, TCB_RX_FRAG2_PTR_RAW_W + 1,
                                      WORD_MASK, f->fs.nat_fip[11] |
                                      f->fs.nat_fip[10] << 8 |
                                      f->fs.nat_fip[9] << 16 |
-                                     f->fs.nat_fip[8] << 24, 1);
+                                     (u64)f->fs.nat_fip[8] << 24, 1);
 
                        set_tcb_field(adap, f, tid, TCB_RX_FRAG2_PTR_RAW_W + 2,
                                      WORD_MASK, f->fs.nat_fip[7] |
                                      f->fs.nat_fip[6] << 8 |
                                      f->fs.nat_fip[5] << 16 |
-                                     f->fs.nat_fip[4] << 24, 1);
+                                     (u64)f->fs.nat_fip[4] << 24, 1);
 
                        set_tcb_field(adap, f, tid, TCB_RX_FRAG2_PTR_RAW_W + 3,
                                      WORD_MASK, f->fs.nat_fip[3] |
                                      f->fs.nat_fip[2] << 8 |
                                      f->fs.nat_fip[1] << 16 |
-                                     f->fs.nat_fip[0] << 24, 1);
+                                     (u64)f->fs.nat_fip[0] << 24, 1);
 
                } else {
                        set_tcb_field(adap, f, tid,
@@ -234,13 +234,13 @@ static void set_nat_params(struct adapter *adap, struct filter_entry *f,
                                      WORD_MASK, f->fs.nat_fip[3] |
                                      f->fs.nat_fip[2] << 8 |
                                      f->fs.nat_fip[1] << 16 |
-                                     f->fs.nat_fip[0] << 24, 1);
+                                     (u64)f->fs.nat_fip[0] << 24, 1);
                }
        }
 
        set_tcb_field(adap, f, tid, TCB_PDU_HDR_LEN_W, WORD_MASK,
                      (dp ? (nat_lp[1] | nat_lp[0] << 8) : 0) |
-                     (sp ? (nat_fp[1] << 16 | nat_fp[0] << 24) : 0),
+                     (sp ? (nat_fp[1] << 16 | (u64)nat_fp[0] << 24) : 0),
                      1);
 }