From e6d45abffb861570f9591811c77f0d3d8316f637 Mon Sep 17 00:00:00 2001 From: Bipin Kunal Date: Fri, 10 Jun 2016 16:21:37 +0530 Subject: xdr/nfs: free complete groupnode structure The groupnode->gr_next pointer is not traversed upon free. This is currently not a problem, because the pointer is never used. However the correct way to free a groupnode should check the ->gr_next pointer and free any of the groups that it encounters. This problem was identified while correcting a problem with the MOUNT protocol. The change "nfs: build exportlist with multiple groups" starts to use ->gr_next. This is backport of below mainline fix - http://review.gluster.org/#/c/14666/ Change-Id: I9d04eaf4c65bdb8db136321d60e70789da1739d7 BUG: 1343290 Signed-off-by: Niels de Vos Signed-off-by: Bipin Kunal Reviewed-on: http://review.gluster.org/14697 Smoke: Gluster Build System NetBSD-regression: NetBSD Build System CentOS-regression: Gluster Build System --- rpc/xdr/src/xdr-nfs3.c | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/rpc/xdr/src/xdr-nfs3.c b/rpc/xdr/src/xdr-nfs3.c index 0e145fc9954..01ccb236993 100644 --- a/rpc/xdr/src/xdr-nfs3.c +++ b/rpc/xdr/src/xdr-nfs3.c @@ -1836,6 +1836,19 @@ xdr_exportnode (XDR *xdrs, exportnode *objp) return TRUE; } +static void +xdr_free_groupnode (struct groupnode *group) +{ + if (!group) + return; + + if (group->gr_next) + xdr_free_groupnode (group->gr_next); + + GF_FREE (group->gr_name); + GF_FREE (group); +} + void xdr_free_exports_list (struct exportnode *first) { @@ -1848,10 +1861,7 @@ xdr_free_exports_list (struct exportnode *first) elist = first->ex_next; GF_FREE (first->ex_dir); - if (first->ex_groups) { - GF_FREE (first->ex_groups->gr_name); - GF_FREE (first->ex_groups); - } + xdr_free_groupnode (first->ex_groups); GF_FREE (first); first = elist; -- cgit