summaryrefslogtreecommitdiffstats
path: root/drivers/ntb
diff options
context:
space:
mode:
authorSudip Mukherjee <sudipm.mukherjee@gmail.com>2015-10-03 04:09:41 -0400
committerJon Mason <jdmason@kudzu.us>2015-11-08 16:11:21 -0500
commitd4adee09fd1cf65189cb8901eb7506aea3e869ac (patch)
treee124821445b7a4f601440f9f543ac023f9df3bb9 /drivers/ntb
parent04afde45e096201f8fd74c1db848a5d85d1aa57d (diff)
NTB: fix access of free-ed pointer
We were accessing nt->mw_vec after freeing it. Fix the error path so that we free nt->mw_vec after we have finished using it. Signed-off-by: Sudip Mukherjee <sudip@vectorindia.org> Signed-off-by: Jon Mason <jdmason@kudzu.us>
Diffstat (limited to 'drivers/ntb')
-rw-r--r--drivers/ntb/ntb_transport.c15
1 files changed, 7 insertions, 8 deletions
diff --git a/drivers/ntb/ntb_transport.c b/drivers/ntb/ntb_transport.c
index 3903dfc39975..d09d92e05cbe 100644
--- a/drivers/ntb/ntb_transport.c
+++ b/drivers/ntb/ntb_transport.c
@@ -1080,7 +1080,7 @@ static int ntb_transport_probe(struct ntb_client *self, struct ntb_dev *ndev)
1080 GFP_KERNEL, node); 1080 GFP_KERNEL, node);
1081 if (!nt->qp_vec) { 1081 if (!nt->qp_vec) {
1082 rc = -ENOMEM; 1082 rc = -ENOMEM;
1083 goto err2; 1083 goto err1;
1084 } 1084 }
1085 1085
1086 if (nt_debugfs_dir) { 1086 if (nt_debugfs_dir) {
@@ -1092,7 +1092,7 @@ static int ntb_transport_probe(struct ntb_client *self, struct ntb_dev *ndev)
1092 for (i = 0; i < qp_count; i++) { 1092 for (i = 0; i < qp_count; i++) {
1093 rc = ntb_transport_init_queue(nt, i); 1093 rc = ntb_transport_init_queue(nt, i);
1094 if (rc) 1094 if (rc)
1095 goto err3; 1095 goto err2;
1096 } 1096 }
1097 1097
1098 INIT_DELAYED_WORK(&nt->link_work, ntb_transport_link_work); 1098 INIT_DELAYED_WORK(&nt->link_work, ntb_transport_link_work);
@@ -1100,12 +1100,12 @@ static int ntb_transport_probe(struct ntb_client *self, struct ntb_dev *ndev)
1100 1100
1101 rc = ntb_set_ctx(ndev, nt, &ntb_transport_ops); 1101 rc = ntb_set_ctx(ndev, nt, &ntb_transport_ops);
1102 if (rc) 1102 if (rc)
1103 goto err3; 1103 goto err2;
1104 1104
1105 INIT_LIST_HEAD(&nt->client_devs); 1105 INIT_LIST_HEAD(&nt->client_devs);
1106 rc = ntb_bus_init(nt); 1106 rc = ntb_bus_init(nt);
1107 if (rc) 1107 if (rc)
1108 goto err4; 1108 goto err3;
1109 1109
1110 nt->link_is_up = false; 1110 nt->link_is_up = false;
1111 ntb_link_enable(ndev, NTB_SPEED_AUTO, NTB_WIDTH_AUTO); 1111 ntb_link_enable(ndev, NTB_SPEED_AUTO, NTB_WIDTH_AUTO);
@@ -1113,17 +1113,16 @@ static int ntb_transport_probe(struct ntb_client *self, struct ntb_dev *ndev)
1113 1113
1114 return 0; 1114 return 0;
1115 1115
1116err4:
1117 ntb_clear_ctx(ndev);
1118err3: 1116err3:
1119 kfree(nt->qp_vec); 1117 ntb_clear_ctx(ndev);
1120err2: 1118err2:
1121 kfree(nt->mw_vec); 1119 kfree(nt->qp_vec);
1122err1: 1120err1:
1123 while (i--) { 1121 while (i--) {
1124 mw = &nt->mw_vec[i]; 1122 mw = &nt->mw_vec[i];
1125 iounmap(mw->vbase); 1123 iounmap(mw->vbase);
1126 } 1124 }
1125 kfree(nt->mw_vec);
1127err: 1126err:
1128 kfree(nt); 1127 kfree(nt);
1129 return rc; 1128 return rc;