diff options
author | George Chang <georgekgchang@google.com> | 2024-06-10 10:00:07 +0000 |
---|---|---|
committer | George Chang <georgekgchang@google.com> | 2024-06-10 10:09:52 +0000 |
commit | feb9984e26492962dff65713d74dbdad9df51461 (patch) | |
tree | d773f9344c943d0960c17e2c5577a7028610f7ae /src/nfc/nfc/nfc_ncif.cc | |
parent | 02be125f7d650595fb5744da42c25727e21c5065 (diff) | |
download | nfc-master.tar.gz |
Fix NCI_DISCOVERY_TYPE_POLL_F case in nfc_ncif_decode_rf_params()
following aosp/3061685 update
Bug: 345667453
Bug: 335639730
Test: R/W T3T
Change-Id: I186d8697c462ac26ac5514988371d980f9645ee3
Diffstat (limited to 'src/nfc/nfc/nfc_ncif.cc')
-rw-r--r-- | src/nfc/nfc/nfc_ncif.cc | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/src/nfc/nfc/nfc_ncif.cc b/src/nfc/nfc/nfc_ncif.cc index a85f0516..9dabe09b 100644 --- a/src/nfc/nfc/nfc_ncif.cc +++ b/src/nfc/nfc/nfc_ncif.cc @@ -759,6 +759,37 @@ Available after Technology Detection STREAM_TO_ARRAY(p_pb->sensb_res, p, p_pb->sensb_res_len); memcpy(p_pb->nfcid0, p_pb->sensb_res, NFC_NFCID0_MAX_LEN); p_pb->fwi = p_pb->sensb_res[10] >> 4; + } else if (NCI_DISCOVERY_TYPE_POLL_F == p_param->mode) { + /* +Bit Rate 1 byte 1 212 kbps/2 424 kbps/0 and 3 to 255 RFU +SENSF_RES Response length.(n) 1 byte Length of SENSF_RES (Byte 2 - Byte 17 or +19).Available after Technology Detection +SENSF_RES Response Byte 2 - Byte 17 or 19 n bytes Defined in [DIGPROT] +Available after Technology Detection + */ + p_pf = &p_param->param.pf; + + if (plen < 2) { + goto invalid_packet; + } + plen -= 2; + p_pf->bit_rate = *p++; + p_pf->sensf_res_len = *p++; + if (p_pf->sensf_res_len > NCI_MAX_SENSF_RES_LEN) + p_pf->sensf_res_len = NCI_MAX_SENSF_RES_LEN; + + if (plen < p_pf->sensf_res_len) { + goto invalid_packet; + } + plen -= p_pf->sensf_res_len; + STREAM_TO_ARRAY(p_pf->sensf_res, p, p_pf->sensf_res_len); + + if (p_pf->sensf_res_len < NCI_MRTI_UPDATE_INDEX + 1) { + goto invalid_packet; + } + memcpy(p_pf->nfcid2, p_pf->sensf_res, NCI_NFCID2_LEN); + p_pf->mrti_check = p_pf->sensf_res[NCI_MRTI_CHECK_INDEX]; + p_pf->mrti_update = p_pf->sensf_res[NCI_MRTI_UPDATE_INDEX]; } else if (NCI_DISCOVERY_TYPE_LISTEN_F == p_param->mode) { p_lf = &p_param->param.lf; |