Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

NFC: digital: Fix sens_res endiannes handling

This was triggered by the following sparse warning:

net/nfc/digital_technology.c:272:20: sparse: cast to restricted __be16

The SENS_RES response must be treated as __le16 with the first byte
received as LSB and the second one as MSB. This is the way neard
handles it in the sens_res field of the nfc_target structure which is
treated as u16 in cpu endianness. So le16_to_cpu() is used on the
received SENS_RES instead of memcpy'ing it.

SENS_RES test macros have also been fixed accordingly.

Signed-off-by: Thierry Escande <thierry.escande@linux.intel.com>
Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>

authored by

Thierry Escande and committed by
Samuel Ortiz
13292c9a 4cf7e032

+6 -9
+6 -9
net/nfc/digital_technology.c
··· 32 32 #define DIGITAL_SEL_RES_IS_T2T(sel_res) (!((sel_res) & 0x60)) 33 33 #define DIGITAL_SEL_RES_IS_NFC_DEP(sel_res) ((sel_res) & 0x40) 34 34 35 - #define DIGITAL_SENS_RES_IS_T1T(sens_res) (((sens_res) & 0x000C) == 0x000C) 35 + #define DIGITAL_SENS_RES_IS_T1T(sens_res) (((sens_res) & 0x0C00) == 0x0C00) 36 36 #define DIGITAL_SENS_RES_IS_VALID(sens_res) \ 37 - ((!((sens_res) & 0x1F00) && (((sens_res) & 0x000C) == 0x000C)) || \ 38 - (((sens_res) & 0x1F00) && ((sens_res) & 0x000C) != 0x000C)) 37 + ((!((sens_res) & 0x001F) && (((sens_res) & 0x0C00) == 0x0C00)) || \ 38 + (((sens_res) & 0x001F) && ((sens_res) & 0x0C00) != 0x0C00)) 39 39 40 40 #define DIGITAL_MIFARE_READ_RES_LEN 16 41 41 #define DIGITAL_MIFARE_ACK_RES 0x0A ··· 280 280 struct sk_buff *resp) 281 281 { 282 282 struct nfc_target *target = NULL; 283 - u16 sens_res; 284 283 int rc; 285 284 286 285 if (IS_ERR(resp)) { ··· 299 300 goto exit; 300 301 } 301 302 302 - memcpy(&target->sens_res, resp->data, sizeof(u16)); 303 + target->sens_res = __le16_to_cpu(*(__le16 *)resp->data); 303 304 304 - sens_res = be16_to_cpu(target->sens_res); 305 - 306 - if (!DIGITAL_SENS_RES_IS_VALID(sens_res)) { 305 + if (!DIGITAL_SENS_RES_IS_VALID(target->sens_res)) { 307 306 PROTOCOL_ERR("4.6.3.3"); 308 307 rc = -EINVAL; 309 308 goto exit; 310 309 } 311 310 312 - if (DIGITAL_SENS_RES_IS_T1T(sens_res)) 311 + if (DIGITAL_SENS_RES_IS_T1T(target->sens_res)) 313 312 rc = digital_target_found(ddev, target, NFC_PROTO_JEWEL); 314 313 else 315 314 rc = digital_in_send_sdd_req(ddev, target);