Re: [tipc-discussion] [net-next 3/4] tipc: refactor function tipc_sk_anc_data_recv()

2021-03-31 Thread Hoang Huu Le


> -Original Message-
> From: jma...@redhat.com 
> Sent: Thursday, March 25, 2021 10:56 PM
> To: tipc-discussion@lists.sourceforge.net
> Cc: Tung Quang Nguyen ; Hoang Huu Le 
> ; Tuong Tong Lien
> ; 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 
> 
> 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 
> ---
>  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(>phdr);
> - anc_data[1] = msg_nameinst(>phdr);
> - anc_data[2] = anc_data[1];
> + has_addr = !!tsk->conn_addrtype;
> + data[0] = msg_nametype(>phdr);
> + data[1] = msg_nameinst(>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

[tipc-discussion] [net-next 3/4] tipc: refactor function tipc_sk_anc_data_recv()

2021-03-25 Thread jmaloy
From: Jon Maloy 

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 
---
 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];
+   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(>phdr);
-   anc_data[1] = msg_nameinst(>phdr);
-   anc_data[2] = anc_data[1];
+   has_addr = !!tsk->conn_addrtype;
+   data[0] = msg_nametype(>phdr);
+   data[1] = msg_nameinst(>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