Skip to content

Commit fe0a33a

Browse files
committed
Band-aid fix to strip erroneous length byte and CRC from client payload when sending FeliCa frames
1 parent c16f3f4 commit fe0a33a

File tree

1 file changed

+21
-2
lines changed

1 file changed

+21
-2
lines changed

client/src/cmdhffelica.c

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -468,11 +468,30 @@ static int CmdHFFelicaInfo(const char *Cmd) {
468468
*/
469469
static void clear_and_send_command(uint8_t flags, uint16_t datalen, uint8_t *data, bool verbose) {
470470
uint16_t numbits = 0;
471+
uint16_t payload_len = 0;
472+
uint8_t *payload = data;
473+
474+
// ARMSRC implementation adds FeliCa preamble and length automatically (felica_sendraw:575-576)
475+
// A bunch of code in this module adds length byte at data[0] regardless of that, which is wrong
476+
// This is a workaround to extract the actual payload correctly so that length byte isn't repeated
477+
// It also strips CRC if present, as ARMSRC adds it too
478+
if (data && datalen) {
479+
if (datalen >= data[0] && data[0] > 0) {
480+
payload_len = data[0] - 1;
481+
if (payload_len > datalen - 1) {
482+
payload_len = datalen - 1;
483+
}
484+
payload = data + 1;
485+
} else {
486+
payload_len = datalen;
487+
}
488+
}
489+
471490
clearCommandBuffer();
472491
if (verbose) {
473-
PrintAndLogEx(INFO, "Send raw command - Frame: %s", sprint_hex(data, datalen));
492+
PrintAndLogEx(INFO, "Send raw command - Frame: %s", sprint_hex(payload, payload_len));
474493
}
475-
SendCommandMIX(CMD_HF_FELICA_COMMAND, flags, (datalen & 0xFFFF) | (uint32_t)(numbits << 16), 0, data, datalen);
494+
SendCommandMIX(CMD_HF_FELICA_COMMAND, flags, (payload_len & 0xFFFF) | (uint32_t)(numbits << 16), 0, payload, payload_len);
476495
}
477496

478497
/**

0 commit comments

Comments
 (0)