diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2023-05-12 07:59:08 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2023-05-12 07:59:08 -0500 |
commit | 47a2ee5d4a0bda05decdda7be0a77e792cdb09a3 (patch) | |
tree | 01799563e6d3c3ccc571a11cc2411a4997390f4d | |
parent | cc3c44c9fda264c6d401be04e95449a57c1231c6 (diff) | |
parent | f7dcc5e33c1e4b0d278a30f7d2f0c9a63d7b40ca (diff) | |
download | lwn-47a2ee5d4a0bda05decdda7be0a77e792cdb09a3.tar.gz lwn-47a2ee5d4a0bda05decdda7be0a77e792cdb09a3.zip |
Merge tag 'firewire-fixes-6.4-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/ieee1394/linux1394
Pull firewire fix from Takashi Sakamoto:
- fix early release of request packet
* tag 'firewire-fixes-6.4-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/ieee1394/linux1394:
firewire: net: fix unexpected release of object for asynchronous request packet
-rw-r--r-- | drivers/firewire/net.c | 21 |
1 files changed, 11 insertions, 10 deletions
diff --git a/drivers/firewire/net.c b/drivers/firewire/net.c index af22be84034b..538bd677c254 100644 --- a/drivers/firewire/net.c +++ b/drivers/firewire/net.c @@ -706,21 +706,22 @@ static void fwnet_receive_packet(struct fw_card *card, struct fw_request *r, int rcode; if (destination == IEEE1394_ALL_NODES) { - kfree(r); - - return; - } - - if (offset != dev->handler.offset) + // Although the response to the broadcast packet is not necessarily required, the + // fw_send_response() function should still be called to maintain the reference + // counting of the object. In the case, the call of function just releases the + // object as a result to decrease the reference counting. + rcode = RCODE_COMPLETE; + } else if (offset != dev->handler.offset) { rcode = RCODE_ADDRESS_ERROR; - else if (tcode != TCODE_WRITE_BLOCK_REQUEST) + } else if (tcode != TCODE_WRITE_BLOCK_REQUEST) { rcode = RCODE_TYPE_ERROR; - else if (fwnet_incoming_packet(dev, payload, length, - source, generation, false) != 0) { + } else if (fwnet_incoming_packet(dev, payload, length, + source, generation, false) != 0) { dev_err(&dev->netdev->dev, "incoming packet failure\n"); rcode = RCODE_CONFLICT_ERROR; - } else + } else { rcode = RCODE_COMPLETE; + } fw_send_response(card, r, rcode); } |