git://git.onelab.eu
/
linux-2.6.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
fedora core 6 1.2949 + vserver 2.2.0
[linux-2.6.git]
/
net
/
bluetooth
/
l2cap.c
diff --git
a/net/bluetooth/l2cap.c
b/net/bluetooth/l2cap.c
index
d56f60b
..
f8c25d5
100644
(file)
--- a/
net/bluetooth/l2cap.c
+++ b/
net/bluetooth/l2cap.c
@@
-559,7
+559,7
@@
static int l2cap_sock_create(struct socket *sock, int protocol)
sock->ops = &l2cap_sock_ops;
sock->ops = &l2cap_sock_ops;
- sk = l2cap_sock_alloc(sock, protocol, GFP_
KERNEL
);
+ sk = l2cap_sock_alloc(sock, protocol, GFP_
ATOMIC
);
if (!sk)
return -ENOMEM;
if (!sk)
return -ENOMEM;
@@
-585,6
+585,12
@@
static int l2cap_sock_bind(struct socket *sock, struct sockaddr *addr, int addr_
goto done;
}
goto done;
}
+ if (la->l2_psm > 0 && btohs(la->l2_psm) < 0x1001 &&
+ !capable(CAP_NET_BIND_SERVICE)) {
+ err = -EACCES;
+ goto done;
+ }
+
write_lock_bh(&l2cap_sk_list.lock);
if (la->l2_psm && __l2cap_get_sock_by_addr(la->l2_psm, &la->l2_bdaddr)) {
write_lock_bh(&l2cap_sk_list.lock);
if (la->l2_psm && __l2cap_get_sock_by_addr(la->l2_psm, &la->l2_bdaddr)) {
@@
-770,7
+776,7
@@
static int l2cap_sock_accept(struct socket *sock, struct socket *newsock, int fl
long timeo;
int err = 0;
long timeo;
int err = 0;
- lock_sock
(sk
);
+ lock_sock
_nested(sk, SINGLE_DEPTH_NESTING
);
if (sk->sk_state != BT_LISTEN) {
err = -EBADFD;
if (sk->sk_state != BT_LISTEN) {
err = -EBADFD;
@@
-792,7
+798,7
@@
static int l2cap_sock_accept(struct socket *sock, struct socket *newsock, int fl
release_sock(sk);
timeo = schedule_timeout(timeo);
release_sock(sk);
timeo = schedule_timeout(timeo);
- lock_sock
(sk
);
+ lock_sock
_nested(sk, SINGLE_DEPTH_NESTING
);
if (sk->sk_state != BT_LISTEN) {
err = -EBADFD;
if (sk->sk_state != BT_LISTEN) {
err = -EBADFD;
@@
-1353,12
+1359,12
@@
static inline int l2cap_conf_output(struct sock *sk, void **ptr)
/* Configure output options and let the other side know
* which ones we don't like. */
/* Configure output options and let the other side know
* which ones we don't like. */
- if (pi->conf_mtu < pi->omtu) {
- l2cap_add_conf_opt(ptr, L2CAP_CONF_MTU, 2, pi->omtu);
+ if (pi->conf_mtu < pi->omtu)
result = L2CAP_CONF_UNACCEPT;
result = L2CAP_CONF_UNACCEPT;
- } else {
+ else
pi->omtu = pi->conf_mtu;
pi->omtu = pi->conf_mtu;
- }
+
+ l2cap_add_conf_opt(ptr, L2CAP_CONF_MTU, 2, pi->omtu);
BT_DBG("sk %p result %d", sk, result);
return result;
BT_DBG("sk %p result %d", sk, result);
return result;
@@
-1533,6
+1539,9
@@
static inline int l2cap_config_req(struct l2cap_conn *conn, struct l2cap_cmd_hdr
if (!(sk = l2cap_get_chan_by_scid(&conn->chan_list, dcid)))
return -ENOENT;
if (!(sk = l2cap_get_chan_by_scid(&conn->chan_list, dcid)))
return -ENOENT;
+ if (sk->sk_state == BT_DISCONN)
+ goto unlock;
+
l2cap_parse_conf_req(sk, req->data, cmd->len - sizeof(*req));
if (flags & 0x0001) {
l2cap_parse_conf_req(sk, req->data, cmd->len - sizeof(*req));
if (flags & 0x0001) {
@@
-2147,8
+2156,8
@@
static ssize_t l2cap_sysfs_show(struct class *dev, char *buf)
str += sprintf(str, "%s %s %d %d 0x%4.4x 0x%4.4x %d %d 0x%x\n",
batostr(&bt_sk(sk)->src), batostr(&bt_sk(sk)->dst),
str += sprintf(str, "%s %s %d %d 0x%4.4x 0x%4.4x %d %d 0x%x\n",
batostr(&bt_sk(sk)->src), batostr(&bt_sk(sk)->dst),
- sk->sk_state,
pi->psm, pi->scid, pi->dcid, pi->imtu
,
- pi->omtu, pi->link_mode);
+ sk->sk_state,
btohs(pi->psm), pi->scid, pi->dcid
,
+ pi->
imtu, pi->
omtu, pi->link_mode);
}
read_unlock_bh(&l2cap_sk_list.lock);
}
read_unlock_bh(&l2cap_sk_list.lock);
@@
-2216,7
+2225,8
@@
static int __init l2cap_init(void)
goto error;
}
goto error;
}
- class_create_file(bt_class, &class_attr_l2cap);
+ if (class_create_file(bt_class, &class_attr_l2cap) < 0)
+ BT_ERR("Failed to create L2CAP info file");
BT_INFO("L2CAP ver %s", VERSION);
BT_INFO("L2CAP socket layer initialized");
BT_INFO("L2CAP ver %s", VERSION);
BT_INFO("L2CAP socket layer initialized");