> -----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