Fixing:
- some few logic errors in conditions
- memory leak

Signed-off-by: Christophe Ricard <[email protected]>
---
 include/net/nfc/nci_core.h |  6 ++++--
 net/nfc/nci/core.c         | 12 ++++++------
 net/nfc/nci/ntf.c          |  9 ++++++---
 net/nfc/nci/rsp.c          |  9 ++++++---
 4 files changed, 22 insertions(+), 14 deletions(-)

diff --git a/include/net/nfc/nci_core.h b/include/net/nfc/nci_core.h
index 8e948f0..c49688c 100644
--- a/include/net/nfc/nci_core.h
+++ b/include/net/nfc/nci_core.h
@@ -330,8 +330,10 @@ static inline void *nci_get_drvdata(struct nci_dev *ndev)
 
 void nci_rsp_packet(struct nci_dev *ndev, struct sk_buff *skb);
 void nci_ntf_packet(struct nci_dev *ndev, struct sk_buff *skb);
-int nci_prop_rsp_packet(struct nci_dev *ndev, struct sk_buff *skb);
-int nci_prop_ntf_packet(struct nci_dev *ndev, struct sk_buff *skb);
+int nci_prop_rsp_packet(struct nci_dev *ndev, __u16 opcode,
+                       struct sk_buff *skb);
+int nci_prop_ntf_packet(struct nci_dev *ndev, __u16 opcode,
+                       struct sk_buff *skb);
 void nci_rx_data_packet(struct nci_dev *ndev, struct sk_buff *skb);
 int nci_send_cmd(struct nci_dev *ndev, __u16 opcode, __u8 plen, void *payload);
 int nci_send_data(struct nci_dev *ndev, __u8 conn_id, struct sk_buff *skb);
diff --git a/net/nfc/nci/core.c b/net/nfc/nci/core.c
index 31ac86b..56d57c9 100644
--- a/net/nfc/nci/core.c
+++ b/net/nfc/nci/core.c
@@ -1193,25 +1193,25 @@ static struct nci_prop_ops *prop_cmd_lookup(struct 
nci_dev *ndev,
        return NULL;
 }
 
-int nci_prop_rsp_packet(struct nci_dev *ndev, struct sk_buff *skb)
+int nci_prop_rsp_packet(struct nci_dev *ndev, __u16 rsp_opcode,
+                       struct sk_buff *skb)
 {
-       __u16 rsp_opcode = nci_opcode(skb->data);
        struct nci_prop_ops *prop_op;
 
        prop_op = prop_cmd_lookup(ndev, rsp_opcode);
-       if (!prop_op || prop_op->rsp)
+       if (!prop_op || !prop_op->rsp)
                return -ENOTSUPP;
 
        return prop_op->rsp(ndev, skb);
 }
 
-int nci_prop_ntf_packet(struct nci_dev *ndev, struct sk_buff *skb)
+int nci_prop_ntf_packet(struct nci_dev *ndev, __u16 ntf_opcode,
+                       struct sk_buff *skb)
 {
-       __u16 ntf_opcode = nci_opcode(skb->data);
        struct nci_prop_ops *prop_op;
 
        prop_op = prop_cmd_lookup(ndev, ntf_opcode);
-       if (!prop_op || prop_op->ntf)
+       if (!prop_op || !prop_op->ntf)
                return -ENOTSUPP;
 
        return prop_op->ntf(ndev, skb);
diff --git a/net/nfc/nci/ntf.c b/net/nfc/nci/ntf.c
index 5ae8c29..5d1c2e3 100644
--- a/net/nfc/nci/ntf.c
+++ b/net/nfc/nci/ntf.c
@@ -758,13 +758,15 @@ void nci_ntf_packet(struct nci_dev *ndev, struct sk_buff 
*skb)
        /* strip the nci control header */
        skb_pull(skb, NCI_CTRL_HDR_SIZE);
 
-       if (nci_opcode_gid(ntf_opcode) == NCI_GID_PROPRIETARY)
-               if (nci_prop_ntf_packet(ndev, skb)) {
+       if (nci_opcode_gid(ntf_opcode) == NCI_GID_PROPRIETARY) {
+               if (nci_prop_ntf_packet(ndev, ntf_opcode, skb)) {
                        pr_err("unsupported ntf opcode 0x%x\n",
                               ntf_opcode);
-                       return;
                }
 
+               goto end;
+       }
+
        switch (ntf_opcode) {
        case NCI_OP_CORE_CONN_CREDITS_NTF:
                nci_core_conn_credits_ntf_packet(ndev, skb);
@@ -803,5 +805,6 @@ void nci_ntf_packet(struct nci_dev *ndev, struct sk_buff 
*skb)
                break;
        }
 
+end:
        kfree_skb(skb);
 }
diff --git a/net/nfc/nci/rsp.c b/net/nfc/nci/rsp.c
index d6e7991..408bd8f 100644
--- a/net/nfc/nci/rsp.c
+++ b/net/nfc/nci/rsp.c
@@ -296,13 +296,15 @@ void nci_rsp_packet(struct nci_dev *ndev, struct sk_buff 
*skb)
        /* strip the nci control header */
        skb_pull(skb, NCI_CTRL_HDR_SIZE);
 
-       if (nci_opcode_gid(rsp_opcode) == NCI_GID_PROPRIETARY)
-               if (nci_prop_rsp_packet(ndev, skb)) {
+       if (nci_opcode_gid(rsp_opcode) == NCI_GID_PROPRIETARY) {
+               if (nci_prop_rsp_packet(ndev, rsp_opcode, skb) == -ENOTSUPP) {
                        pr_err("unsupported rsp opcode 0x%x\n",
                               rsp_opcode);
-                       return;
                }
 
+               goto end;
+       }
+
        switch (rsp_opcode) {
        case NCI_OP_CORE_RESET_RSP:
                nci_core_reset_rsp_packet(ndev, skb);
@@ -353,6 +355,7 @@ void nci_rsp_packet(struct nci_dev *ndev, struct sk_buff 
*skb)
                break;
        }
 
+end:
        kfree_skb(skb);
 
        /* trigger the next cmd */
-- 
2.1.4

--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to