mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-05 02:21:52 +09:00
s390/qeth: fix error handling in adapter command callbacks
[ Upstream commit686c97ee29] 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 commitad3cbf6133("s390/qeth: fix error handling in checksum cmd callback"). Signed-off-by: Julian Wiedmann <jwi@linux.vnet.ibm.com> Signed-off-by: David S. Miller <davem@davemloft.net> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
18addd960f
commit
049fee28bb
@@ -3001,28 +3001,23 @@ static int qeth_send_startlan(struct qeth_card *card)
|
||||
return rc;
|
||||
}
|
||||
|
||||
static int qeth_default_setadapterparms_cb(struct qeth_card *card,
|
||||
struct qeth_reply *reply, unsigned long data)
|
||||
static int qeth_setadpparms_inspect_rc(struct qeth_ipa_cmd *cmd)
|
||||
{
|
||||
struct qeth_ipa_cmd *cmd;
|
||||
|
||||
QETH_CARD_TEXT(card, 4, "defadpcb");
|
||||
|
||||
cmd = (struct qeth_ipa_cmd *) data;
|
||||
if (cmd->hdr.return_code == 0)
|
||||
if (!cmd->hdr.return_code)
|
||||
cmd->hdr.return_code =
|
||||
cmd->data.setadapterparms.hdr.return_code;
|
||||
return 0;
|
||||
return cmd->hdr.return_code;
|
||||
}
|
||||
|
||||
static int qeth_query_setadapterparms_cb(struct qeth_card *card,
|
||||
struct qeth_reply *reply, unsigned long data)
|
||||
{
|
||||
struct qeth_ipa_cmd *cmd;
|
||||
struct qeth_ipa_cmd *cmd = (struct qeth_ipa_cmd *) data;
|
||||
|
||||
QETH_CARD_TEXT(card, 3, "quyadpcb");
|
||||
if (qeth_setadpparms_inspect_rc(cmd))
|
||||
return 0;
|
||||
|
||||
cmd = (struct qeth_ipa_cmd *) data;
|
||||
if (cmd->data.setadapterparms.data.query_cmds_supp.lan_type & 0x7f) {
|
||||
card->info.link_type =
|
||||
cmd->data.setadapterparms.data.query_cmds_supp.lan_type;
|
||||
@@ -3030,7 +3025,7 @@ static int qeth_query_setadapterparms_cb(struct qeth_card *card,
|
||||
}
|
||||
card->options.adp.supported_funcs =
|
||||
cmd->data.setadapterparms.data.query_cmds_supp.supported_cmds;
|
||||
return qeth_default_setadapterparms_cb(card, reply, (unsigned long)cmd);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct qeth_cmd_buffer *qeth_get_adapter_cmd(struct qeth_card *card,
|
||||
@@ -3122,22 +3117,20 @@ EXPORT_SYMBOL_GPL(qeth_query_ipassists);
|
||||
static int qeth_query_switch_attributes_cb(struct qeth_card *card,
|
||||
struct qeth_reply *reply, unsigned long data)
|
||||
{
|
||||
struct qeth_ipa_cmd *cmd;
|
||||
struct qeth_switch_info *sw_info;
|
||||
struct qeth_ipa_cmd *cmd = (struct qeth_ipa_cmd *) data;
|
||||
struct qeth_query_switch_attributes *attrs;
|
||||
struct qeth_switch_info *sw_info;
|
||||
|
||||
QETH_CARD_TEXT(card, 2, "qswiatcb");
|
||||
cmd = (struct qeth_ipa_cmd *) data;
|
||||
sw_info = (struct qeth_switch_info *)reply->param;
|
||||
if (cmd->data.setadapterparms.hdr.return_code == 0) {
|
||||
attrs = &cmd->data.setadapterparms.data.query_switch_attributes;
|
||||
sw_info->capabilities = attrs->capabilities;
|
||||
sw_info->settings = attrs->settings;
|
||||
QETH_CARD_TEXT_(card, 2, "%04x%04x", sw_info->capabilities,
|
||||
sw_info->settings);
|
||||
}
|
||||
qeth_default_setadapterparms_cb(card, reply, (unsigned long) cmd);
|
||||
if (qeth_setadpparms_inspect_rc(cmd))
|
||||
return 0;
|
||||
|
||||
sw_info = (struct qeth_switch_info *)reply->param;
|
||||
attrs = &cmd->data.setadapterparms.data.query_switch_attributes;
|
||||
sw_info->capabilities = attrs->capabilities;
|
||||
sw_info->settings = attrs->settings;
|
||||
QETH_CARD_TEXT_(card, 2, "%04x%04x", sw_info->capabilities,
|
||||
sw_info->settings);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -4188,16 +4181,13 @@ EXPORT_SYMBOL_GPL(qeth_do_send_packet);
|
||||
static int qeth_setadp_promisc_mode_cb(struct qeth_card *card,
|
||||
struct qeth_reply *reply, unsigned long data)
|
||||
{
|
||||
struct qeth_ipa_cmd *cmd;
|
||||
struct qeth_ipa_cmd *cmd = (struct qeth_ipa_cmd *) data;
|
||||
struct qeth_ipacmd_setadpparms *setparms;
|
||||
|
||||
QETH_CARD_TEXT(card, 4, "prmadpcb");
|
||||
|
||||
cmd = (struct qeth_ipa_cmd *) data;
|
||||
setparms = &(cmd->data.setadapterparms);
|
||||
|
||||
qeth_default_setadapterparms_cb(card, reply, (unsigned long)cmd);
|
||||
if (cmd->hdr.return_code) {
|
||||
if (qeth_setadpparms_inspect_rc(cmd)) {
|
||||
QETH_CARD_TEXT_(card, 4, "prmrc%x", cmd->hdr.return_code);
|
||||
setparms->data.mode = SET_PROMISC_MODE_OFF;
|
||||
}
|
||||
@@ -4267,11 +4257,12 @@ EXPORT_SYMBOL_GPL(qeth_get_stats);
|
||||
static int qeth_setadpparms_change_macaddr_cb(struct qeth_card *card,
|
||||
struct qeth_reply *reply, unsigned long data)
|
||||
{
|
||||
struct qeth_ipa_cmd *cmd;
|
||||
struct qeth_ipa_cmd *cmd = (struct qeth_ipa_cmd *) data;
|
||||
|
||||
QETH_CARD_TEXT(card, 4, "chgmaccb");
|
||||
if (qeth_setadpparms_inspect_rc(cmd))
|
||||
return 0;
|
||||
|
||||
cmd = (struct qeth_ipa_cmd *) data;
|
||||
if (!card->options.layer2 ||
|
||||
!(card->info.mac_bits & QETH_LAYER2_MAC_READ)) {
|
||||
memcpy(card->dev->dev_addr,
|
||||
@@ -4279,7 +4270,6 @@ static int qeth_setadpparms_change_macaddr_cb(struct qeth_card *card,
|
||||
OSA_ADDR_LEN);
|
||||
card->info.mac_bits |= QETH_LAYER2_MAC_READ;
|
||||
}
|
||||
qeth_default_setadapterparms_cb(card, reply, (unsigned long) cmd);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -4310,13 +4300,15 @@ EXPORT_SYMBOL_GPL(qeth_setadpparms_change_macaddr);
|
||||
static int qeth_setadpparms_set_access_ctrl_cb(struct qeth_card *card,
|
||||
struct qeth_reply *reply, unsigned long data)
|
||||
{
|
||||
struct qeth_ipa_cmd *cmd;
|
||||
struct qeth_ipa_cmd *cmd = (struct qeth_ipa_cmd *) data;
|
||||
struct qeth_set_access_ctrl *access_ctrl_req;
|
||||
int fallback = *(int *)reply->param;
|
||||
|
||||
QETH_CARD_TEXT(card, 4, "setaccb");
|
||||
if (cmd->hdr.return_code)
|
||||
return 0;
|
||||
qeth_setadpparms_inspect_rc(cmd);
|
||||
|
||||
cmd = (struct qeth_ipa_cmd *) data;
|
||||
access_ctrl_req = &cmd->data.setadapterparms.data.set_access_ctrl;
|
||||
QETH_DBF_TEXT_(SETUP, 2, "setaccb");
|
||||
QETH_DBF_TEXT_(SETUP, 2, "%s", card->gdev->dev.kobj.name);
|
||||
@@ -4389,7 +4381,6 @@ static int qeth_setadpparms_set_access_ctrl_cb(struct qeth_card *card,
|
||||
card->options.isolation = card->options.prev_isolation;
|
||||
break;
|
||||
}
|
||||
qeth_default_setadapterparms_cb(card, reply, (unsigned long) cmd);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -4677,14 +4668,15 @@ out:
|
||||
static int qeth_setadpparms_query_oat_cb(struct qeth_card *card,
|
||||
struct qeth_reply *reply, unsigned long data)
|
||||
{
|
||||
struct qeth_ipa_cmd *cmd;
|
||||
struct qeth_ipa_cmd *cmd = (struct qeth_ipa_cmd *)data;
|
||||
struct qeth_qoat_priv *priv;
|
||||
char *resdata;
|
||||
int resdatalen;
|
||||
|
||||
QETH_CARD_TEXT(card, 3, "qoatcb");
|
||||
if (qeth_setadpparms_inspect_rc(cmd))
|
||||
return 0;
|
||||
|
||||
cmd = (struct qeth_ipa_cmd *)data;
|
||||
priv = (struct qeth_qoat_priv *)reply->param;
|
||||
resdatalen = cmd->data.setadapterparms.hdr.cmdlength;
|
||||
resdata = (char *)data + 28;
|
||||
@@ -4778,21 +4770,18 @@ out:
|
||||
static int qeth_query_card_info_cb(struct qeth_card *card,
|
||||
struct qeth_reply *reply, unsigned long data)
|
||||
{
|
||||
struct qeth_ipa_cmd *cmd;
|
||||
struct carrier_info *carrier_info = (struct carrier_info *)reply->param;
|
||||
struct qeth_ipa_cmd *cmd = (struct qeth_ipa_cmd *)data;
|
||||
struct qeth_query_card_info *card_info;
|
||||
struct carrier_info *carrier_info;
|
||||
|
||||
QETH_CARD_TEXT(card, 2, "qcrdincb");
|
||||
carrier_info = (struct carrier_info *)reply->param;
|
||||
cmd = (struct qeth_ipa_cmd *)data;
|
||||
card_info = &cmd->data.setadapterparms.data.card_info;
|
||||
if (cmd->data.setadapterparms.hdr.return_code == 0) {
|
||||
carrier_info->card_type = card_info->card_type;
|
||||
carrier_info->port_mode = card_info->port_mode;
|
||||
carrier_info->port_speed = card_info->port_speed;
|
||||
}
|
||||
if (qeth_setadpparms_inspect_rc(cmd))
|
||||
return 0;
|
||||
|
||||
qeth_default_setadapterparms_cb(card, reply, (unsigned long) cmd);
|
||||
card_info = &cmd->data.setadapterparms.data.card_info;
|
||||
carrier_info->card_type = card_info->card_type;
|
||||
carrier_info->port_mode = card_info->port_mode;
|
||||
carrier_info->port_speed = card_info->port_speed;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user