git.openpandora.org
/
pandora-kernel.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
l2tp: Correctly return -EBADF from pppol2tp_getname.
[pandora-kernel.git]
/
net
/
l2tp
/
l2tp_ppp.c
diff --git
a/net/l2tp/l2tp_ppp.c
b/net/l2tp/l2tp_ppp.c
index
8a90d75
..
0417743
100644
(file)
--- a/
net/l2tp/l2tp_ppp.c
+++ b/
net/l2tp/l2tp_ppp.c
@@
-200,8
+200,6
@@
static int pppol2tp_recvmsg(struct kiocb *iocb, struct socket *sock,
if (sk->sk_state & PPPOX_BOUND)
goto end;
if (sk->sk_state & PPPOX_BOUND)
goto end;
- msg->msg_namelen = 0;
-
err = 0;
skb = skb_recv_datagram(sk, flags & ~MSG_DONTWAIT,
flags & MSG_DONTWAIT, &err);
err = 0;
skb = skb_recv_datagram(sk, flags & ~MSG_DONTWAIT,
flags & MSG_DONTWAIT, &err);
@@
-350,18
+348,21
@@
static int pppol2tp_sendmsg(struct kiocb *iocb, struct socket *sock, struct msgh
skb_put(skb, 2);
/* Copy user data into skb */
skb_put(skb, 2);
/* Copy user data into skb */
- error = memcpy_fromiovec(skb->data, m->msg_iov, total_len);
+ error = memcpy_fromiovec(skb_put(skb, total_len), m->msg_iov,
+ total_len);
if (error < 0) {
kfree_skb(skb);
goto error_put_sess_tun;
}
if (error < 0) {
kfree_skb(skb);
goto error_put_sess_tun;
}
- skb_put(skb, total_len);
+ local_bh_disable();
l2tp_xmit_skb(session, skb, session->hdr_len);
l2tp_xmit_skb(session, skb, session->hdr_len);
+ local_bh_enable();
sock_put(ps->tunnel_sock);
sock_put(ps->tunnel_sock);
+ sock_put(sk);
- return
error
;
+ return
total_len
;
error_put_sess_tun:
sock_put(ps->tunnel_sock);
error_put_sess_tun:
sock_put(ps->tunnel_sock);
@@
-431,7
+432,9
@@
static int pppol2tp_xmit(struct ppp_channel *chan, struct sk_buff *skb)
skb->data[0] = ppph[0];
skb->data[1] = ppph[1];
skb->data[0] = ppph[0];
skb->data[1] = ppph[1];
+ local_bh_disable();
l2tp_xmit_skb(session, skb, session->hdr_len);
l2tp_xmit_skb(session, skb, session->hdr_len);
+ local_bh_enable();
sock_put(sk_tun);
sock_put(sk);
sock_put(sk_tun);
sock_put(sk);
@@
-769,9
+772,10
@@
static int pppol2tp_connect(struct socket *sock, struct sockaddr *uservaddr,
session->deref = pppol2tp_session_sock_put;
/* If PMTU discovery was enabled, use the MTU that was discovered */
session->deref = pppol2tp_session_sock_put;
/* If PMTU discovery was enabled, use the MTU that was discovered */
- dst = sk_dst_get(
s
k);
+ dst = sk_dst_get(
tunnel->soc
k);
if (dst != NULL) {
if (dst != NULL) {
- u32 pmtu = dst_mtu(__sk_dst_get(sk));
+ u32 pmtu = dst_mtu(dst);
+
if (pmtu != 0)
session->mtu = session->mru = pmtu -
PPPOL2TP_HEADER_OVERHEAD;
if (pmtu != 0)
session->mtu = session->mru = pmtu -
PPPOL2TP_HEADER_OVERHEAD;
@@
-910,12
+914,10
@@
static int pppol2tp_getname(struct socket *sock, struct sockaddr *uaddr,
pls = l2tp_session_priv(session);
tunnel = l2tp_sock_to_tunnel(pls->tunnel_sock);
pls = l2tp_session_priv(session);
tunnel = l2tp_sock_to_tunnel(pls->tunnel_sock);
- if (tunnel == NULL) {
- error = -EBADF;
+ if (tunnel == NULL)
goto end_put_sess;
goto end_put_sess;
- }
- inet = inet_sk(
s
k);
+ inet = inet_sk(
tunnel->soc
k);
if (tunnel->version == 2) {
struct sockaddr_pppol2tp sp;
len = sizeof(sp);
if (tunnel->version == 2) {
struct sockaddr_pppol2tp sp;
len = sizeof(sp);
@@
-951,12
+953,11
@@
static int pppol2tp_getname(struct socket *sock, struct sockaddr *uaddr,
}
*usockaddr_len = len;
}
*usockaddr_len = len;
+ error = 0;
sock_put(pls->tunnel_sock);
end_put_sess:
sock_put(sk);
sock_put(pls->tunnel_sock);
end_put_sess:
sock_put(sk);
- error = 0;
-
end:
return error;
}
end:
return error;
}
@@
-1348,7
+1349,7
@@
static int pppol2tp_setsockopt(struct socket *sock, int level, int optname,
int err;
if (level != SOL_PPPOL2TP)
int err;
if (level != SOL_PPPOL2TP)
- return
udp_prot.setsockopt(sk, level, optname, optval, optlen)
;
+ return
-EINVAL
;
if (optlen < sizeof(int))
return -EINVAL;
if (optlen < sizeof(int))
return -EINVAL;
@@
-1474,7
+1475,7
@@
static int pppol2tp_getsockopt(struct socket *sock, int level,
struct pppol2tp_session *ps;
if (level != SOL_PPPOL2TP)
struct pppol2tp_session *ps;
if (level != SOL_PPPOL2TP)
- return
udp_prot.getsockopt(sk, level, optname, optval, optlen)
;
+ return
-EINVAL
;
if (get_user(len, (int __user *) optlen))
return -EFAULT;
if (get_user(len, (int __user *) optlen))
return -EFAULT;
@@
-1777,7
+1778,8
@@
static const struct proto_ops pppol2tp_ops = {
static const struct pppox_proto pppol2tp_proto = {
.create = pppol2tp_create,
static const struct pppox_proto pppol2tp_proto = {
.create = pppol2tp_create,
- .ioctl = pppol2tp_ioctl
+ .ioctl = pppol2tp_ioctl,
+ .owner = THIS_MODULE,
};
#ifdef CONFIG_L2TP_V3
};
#ifdef CONFIG_L2TP_V3