|
|
@@ -484,6 +484,7 @@ static int raw_getfrag(void *from, char *to, int offset, int len, int odd,
|
|
|
static int raw_sendmsg(struct sock *sk, struct msghdr *msg, size_t len)
|
|
|
{
|
|
|
struct inet_sock *inet = inet_sk(sk);
|
|
|
+ struct net *net = sock_net(sk);
|
|
|
struct ipcm_cookie ipc;
|
|
|
struct rtable *rt = NULL;
|
|
|
struct flowi4 fl4;
|
|
|
@@ -543,7 +544,7 @@ static int raw_sendmsg(struct sock *sk, struct msghdr *msg, size_t len)
|
|
|
ipc.oif = sk->sk_bound_dev_if;
|
|
|
|
|
|
if (msg->msg_controllen) {
|
|
|
- err = ip_cmsg_send(sock_net(sk), msg, &ipc, false);
|
|
|
+ err = ip_cmsg_send(net, msg, &ipc, false);
|
|
|
if (err)
|
|
|
goto out;
|
|
|
if (ipc.opt)
|
|
|
@@ -598,6 +599,9 @@ static int raw_sendmsg(struct sock *sk, struct msghdr *msg, size_t len)
|
|
|
(inet->hdrincl ? FLOWI_FLAG_KNOWN_NH : 0),
|
|
|
daddr, saddr, 0, 0);
|
|
|
|
|
|
+ if (!saddr && ipc.oif)
|
|
|
+ l3mdev_get_saddr(net, ipc.oif, &fl4);
|
|
|
+
|
|
|
if (!inet->hdrincl) {
|
|
|
rfv.msg = msg;
|
|
|
rfv.hlen = 0;
|
|
|
@@ -608,7 +612,7 @@ static int raw_sendmsg(struct sock *sk, struct msghdr *msg, size_t len)
|
|
|
}
|
|
|
|
|
|
security_sk_classify_flow(sk, flowi4_to_flowi(&fl4));
|
|
|
- rt = ip_route_output_flow(sock_net(sk), &fl4, sk);
|
|
|
+ rt = ip_route_output_flow(net, &fl4, sk);
|
|
|
if (IS_ERR(rt)) {
|
|
|
err = PTR_ERR(rt);
|
|
|
rt = NULL;
|