Skip to content

Commit 686c97e

Browse files
julianwiedmanndavem330
authored andcommitted
s390/qeth: fix error handling in adapter command callbacks
Make sure to check both return code fields before(!) processing the command response. Otherwise we risk operating on invalid data. This matches an earlier fix for SETASSPARMS commands, see commit ad3cbf6 ("s390/qeth: fix error handling in checksum cmd callback"). Signed-off-by: Julian Wiedmann <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 83beed7 commit 686c97e

File tree

1 file changed

+37
-48
lines changed

1 file changed

+37
-48
lines changed

drivers/s390/net/qeth_core_main.c

Lines changed: 37 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -3033,36 +3033,31 @@ static int qeth_send_startlan(struct qeth_card *card)
30333033
return rc;
30343034
}
30353035

3036-
static int qeth_default_setadapterparms_cb(struct qeth_card *card,
3037-
struct qeth_reply *reply, unsigned long data)
3036+
static int qeth_setadpparms_inspect_rc(struct qeth_ipa_cmd *cmd)
30383037
{
3039-
struct qeth_ipa_cmd *cmd;
3040-
3041-
QETH_CARD_TEXT(card, 4, "defadpcb");
3042-
3043-
cmd = (struct qeth_ipa_cmd *) data;
3044-
if (cmd->hdr.return_code == 0)
3038+
if (!cmd->hdr.return_code)
30453039
cmd->hdr.return_code =
30463040
cmd->data.setadapterparms.hdr.return_code;
3047-
return 0;
3041+
return cmd->hdr.return_code;
30483042
}
30493043

30503044
static int qeth_query_setadapterparms_cb(struct qeth_card *card,
30513045
struct qeth_reply *reply, unsigned long data)
30523046
{
3053-
struct qeth_ipa_cmd *cmd;
3047+
struct qeth_ipa_cmd *cmd = (struct qeth_ipa_cmd *) data;
30543048

30553049
QETH_CARD_TEXT(card, 3, "quyadpcb");
3050+
if (qeth_setadpparms_inspect_rc(cmd))
3051+
return 0;
30563052

3057-
cmd = (struct qeth_ipa_cmd *) data;
30583053
if (cmd->data.setadapterparms.data.query_cmds_supp.lan_type & 0x7f) {
30593054
card->info.link_type =
30603055
cmd->data.setadapterparms.data.query_cmds_supp.lan_type;
30613056
QETH_DBF_TEXT_(SETUP, 2, "lnk %d", card->info.link_type);
30623057
}
30633058
card->options.adp.supported_funcs =
30643059
cmd->data.setadapterparms.data.query_cmds_supp.supported_cmds;
3065-
return qeth_default_setadapterparms_cb(card, reply, (unsigned long)cmd);
3060+
return 0;
30663061
}
30673062

