• Al Viro's avatar
    [BLUETOOTH]: Fix endianness bug in l2cap_sock_listen() · 6dc0c208
    Al Viro authored
    We loop through psm values, calling __l2cap_get_sock_by_addr(psm, ...)
    until we get NULL; then we set ->psm of our socket to htobs(psm).
    IOW, we find unused psm value and put it into our socket.  So far, so
    good, but...  __l2cap_get_sock_by_addr() compares its argument with
    ->psm of sockets.  IOW, the entire thing works correctly only on
    little-endian.  On big-endian we'll get "no socket with such psm"
    on the first iteration, since we won't find a socket with ->psm == 0x1001.
    We will happily conclude that 0x1001 is unused and slap htobs(0x1001)
    (i.e. 0x110) into ->psm of our socket.  Of course, the next time around
    the same thing will repeat and we'll just get a fsckload of sockets
    with the same ->psm assigned.
    
    Fix: pass htobs(psm) to __l2cap_get_sock_by_addr() there.  All other
    callers are already passing little-endian values and all places that
    store something in ->psm are storing little-endian.
    Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
    Signed-off-by: default avatarMarcel Holtmann <marcel@holtmann.org>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    6dc0c208
l2cap.c 49.3 KB