<p>Hoernchen has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-ccid-firmware/+/16282">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">better ccid error handling, fix buffer leaks<br><br>Change-Id: Ib8b8524809e12608a7ade79ce7d7c3ced16eeb57<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/82/16282/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 11edd3e..b14f194 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 623193f..3778dcc 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/+/16282">change 16282</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/+/16282"/><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: Ib8b8524809e12608a7ade79ce7d7c3ced16eeb57 </div>
<div style="display:none"> Gerrit-Change-Number: 16282 </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>