30683063
static struct qeth_cmd_buffer *qeth_get_adapter_cmd(struct qeth_card *card,
@@ -3154,22 +3149,20 @@ EXPORT_SYMBOL_GPL(qeth_query_ipassists);
31543149
static int qeth_query_switch_attributes_cb(struct qeth_card *card,
31553150
struct qeth_reply *reply, unsigned long data)
31563151
{
3157-
struct qeth_ipa_cmd *cmd;
3158-
struct qeth_switch_info *sw_info;
3152+
struct qeth_ipa_cmd *cmd = (struct qeth_ipa_cmd *) data;
31593153
struct qeth_query_switch_attributes *attrs;
3154+
struct qeth_switch_info *sw_info;
31603155

31613156
QETH_CARD_TEXT(card, 2, "qswiatcb");
3162-
cmd = (struct qeth_ipa_cmd *) data;
3163-
sw_info = (struct qeth_switch_info *)reply->param;
3164-
if (cmd->data.setadapterparms.hdr.return_code == 0) {
3165-
attrs = &cmd->data.setadapterparms.data.query_switch_attributes;
3166-
sw_info->capabilities = attrs->capabilities;
3167-
sw_info->settings = attrs->settings;
3168-
QETH_CARD_TEXT_(card, 2, "%04x%04x", sw_info->capabilities,
3169-
sw_info->settings);
3170-
}
3171-
qeth_default_setadapterparms_cb(card, reply, (unsigned long) cmd);
3157+
if (qeth_setadpparms_inspect_rc(cmd))
3158+
return 0;
31723159

3160+
sw_info = (struct qeth_switch_info *)reply->param;
3161+
attrs = &cmd->data.setadapterparms.data.query_switch_attributes;
3162+
sw_info->capabilities = attrs->capabilities;
3163+
sw_info->settings = attrs->settings;
3164+
QETH_CARD_TEXT_(card, 2, "%04x%04x", sw_info->capabilities,
3165+
sw_info->settings);
31733166
return 0;
31743167
}
31753168

@@ -4207,16 +4200,13 @@ EXPORT_SYMBOL_GPL(qeth_do_send_packet);
42074200
static int qeth_setadp_promisc_mode_cb(struct qeth_card *card,
42084201
struct qeth_reply *reply, unsigned long data)
42094202
{
4210-
struct qeth_ipa_cmd *cmd;
4203+
struct qeth_ipa_cmd *cmd = (struct qeth_ipa_cmd *) data;
42114204
struct qeth_ipacmd_setadpparms *setparms;
42124205

42134206
QETH_CARD_TEXT(card, 4, "prmadpcb");
42144207

4215-
cmd = (struct qeth_ipa_cmd *) data;
42164208
setparms = &(cmd->data.setadapterparms);
4217-
4218-
qeth_default_setadapterparms_cb(card, reply, (unsigned long)cmd);
4219-
if (cmd->hdr.return_code) {
4209+
if (qeth_setadpparms_inspect_rc(cmd)) {
42204210
QETH_CARD_TEXT_(card, 4, "prmrc%x", cmd->hdr.return_code);
42214211
setparms->data.mode = SET_PROMISC_MODE_OFF;
42224212
}
@@ -4286,18 +4276,18 @@ EXPORT_SYMBOL_GPL(qeth_get_stats);
42864276
static int qeth_setadpparms_change_macaddr_cb(struct qeth_card *card,
42874277
struct qeth_reply *reply, unsigned long data)
42884278
{
4289-
struct qeth_ipa_cmd *cmd;
4279+
struct qeth_ipa_cmd *cmd = (struct qeth_ipa_cmd *) data;
42904280

42914281
QETH_CARD_TEXT(card, 4, "chgmaccb");
4282+
if (qeth_setadpparms_inspect_rc(cmd))
4283+
return 0;
42924284

4293-
cmd = (struct qeth_ipa_cmd *) data;
42944285
if (!card->options.layer2 ||
42954286
!(card->info.mac_bits & QETH_LAYER2_MAC_READ)) {
42964287
ether_addr_copy(card->dev->dev_addr,
42974288
cmd->data.setadapterparms.data.change_addr.addr);
42984289
card->info.mac_bits |= QETH_LAYER2_MAC_READ;
42994290
}
4300-
qeth_default_setadapterparms_cb(card, reply, (unsigned long) cmd);
43014291
return 0;
43024292
}
43034293

@@ -4328,13 +4318,15 @@ EXPORT_SYMBOL_GPL(qeth_setadpparms_change_macaddr);
43284318
static int qeth_setadpparms_set_access_ctrl_cb(struct qeth_card *card,
43294319
struct qeth_reply *reply, unsigned long data)
43304320
{
4331-
struct qeth_ipa_cmd *cmd;
4321+
struct qeth_ipa_cmd *cmd = (struct qeth_ipa_cmd *) data;
43324322
struct qeth_set_access_ctrl *access_ctrl_req;
43334323
int fallback = *(int *)reply->param;
43344324

43354325
QETH_CARD_TEXT(card, 4, "setaccb");
4326+
if (cmd->hdr.return_code)
4327+
return 0;
4328+
qeth_setadpparms_inspect_rc(cmd);
43364329

4337-
cmd = (struct qeth_ipa_cmd *) data;
43384330
access_ctrl_req = &cmd->data.setadapterparms.data.set_access_ctrl;
43394331
QETH_DBF_TEXT_(SETUP, 2, "setaccb");
43404332
QETH_DBF_TEXT_(SETUP, 2, "%s", card->gdev->dev.kobj.name);
@@ -4407,7 +4399,6 @@ static int qeth_setadpparms_set_access_ctrl_cb(struct qeth_card *card,
44074399
card->options.isolation = card->options.prev_isolation;
44084400
break;
44094401
}
4410-
qeth_default_setadapterparms_cb(card, reply, (unsigned long) cmd);
44114402
return 0;
44124403
}
44134404

@@ -4695,14 +4686,15 @@ static int qeth_snmp_command(struct qeth_card *card, char __user *udata)
46954686
static int qeth_setadpparms_query_oat_cb(struct qeth_card *card,
46964687
struct qeth_reply *reply, unsigned long data)
46974688
{
4698-
struct qeth_ipa_cmd *cmd;
4689+
struct qeth_ipa_cmd *cmd = (struct qeth_ipa_cmd *)data;
46994690
struct qeth_qoat_priv *priv;
47004691
char *resdata;
47014692
int resdatalen;
47024693

47034694
QETH_CARD_TEXT(card, 3, "qoatcb");
4695+
if (qeth_setadpparms_inspect_rc(cmd))
4696+
return 0;
47044697

4705-
cmd = (struct qeth_ipa_cmd *)data;
47064698
priv = (struct qeth_qoat_priv *)reply->param;
47074699
resdatalen = cmd->data.setadapterparms.hdr.cmdlength;
47084700
resdata = (char *)data + 28;
@@ -4796,21 +4788,18 @@ static int qeth_query_oat_command(struct qeth_card *card, char __user *udata)
47964788
static int qeth_query_card_info_cb(struct qeth_card *card,
47974789
struct qeth_reply *reply, unsigned long data)
47984790
{
4799-
struct qeth_ipa_cmd *cmd;
4791+
struct carrier_info *carrier_info = (struct carrier_info *)reply->param;
4792+
struct qeth_ipa_cmd *cmd = (struct qeth_ipa_cmd *)data;
48004793
struct qeth_query_card_info *card_info;
4801-
struct carrier_info *carrier_info;
48024794

48034795
QETH_CARD_TEXT(card, 2, "qcrdincb");
4804-
carrier_info = (struct carrier_info *)reply->param;
4805-
cmd = (struct qeth_ipa_cmd *)data;
4806-
card_info = &cmd->data.setadapterparms.data.card_info;
4807-
if (cmd->data.setadapterparms.hdr.return_code == 0) {
4808-
carrier_info->card_type = card_info->card_type;
4809-
carrier_info->port_mode = card_info->port_mode;
4810-
carrier_info->port_speed = card_info->port_speed;
4811-
}
4796+
if (qeth_setadpparms_inspect_rc(cmd))
4797+
return 0;
48124798

4813-
qeth_default_setadapterparms_cb(card, reply, (unsigned long) cmd);
4799+
card_info = &cmd->data.setadapterparms.data.card_info;
4800+
carrier_info->card_type = card_info->card_type;
4801+
carrier_info->port_mode = card_info->port_mode;
4802+
carrier_info->port_speed = card_info->port_speed;
48144803
return 0;
48154804
}
48164805

0 commit comments

Comments
 (0)