<p>Hoernchen has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-ccid-firmware/+/16244">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">better error handling<br><br>Change-Id: I9983c2f58c7f420a0132d186f344ace1de616ba1<br>---<br>M ccid_common/ccid_device.c<br>M ccid_common/ccid_slot_fsm.c<br>M ccid_common/iso7816_fsm.c<br>3 files changed, 30 insertions(+), 8 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-ccid-firmware refs/changes/44/16244/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/ccid_common/ccid_device.c b/ccid_common/ccid_device.c</span><br><span>index 84bd09a..4444480 100644</span><br><span>--- a/ccid_common/ccid_device.c</span><br><span>+++ b/ccid_common/ccid_device.c</span><br><span>@@ -475,14 +475,25 @@</span><br><span> const struct ccid_header *ch = (const struct ccid_header *) u;</span><br><span> uint8_t seq = u->reset_parameters.hdr.bSeq;</span><br><span> struct msgb *resp;</span><br><span style="color: hsl(120, 100%, 40%);">+ int rc;</span><br><span> </span><br><span> /* copy default parameters from somewhere */</span><br><span> /* FIXME: T=1 */</span><br><span style="color: hsl(0, 100%, 40%);">- cs->ci->slot_ops->set_params(cs, seq, CCID_PROTOCOL_NUM_T0, cs->default_pars);</span><br><span style="color: hsl(0, 100%, 40%);">- cs->pars = *cs->default_pars;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- resp = ccid_gen_parameters_t0(cs, seq, CCID_CMD_STATUS_OK, 0);</span><br><span style="color: hsl(0, 100%, 40%);">- return ccid_slot_send_unbusy(cs, resp);</span><br><span style="color: hsl(120, 100%, 40%);">+ /* validate parameters; abort if they are not supported */</span><br><span style="color: hsl(120, 100%, 40%);">+ rc = cs->ci->slot_ops->set_params(cs, seq, CCID_PROTOCOL_NUM_T0, cs->default_pars);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (rc < 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+ resp = ccid_gen_parameters_t0(cs, seq, CCID_CMD_STATUS_FAILED, -rc);</span><br><span style="color: hsl(120, 100%, 40%);">+ goto out;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ msgb_free(msg);</span><br><span style="color: hsl(120, 100%, 40%);">+ /* busy, tdpu like callback */</span><br><span style="color: hsl(120, 100%, 40%);">+ return 1;</span><br><span style="color: hsl(120, 100%, 40%);">+out:</span><br><span style="color: hsl(120, 100%, 40%);">+ msgb_free(msg);</span><br><span style="color: hsl(120, 100%, 40%);">+ ccid_slot_send_unbusy(cs, resp);</span><br><span style="color: hsl(120, 100%, 40%);">+ return 1;</span><br><span> }</span><br><span> </span><br><span> /* Section 6.1.7 */</span><br><span>@@ -523,10 +534,14 @@</span><br><span> resp = ccid_gen_parameters_t0(cs, seq, CCID_CMD_STATUS_FAILED, -rc);</span><br><span> goto out;</span><br><span> }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ msgb_free(msg);</span><br><span> /* busy, tdpu like callback */</span><br><span> return 1;</span><br><span> out:</span><br><span style="color: hsl(0, 100%, 40%);">- return ccid_slot_send_unbusy(cs, resp);</span><br><span style="color: hsl(120, 100%, 40%);">+ msgb_free(msg);</span><br><span style="color: hsl(120, 100%, 40%);">+ ccid_slot_send_unbusy(cs, resp);</span><br><span style="color: hsl(120, 100%, 40%);">+ return 1;</span><br><span> }</span><br><span> </span><br><span> /* Section 6.1.8 */</span><br><span>@@ -682,6 +697,15 @@</span><br><span> return ccid_send(ci, resp);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ if(!cs->icc_present) {</span><br><span style="color: hsl(120, 100%, 40%);">+ LOGPCS(cs, LOGL_ERROR, "No icc present, but another cmd received\n");</span><br><span style="color: hsl(120, 100%, 40%);">+ /* FIXME: ABORT logic as per section 5.3.1 of CCID Spec v1.1 */</span><br><span style="color: hsl(120, 100%, 40%);">+ resp = gen_err_resp(ch->bMessageType, ch->bSlot, get_icc_status(cs), ch->bSeq,</span><br><span style="color: hsl(120, 100%, 40%);">+ CCID_ERR_ICC_MUTE);</span><br><span style="color: hsl(120, 100%, 40%);">+ msgb_free(msg);</span><br><span style="color: hsl(120, 100%, 40%);">+ return ccid_send(ci, resp);</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> LOGPCS(cs, LOGL_DEBUG, "Rx CCID(OUT) %s %s\n",</span><br><span> get_value_string(ccid_msg_type_vals, ch->bMessageType), msgb_hexdump(msg));</span><br><span> </span><br><span>diff --git a/ccid_common/ccid_slot_fsm.c b/ccid_common/ccid_slot_fsm.c</span><br><span>index 8d38f29..d2aec26 100644</span><br><span>--- a/ccid_common/ccid_slot_fsm.c</span><br><span>+++ b/ccid_common/ccid_slot_fsm.c</span><br><span>@@ -179,9 +179,6 @@</span><br><span> struct iso_fsm_slot *ss = ccid_slot2iso_fsm_slot(cs);</span><br><span> struct msgb *tpdu;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- if(!cs->icc_present)</span><br><span style="color: hsl(0, 100%, 40%);">- return -CCID_ERR_ICC_MUTE;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> ss->seq = xfb->hdr.bSeq;</span><br><span> </span><br><span> /* must be '0' for TPDU level exchanges or for short APDU */</span><br><span>diff --git a/ccid_common/iso7816_fsm.c b/ccid_common/iso7816_fsm.c</span><br><span>index 585d25d..034a7ac 100644</span><br><span>--- a/ccid_common/iso7816_fsm.c</span><br><span>+++ b/ccid_common/iso7816_fsm.c</span><br><span>@@ -293,6 +293,7 @@</span><br><span> ip->user_cb(fi, event, 0, atr);</span><br><span> break;</span><br><span> case ISO7816_E_ATR_ERR_IND:</span><br><span style="color: hsl(120, 100%, 40%);">+ atr = data;</span><br><span> osmo_fsm_inst_state_chg(fi, ISO7816_S_RESET, 0, 0);</span><br><span> ip->user_cb(fi, event, 0, atr);</span><br><span> break;</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-ccid-firmware/+/16244">change 16244</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/c/osmo-ccid-firmware/+/16244"/><meta itemprop="name" content="View Change"/></div></div>
<div style="display:none"> Gerrit-Project: osmo-ccid-firmware </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I9983c2f58c7f420a0132d186f344ace1de616ba1 </div>
<div style="display:none"> Gerrit-Change-Number: 16244 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Hoernchen <ewild@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>