> -----Original Message-----
> From: jma...@redhat.com <jma...@redhat.com>
> Sent: Thursday, March 25, 2021 10:56 PM
> To: tipc-discussion@lists.sourceforge.net
> Cc: Tung Quang Nguyen <tung.q.ngu...@dektech.com.au>; Hoang Huu Le 
> <hoang.h...@dektech.com.au>; Tuong Tong Lien
> <tuong.t.l...@dektech.com.au>; jma...@redhat.com; ma...@donjonn.com; 
> l...@redhat.com; ying....@windriver.com;
> parthasarathy.bhuvara...@gmail.com
> Subject: [net-next 3/4] tipc: refactor function tipc_sk_anc_data_recv()
> 
> From: Jon Maloy <jma...@redhat.com>
> 
> We refactor tipc_sk_anc_data_recv() to make it slighltly more
> comprehensible, but also to facilitate application of some additions
> to the code in a future commit.
> 
> Signed-off-by: Jon Maloy <jma...@redhat.com>
> ---
>  net/tipc/socket.c | 85 +++++++++++++++++++++--------------------------
>  1 file changed, 38 insertions(+), 47 deletions(-)
> 
> diff --git a/net/tipc/socket.c b/net/tipc/socket.c
> index 12a97755bc80..358d1f2494a7 100644
> --- a/net/tipc/socket.c
> +++ b/net/tipc/socket.c
> @@ -1730,67 +1730,58 @@ static void tipc_sk_set_orig_addr(struct msghdr *m, 
> struct sk_buff *skb)
>  static int tipc_sk_anc_data_recv(struct msghdr *m, struct sk_buff *skb,
>                                struct tipc_sock *tsk)
>  {
> -     struct tipc_msg *msg;
> -     u32 anc_data[3];
> -     u32 err;
> -     u32 dest_type;
> -     int has_name;
> -     int res;
> +     struct tipc_msg *hdr;
> +     bool has_addr;
> +     int data[12];

Potential memory leak here!

> +     int dlen, rc;
> 
>       if (likely(m->msg_controllen == 0))
>               return 0;
> -     msg = buf_msg(skb);
> 
> -     /* Optionally capture errored message object(s) */
> -     err = msg ? msg_errcode(msg) : 0;
> -     if (unlikely(err)) {
> -             anc_data[0] = err;
> -             anc_data[1] = msg_data_sz(msg);
> -             res = put_cmsg(m, SOL_TIPC, TIPC_ERRINFO, 8, anc_data);
> -             if (res)
> -                     return res;
> -             if (anc_data[1]) {
> -                     if (skb_linearize(skb))
> -                             return -ENOMEM;
> -                     msg = buf_msg(skb);
> -                     res = put_cmsg(m, SOL_TIPC, TIPC_RETDATA, anc_data[1],
> -                                    msg_data(msg));
> -                     if (res)
> -                             return res;
> -             }
> +     hdr = buf_msg(skb);
> +     dlen = msg_data_sz(hdr);
> +
> +     /* Capture errored message object, if any */
> +     if (msg_errcode(hdr)) {
> +             if (skb_linearize(skb))
> +                     return -ENOMEM;
> +             hdr = buf_msg(skb);
> +             data[0] = msg_errcode(hdr);
> +             data[1] = dlen;
> +             rc = put_cmsg(m, SOL_TIPC, TIPC_ERRINFO, 8, data);
> +             if (rc || !dlen)
> +                     return rc;
> +             rc = put_cmsg(m, SOL_TIPC, TIPC_RETDATA, dlen, msg_data(hdr));
> +             if (rc)
> +                     return rc;
>       }
> 
> -     /* Optionally capture message destination object */
> -     dest_type = msg ? msg_type(msg) : TIPC_DIRECT_MSG;
> -     switch (dest_type) {
> +     /* Capture TIPC_SERVICE_ADDR/RANGE destination address, if any */
> +     switch (msg_type(hdr)) {
>       case TIPC_NAMED_MSG:
> -             has_name = 1;
> -             anc_data[0] = msg_nametype(msg);
> -             anc_data[1] = msg_namelower(msg);
> -             anc_data[2] = msg_namelower(msg);
> +             has_addr = true;
> +             data[0] = msg_nametype(hdr);
> +             data[1] = msg_namelower(hdr);
> +             data[2] = data[1];
>               break;
>       case TIPC_MCAST_MSG:
> -             has_name = 1;
> -             anc_data[0] = msg_nametype(msg);
> -             anc_data[1] = msg_namelower(msg);
> -             anc_data[2] = msg_nameupper(msg);
> +             has_addr = true;
> +             data[0] = msg_nametype(hdr);
> +             data[1] = msg_namelower(hdr);
> +             data[2] = msg_nameupper(hdr);
>               break;
>       case TIPC_CONN_MSG:
> -             has_name = !!tsk->conn_addrtype;
> -             anc_data[0] = msg_nametype(&tsk->phdr);
> -             anc_data[1] = msg_nameinst(&tsk->phdr);
> -             anc_data[2] = anc_data[1];
> +             has_addr = !!tsk->conn_addrtype;
> +             data[0] = msg_nametype(&tsk->phdr);
> +             data[1] = msg_nameinst(&tsk->phdr);
> +             data[2] = data[1];
>               break;
>       default:
> -             has_name = 0;
> -     }
> -     if (has_name) {
> -             res = put_cmsg(m, SOL_TIPC, TIPC_DESTNAME, 12, anc_data);
> -             if (res)
> -                     return res;
> +             has_addr = false;
>       }
> -
> -     return 0;
> +     if (!has_addr)
> +             return 0;
> +     return put_cmsg(m, SOL_TIPC, TIPC_DESTNAME, 12, data);
>  }
> 
>  static struct sk_buff *tipc_sk_build_ack(struct tipc_sock *tsk)
> --
> 2.29.2



_______________________________________________
tipc-discussion mailing list
tipc-discussion@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/tipc-discussion

Reply via email to