diff options
author | Marcel Holtmann <marcel@holtmann.org> | 2007-05-04 18:35:59 -0400 |
---|---|---|
committer | Marcel Holtmann <marcel@holtmann.org> | 2007-05-04 18:35:59 -0400 |
commit | 0878b6667f28772aa7d6b735abff53efc7bf6d91 (patch) | |
tree | 5a1dbfb35f679335fbec4cbd17dfe64926db7750 /net/bluetooth/l2cap.c | |
parent | dc87c3985e9b442c60994308a96f887579addc39 (diff) |
[Bluetooth] Fix L2CAP and HCI setsockopt() information leaks
The L2CAP and HCI setsockopt() implementations have a small information
leak that makes it possible to leak kernel stack memory to userspace.
If the optlen parameter is 0, no data will be copied by copy_from_user(),
but the uninitialized stack buffer will be read and stored later. A call
to getsockopt() can now retrieve the leaked information.
To fix this problem the stack buffer given to copy_from_user() must be
initialized with the current settings.
Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
Diffstat (limited to 'net/bluetooth/l2cap.c')
-rw-r--r-- | net/bluetooth/l2cap.c | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/net/bluetooth/l2cap.c b/net/bluetooth/l2cap.c index a5867879b615..a59b1fb63b76 100644 --- a/net/bluetooth/l2cap.c +++ b/net/bluetooth/l2cap.c | |||
@@ -954,11 +954,17 @@ static int l2cap_sock_setsockopt(struct socket *sock, int level, int optname, ch | |||
954 | 954 | ||
955 | switch (optname) { | 955 | switch (optname) { |
956 | case L2CAP_OPTIONS: | 956 | case L2CAP_OPTIONS: |
957 | opts.imtu = l2cap_pi(sk)->imtu; | ||
958 | opts.omtu = l2cap_pi(sk)->omtu; | ||
959 | opts.flush_to = l2cap_pi(sk)->flush_to; | ||
960 | opts.mode = 0x00; | ||
961 | |||
957 | len = min_t(unsigned int, sizeof(opts), optlen); | 962 | len = min_t(unsigned int, sizeof(opts), optlen); |
958 | if (copy_from_user((char *) &opts, optval, len)) { | 963 | if (copy_from_user((char *) &opts, optval, len)) { |
959 | err = -EFAULT; | 964 | err = -EFAULT; |
960 | break; | 965 | break; |
961 | } | 966 | } |
967 | |||
962 | l2cap_pi(sk)->imtu = opts.imtu; | 968 | l2cap_pi(sk)->imtu = opts.imtu; |
963 | l2cap_pi(sk)->omtu = opts.omtu; | 969 | l2cap_pi(sk)->omtu = opts.omtu; |
964 | break; | 970 | break; |