Skip to content

Commit

Permalink
net/smc: fix null pointer dereference in smc_listen_decline()
Browse files Browse the repository at this point in the history
smc_listen_work() calls smc_listen_decline() on label out_decl,
providing the ini pointer variable. But this pointer can still be null
when the label out_decl is reached.
Fix this by checking the ini variable in smc_listen_work() and call
smc_listen_decline() with the result directly.

Fixes: a7c9c5f ("net/smc: CLC accept / confirm V2")
Signed-off-by: Karsten Graul <[email protected]>
Signed-off-by: Jakub Kicinski <[email protected]>
  • Loading branch information
karstengr authored and kuba-moo committed Oct 26, 2020
1 parent af545bb commit 4a9baf4
Showing 1 changed file with 4 additions and 3 deletions.
7 changes: 4 additions & 3 deletions net/smc/af_smc.c
Original file line number Diff line number Diff line change
Expand Up @@ -1317,10 +1317,10 @@ static void smc_listen_out_err(struct smc_sock *new_smc)

/* listen worker: decline and fall back if possible */
static void smc_listen_decline(struct smc_sock *new_smc, int reason_code,
struct smc_init_info *ini, u8 version)
int local_first, u8 version)
{
/* RDMA setup failed, switch back to TCP */
if (ini->first_contact_local)
if (local_first)
smc_lgr_cleanup_early(&new_smc->conn);
else
smc_conn_free(&new_smc->conn);
Expand Down Expand Up @@ -1768,7 +1768,8 @@ static void smc_listen_work(struct work_struct *work)
out_unlock:
mutex_unlock(&smc_server_lgr_pending);
out_decl:
smc_listen_decline(new_smc, rc, ini, version);
smc_listen_decline(new_smc, rc, ini ? ini->first_contact_local : 0,
version);
out_free:
kfree(ini);
kfree(buf);
Expand Down

0 comments on commit 4a9baf4

Please sign in to comment.