Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0b23d666 authored by Olivier Guiter's avatar Olivier Guiter Committed by Samuel Ortiz
Browse files

NFC: llcp: Fix zero octets length SDU handling



LLCP Validation test #2 (Connection-less information transfer) send a
service data unit of zero octets length. This is now handled correctly.

Signed-off-by: default avatarOlivier Guiter <olivier.guiter@linux.intel.com>
Signed-off-by: default avatarSamuel Ortiz <sameo@linux.intel.com>
parent 00e856db
Loading
Loading
Loading
Loading
+8 −8
Original line number Diff line number Diff line
@@ -694,8 +694,7 @@ int nfc_llcp_send_i_frame(struct nfc_llcp_sock *sock,
	remaining_len = len;
	msg_ptr = msg_data;

	while (remaining_len > 0) {

	do {
		frag_len = min_t(size_t, sock->remote_miu, remaining_len);

		pr_debug("Fragment %zd bytes remaining %zd",
@@ -708,6 +707,7 @@ int nfc_llcp_send_i_frame(struct nfc_llcp_sock *sock,

		skb_put(pdu, LLCP_SEQUENCE_SIZE);

		if (likely(frag_len > 0))
			memcpy(skb_put(pdu, frag_len), msg_ptr, frag_len);

		skb_queue_tail(&sock->tx_queue, pdu);
@@ -720,7 +720,7 @@ int nfc_llcp_send_i_frame(struct nfc_llcp_sock *sock,

		remaining_len -= frag_len;
		msg_ptr += frag_len;
	}
	} while (remaining_len > 0);

	kfree(msg_data);

@@ -754,8 +754,7 @@ int nfc_llcp_send_ui_frame(struct nfc_llcp_sock *sock, u8 ssap, u8 dsap,
	remaining_len = len;
	msg_ptr = msg_data;

	while (remaining_len > 0) {

	do {
		frag_len = min_t(size_t, sock->remote_miu, remaining_len);

		pr_debug("Fragment %zd bytes remaining %zd",
@@ -770,6 +769,7 @@ int nfc_llcp_send_ui_frame(struct nfc_llcp_sock *sock, u8 ssap, u8 dsap,

		pdu = llcp_add_header(pdu, dsap, ssap, LLCP_PDU_UI);

		if (likely(frag_len > 0))
			memcpy(skb_put(pdu, frag_len), msg_ptr, frag_len);

		/* No need to check for the peer RW for UI frames */
@@ -777,7 +777,7 @@ int nfc_llcp_send_ui_frame(struct nfc_llcp_sock *sock, u8 ssap, u8 dsap,

		remaining_len -= frag_len;
		msg_ptr += frag_len;
	}
	} while (remaining_len > 0);

	kfree(msg_data);