|
@@ -1248,10 +1248,18 @@ static int l2cap_sock_setsockopt(struct socket *sock, int level, int optname, ch
|
|
|
if (level == SOL_L2CAP)
|
|
|
return l2cap_sock_setsockopt_old(sock, optname, optval, optlen);
|
|
|
|
|
|
+ if (level != SOL_BLUETOOTH)
|
|
|
+ return -ENOPROTOOPT;
|
|
|
+
|
|
|
lock_sock(sk);
|
|
|
|
|
|
switch (optname) {
|
|
|
case BT_SECURITY:
|
|
|
+ if (sk->sk_type != SOCK_SEQPACKET) {
|
|
|
+ err = -EINVAL;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
sec.level = BT_SECURITY_LOW;
|
|
|
|
|
|
len = min_t(unsigned int, sizeof(sec), optlen);
|
|
@@ -1384,6 +1392,9 @@ static int l2cap_sock_getsockopt(struct socket *sock, int level, int optname, ch
|
|
|
if (level == SOL_L2CAP)
|
|
|
return l2cap_sock_getsockopt_old(sock, optname, optval, optlen);
|
|
|
|
|
|
+ if (level != SOL_BLUETOOTH)
|
|
|
+ return -ENOPROTOOPT;
|
|
|
+
|
|
|
if (get_user(len, optlen))
|
|
|
return -EFAULT;
|
|
|
|
|
@@ -1391,6 +1402,11 @@ static int l2cap_sock_getsockopt(struct socket *sock, int level, int optname, ch
|
|
|
|
|
|
switch (optname) {
|
|
|
case BT_SECURITY:
|
|
|
+ if (sk->sk_type != SOCK_SEQPACKET) {
|
|
|
+ err = -EINVAL;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
sec.level = l2cap_pi(sk)->sec_level;
|
|
|
|
|
|
len = min_t(unsigned int, len, sizeof(sec));
|