mlxsw: spectrum_router: avoid potential uninitialized data usage
authorArnd Bergmann <arnd@arndb.de>
Fri, 30 Sep 2016 16:17:10 +0000 (18:17 +0200)
committerDavid S. Miller <davem@davemloft.net>
Mon, 3 Oct 2016 05:55:18 +0000 (01:55 -0400)
If fi->fib_nhs is zero, the router interface pointer is uninitialized, as shown by
this warning:

drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c: In function 'mlxsw_sp_router_fib_event':
drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c:1674:21: error: 'r' may be used uninitialized in this function [-Werror=maybe-uninitialized]
drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c:1643:23: note: 'r' was declared here

This changes the loop so we handle the case the same way as finding no router
interface pointer attached to one of the nexthops to ensure we always
trap here instead of using uninitialized data.

Fixes: b45f64d16d45 ("mlxsw: spectrum_router: Use FIB notifications instead of switchdev calls")
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
Acked-by: Ido Schimmel <idosch@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c

index 48d50efec5e2f3da0d0e3b7622534edc69da9f1f..78fc557d6dd79313e0a6a99790a5261bd79b30f3 100644 (file)
@@ -1640,7 +1640,7 @@ mlxsw_sp_router_fib4_entry_init(struct mlxsw_sp *mlxsw_sp,
                                struct mlxsw_sp_fib_entry *fib_entry)
 {
        struct fib_info *fi = fen_info->fi;
-       struct mlxsw_sp_rif *r;
+       struct mlxsw_sp_rif *r = NULL;
        int nhsel;
        int err;
 
@@ -1664,11 +1664,15 @@ mlxsw_sp_router_fib4_entry_init(struct mlxsw_sp *mlxsw_sp,
                         * to us. Set trap and pass the packets for
                         * this prefix to kernel.
                         */
-                       fib_entry->type = MLXSW_SP_FIB_ENTRY_TYPE_TRAP;
-                       return 0;
+                       break;
                }
        }
 
+       if (!r) {
+               fib_entry->type = MLXSW_SP_FIB_ENTRY_TYPE_TRAP;
+               return 0;
+       }
+
        if (fi->fib_scope != RT_SCOPE_UNIVERSE) {
                fib_entry->type = MLXSW_SP_FIB_ENTRY_TYPE_LOCAL;
                fib_entry->rif = r->rif;