Bluetooth: Always use l2cap_chan->psm for returning PSM to user space
authorJohan Hedberg <johan.hedberg@intel.com>
Tue, 28 Jan 2014 23:16:51 +0000 (15:16 -0800)
committerJohan Hedberg <johan.hedberg@intel.com>
Thu, 13 Feb 2014 07:51:39 +0000 (09:51 +0200)
The l2cap_chan->psm value is always set to a valid value for a
connection oriented channel. The l2cap_chan->sport is used for tracking
local PSM allocations but will not always have a proper value, such as
with connected sockets derived from a listening socket. This patch fixes
the sock_getname callback to always use chan->psm when returning address
information.

Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
net/bluetooth/l2cap_sock.c

index b0aaa651a5ba5042cb7647f4eadbcb2c10f0e7af..27d3d6d48b6e8e726f1ed88ed78cb809d16cc51f 100644 (file)
@@ -373,13 +373,13 @@ static int l2cap_sock_getname(struct socket *sock, struct sockaddr *addr,
        addr->sa_family = AF_BLUETOOTH;
        *len = sizeof(struct sockaddr_l2);
 
+       la->l2_psm = chan->psm;
+
        if (peer) {
-               la->l2_psm = chan->psm;
                bacpy(&la->l2_bdaddr, &chan->dst);
                la->l2_cid = cpu_to_le16(chan->dcid);
                la->l2_bdaddr_type = chan->dst_type;
        } else {
-               la->l2_psm = chan->sport;
                bacpy(&la->l2_bdaddr, &chan->src);
                la->l2_cid = cpu_to_le16(chan->scid);
                la->l2_bdaddr_type = chan->src_type;