Merge tag 'for-5.11/io_uring-2020-12-14' of git://git.kernel.dk/linux-block
[linux-2.6-microblaze.git] / net / ipv4 / inet_diag.c
index f1bd95f..93474b1 100644 (file)
@@ -125,6 +125,7 @@ int inet_diag_msg_attrs_fill(struct sock *sk, struct sk_buff *skb,
                             bool net_admin)
 {
        const struct inet_sock *inet = inet_sk(sk);
+       struct inet_diag_sockopt inet_sockopt;
 
        if (nla_put_u8(skb, INET_DIAG_SHUTDOWN, sk->sk_shutdown))
                goto errout;
@@ -180,6 +181,22 @@ int inet_diag_msg_attrs_fill(struct sock *sk, struct sk_buff *skb,
        r->idiag_uid = from_kuid_munged(user_ns, sock_i_uid(sk));
        r->idiag_inode = sock_i_ino(sk);
 
+       memset(&inet_sockopt, 0, sizeof(inet_sockopt));
+       inet_sockopt.recverr    = inet->recverr;
+       inet_sockopt.is_icsk    = inet->is_icsk;
+       inet_sockopt.freebind   = inet->freebind;
+       inet_sockopt.hdrincl    = inet->hdrincl;
+       inet_sockopt.mc_loop    = inet->mc_loop;
+       inet_sockopt.transparent = inet->transparent;
+       inet_sockopt.mc_all     = inet->mc_all;
+       inet_sockopt.nodefrag   = inet->nodefrag;
+       inet_sockopt.bind_address_no_port = inet->bind_address_no_port;
+       inet_sockopt.recverr_rfc4884 = inet->recverr_rfc4884;
+       inet_sockopt.defer_connect = inet->defer_connect;
+       if (nla_put(skb, INET_DIAG_SOCKOPT, sizeof(inet_sockopt),
+                   &inet_sockopt))
+               goto errout;
+
        return 0;
 errout:
        return 1;
@@ -462,8 +479,10 @@ static int inet_req_diag_fill(struct sock *sk, struct sk_buff *skb,
        r->idiag_inode  = 0;
 
        if (net_admin && nla_put_u32(skb, INET_DIAG_MARK,
-                                    inet_rsk(reqsk)->ir_mark))
+                                    inet_rsk(reqsk)->ir_mark)) {
+               nlmsg_cancel(skb, nlh);
                return -EMSGSIZE;
+       }
 
        nlmsg_end(skb, nlh);
        return 0;