[PATCH]: NetShareEnum - Removing a loop around smbXsrv_tcon_global.tdb traversal

Jeremy Allison jra at samba.org
Fri Aug 9 17:18:03 MDT 2013


Can I get a second Team reviewer to give me a +1 on
this one please ?

Original author has already +1'ed on the change.

Cheers,

	Jeremy.

On Mon, Aug 05, 2013 at 03:36:17PM -0700, Jeremy Allison wrote:
> On Mon, Jul 22, 2013 at 07:46:50PM +0530, Shekhar Amlekar wrote:
> > Hi,
> > 
> > Please find attached a patch that removes a loop around the traversal of 
> > smbXsrv_tcon_global.tdb in the NetShareEnum call.
> > Request your review.
> 
> I'd prefer modifying this patch to move the enumeration
> functions into source3/rpc_server/srvsvc/srv_srvsvc_nt.c
> rather than adding them into source3/smbd/connections.c
> 
> Here's a modified version that does that. Can you confirm
> you're happy with it ? If so I'll add my +1 review and
> propose it for master.
> 
> Cheers,
> 
> 	Jeremy

> From 6a3396a373b596c4f26e45849e40af9719099fea Mon Sep 17 00:00:00 2001
> From: Shekhar Amlekar <samlekar at in.ibm.com>
> Date: Sun, 23 Jun 2013 19:44:34 +0530
> Subject: [PATCH] s3: smbd/connection: added routines to compute share
>  connections
> 
> Added routines to compute share connections and used it
> in srvsvc NetShareEnum call.
> ---
>  source3/rpc_server/srvsvc/srv_srvsvc_nt.c | 48 ++++++++++++++++++++++++++++++-
>  1 file changed, 47 insertions(+), 1 deletion(-)
> 
> diff --git a/source3/rpc_server/srvsvc/srv_srvsvc_nt.c b/source3/rpc_server/srvsvc/srv_srvsvc_nt.c
> index 655b0c7..1af350a 100644
> --- a/source3/rpc_server/srvsvc/srv_srvsvc_nt.c
> +++ b/source3/rpc_server/srvsvc/srv_srvsvc_nt.c
> @@ -250,7 +250,7 @@ static void init_srv_share_info_2(struct pipes_struct *p,
>  	r->comment		= remark ? remark : "";
>  	r->permissions		= 0;
>  	r->max_users		= max_uses;
> -	r->current_users	= count_current_connections(net_name, false);
> +	r->current_users	= 0; /* computed later */
>  	r->path			= path ? path : "";
>  	r->password		= "";
>  }
> @@ -464,6 +464,49 @@ static bool is_enumeration_allowed(struct pipes_struct *p,
>  			      FILE_READ_DATA, NULL);
>  }
>  
> +/****************************************************************************
> + Count an entry against the respective service.
> +****************************************************************************/
> +
> +static int count_for_all_fn(struct smbXsrv_tcon_global0 *tcon, void *udp)
> +{
> +	union srvsvc_NetShareCtr *ctr = NULL;
> +	struct srvsvc_NetShareInfo2 *info2 = NULL;
> +	int share_entries = 0;
> +	int i = 0;
> +
> +	ctr = (union srvsvc_NetShareCtr *) udp;
> +
> +	/* for level 2 */
> +	share_entries  = ctr->ctr2->count;
> +	info2 = &ctr->ctr2->array[0];
> +
> +	for (i = 0; i < share_entries; i++, info2++) {
> +		if (strequal(tcon->share_name, info2->name)) {
> +			info2->current_users++;
> +			break;
> +		}
> +	}
> +
> +	return 0;
> +}
> +
> +/****************************************************************************
> + Count the entries belonging to all services in the connection db.
> +****************************************************************************/
> +
> +static void count_connections_for_all_shares(union srvsvc_NetShareCtr *ctr)
> +{
> +	NTSTATUS status;
> +	status = smbXsrv_tcon_global_traverse(count_for_all_fn, ctr);
> +
> +	if (!NT_STATUS_IS_OK(status)) {
> +		DEBUG(0,("count_connections_for_all_shares: traverse of "
> +			"smbXsrv_tcon_global.tdb failed - %s\n",
> +			nt_errstr(status)));
> +	}
> +}
> +
>  /*******************************************************************
>   Fill in a share info structure.
>   ********************************************************************/
> @@ -568,6 +611,7 @@ static WERROR init_srv_share_info_ctr(struct pipes_struct *p,
>  			}
>  		}
>  
> +		count_connections_for_all_shares(&ctr);
>  		break;
>  
>  	case 501:
> @@ -1382,6 +1426,8 @@ WERROR _srvsvc_NetShareGetInfo(struct pipes_struct *p,
>  			info->info2 = talloc(p->mem_ctx, struct srvsvc_NetShareInfo2);
>  			W_ERROR_HAVE_NO_MEMORY(info->info2);
>  			init_srv_share_info_2(p, info->info2, snum);
> +			info->info2->current_users =
> +			  count_current_connections(info->info2->name, false);
>  			break;
>  		case 501:
>  			info->info501 = talloc(p->mem_ctx, struct srvsvc_NetShareInfo501);
> -- 
> 1.8.3
> 



More information about the samba-technical mailing list