[prev in list] [next in list] [prev in thread] [next in thread] 

List:       samba-technical
Subject:    [PATCH] s4-srvsvc: Do not return hidden shares in
From:       brendan powers <brendan0powers () gmail ! com>
Date:       2010-12-07 20:03:22
Message-ID: AANLkTimhYRetLDy06twdjdnGVjL5P4s0Q5hycyvwabcK () mail ! gmail ! com
[Download RAW message or body]

Hello, I am trying to solve a problem where samba4 did not seem to
honor the browsable = no option. I've tracked it down to the
dcesrv_srvsvc_NetShareEnumAll function. This function does not check
if a share is hidden before returning it. The
dcesrv_srvsvc_NetShareEnum function does though. In the provided
patch, I've modified dcesrv_srvsvc_NetShareEnumAll to not return
hidden shares. However, I'm not sure this is the right approach. Can
someone who is familiar with this part of the code look it over?

["0001-s4-srvsvc-Do-not-return-hidden-shares-in-dcesrv_srvs.patch" (text/x-patch)]

From f5879ab4754b37352fb6849a3459c1f414d4f1a5 Mon Sep 17 00:00:00 2001
From: Brendan Powers <brendan@resara.com>
Date: Tue, 7 Dec 2010 14:50:58 -0500
Subject: [PATCH] s4-srvsvc: Do not return hidden shares in \
dcesrv_srvsvc_NetShareEnumAll

Shares with the "browsable = no" (STYPE_HIDDEN flag) were included in the return of \
                dcesrv_srvsvc_NetShareEnumAll. This patch excludes these shares.
---
 source4/rpc_server/srvsvc/dcesrv_srvsvc.c |   81 +++++++++++++++++++++++-----
 1 files changed, 66 insertions(+), 15 deletions(-)

diff --git a/source4/rpc_server/srvsvc/dcesrv_srvsvc.c \
b/source4/rpc_server/srvsvc/dcesrv_srvsvc.c index 611916c..eaff235 100644
--- a/source4/rpc_server/srvsvc/dcesrv_srvsvc.c
+++ b/source4/rpc_server/srvsvc/dcesrv_srvsvc.c
@@ -693,6 +693,7 @@ static WERROR dcesrv_srvsvc_NetShareEnumAll(struct \
dcesrv_call_state *dce_call,  const char **snames;
 	struct share_context *sctx;
 	struct share_config *scfg;
+	struct dcesrv_context *dce_ctx = dce_call->conn->dce_ctx;
 
 	*r->out.totalentries = 0;
 
@@ -712,7 +713,7 @@ static WERROR dcesrv_srvsvc_NetShareEnumAll(struct \
dcesrv_call_state *dce_call,  switch (r->in.info_ctr->level) {
 	case 0:
 	{
-		unsigned int i;
+		unsigned int i, y = 0;
 		struct srvsvc_NetShareCtr0 *ctr0;
 
 		ctr0 = talloc(mem_ctx, struct srvsvc_NetShareCtr0);
@@ -729,21 +730,31 @@ static WERROR dcesrv_srvsvc_NetShareEnumAll(struct \
dcesrv_call_state *dce_call,  ctr0->array = talloc_array(mem_ctx, struct \
srvsvc_NetShareInfo0, ctr0->count);  W_ERROR_HAVE_NO_MEMORY(ctr0->array);
 
-		for (i = 0; i < ctr0->count; i++) {
+		for (i = 0; i < numshares; i++) {
 			WERROR status;
 			union srvsvc_NetShareInfo info;
+			enum srvsvc_ShareType type;
 
 			nterr = share_get_config(mem_ctx, sctx, snames[i], &scfg);
 			if (!NT_STATUS_IS_OK(nterr)) {
 				DEBUG(1, ("ERROR: Service [%s] disappeared after enumeration", snames[i]));
 				return WERR_GENERAL_FAILURE;
 			}
-			info.info0 = &ctr0->array[i];
+
+			type = dcesrv_common_get_share_type(mem_ctx, dce_ctx, scfg);
+			if (type & STYPE_HIDDEN) {
+				ctr0->count--;
+				talloc_free(scfg);
+				continue;
+			}
+
+			info.info0 = &ctr0->array[y];
 			status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, \
r->in.info_ctr->level, &info);  if (!W_ERROR_IS_OK(status)) {
 				return status;
 			}
 			talloc_free(scfg);
+			y++;
 		}
 		talloc_free(snames);
 
@@ -753,7 +764,7 @@ static WERROR dcesrv_srvsvc_NetShareEnumAll(struct \
dcesrv_call_state *dce_call,  }
 	case 1:
 	{
-		unsigned int i;
+		unsigned int i, y = 0;
 		struct srvsvc_NetShareCtr1 *ctr1;
 
 		ctr1 = talloc(mem_ctx, struct srvsvc_NetShareCtr1);
@@ -770,21 +781,31 @@ static WERROR dcesrv_srvsvc_NetShareEnumAll(struct \
dcesrv_call_state *dce_call,  ctr1->array = talloc_array(mem_ctx, struct \
srvsvc_NetShareInfo1, ctr1->count);  W_ERROR_HAVE_NO_MEMORY(ctr1->array);
 
-		for (i=0; i < ctr1->count; i++) {
+		for (i=0; i < numshares; i++) {
 			WERROR status;
 			union srvsvc_NetShareInfo info;
+			enum srvsvc_ShareType type;
 
 			nterr = share_get_config(mem_ctx, sctx, snames[i], &scfg);
 			if (!NT_STATUS_IS_OK(nterr)) {
 				DEBUG(1, ("ERROR: Service [%s] disappeared after enumeration", snames[i]));
 				return WERR_GENERAL_FAILURE;
 			}
-			info.info1 = &ctr1->array[i];
+	
+			type = dcesrv_common_get_share_type(mem_ctx, dce_ctx, scfg);
+			if (type & STYPE_HIDDEN) {
+				ctr1->count--;
+				talloc_free(scfg);
+				continue;
+			}
+	
+			info.info1 = &ctr1->array[y];
 			status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, \
r->in.info_ctr->level, &info);  if (!W_ERROR_IS_OK(status)) {
 				return status;
 			}
 			talloc_free(scfg);
+			y++;
 		}
 		talloc_free(snames);
 
@@ -795,7 +816,7 @@ static WERROR dcesrv_srvsvc_NetShareEnumAll(struct \
dcesrv_call_state *dce_call,  }
 	case 2:
 	{
-		unsigned int i;
+		unsigned int i, y = 0;
 		struct srvsvc_NetShareCtr2 *ctr2;
 
 		SRVSVC_CHECK_ADMIN_ACCESS;
@@ -814,21 +835,31 @@ static WERROR dcesrv_srvsvc_NetShareEnumAll(struct \
dcesrv_call_state *dce_call,  ctr2->array = talloc_array(mem_ctx, struct \
srvsvc_NetShareInfo2, ctr2->count);  W_ERROR_HAVE_NO_MEMORY(ctr2->array);
 
-		for (i=0; i < ctr2->count; i++) {
+		for (i=0; i < numshares; i++) {
 			WERROR status;
 			union srvsvc_NetShareInfo info;
+			enum srvsvc_ShareType type;
 
 			nterr = share_get_config(mem_ctx, sctx, snames[i], &scfg);
 			if (!NT_STATUS_IS_OK(nterr)) {
 				DEBUG(1, ("ERROR: Service [%s] disappeared after enumeration", snames[i]));
 				return WERR_GENERAL_FAILURE;
 			}
-			info.info2 = &ctr2->array[i];
+
+			type = dcesrv_common_get_share_type(mem_ctx, dce_ctx, scfg);
+			if (type & STYPE_HIDDEN) {
+				ctr2->count--;
+				talloc_free(scfg);
+				continue;
+			}
+
+			info.info2 = &ctr2->array[y];
 			status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, \
r->in.info_ctr->level, &info);  if (!W_ERROR_IS_OK(status)) {
 				return status;
 			}
 			talloc_free(scfg);
+			y++;
 		}
 		talloc_free(snames);
 
@@ -839,7 +870,7 @@ static WERROR dcesrv_srvsvc_NetShareEnumAll(struct \
dcesrv_call_state *dce_call,  }
 	case 501:
 	{
-		unsigned int i;
+		unsigned int i, y = 0;
 		struct srvsvc_NetShareCtr501 *ctr501;
 
 		SRVSVC_CHECK_ADMIN_ACCESS;
@@ -858,21 +889,31 @@ static WERROR dcesrv_srvsvc_NetShareEnumAll(struct \
dcesrv_call_state *dce_call,  ctr501->array = talloc_array(mem_ctx, struct \
srvsvc_NetShareInfo501, ctr501->count);  W_ERROR_HAVE_NO_MEMORY(ctr501->array);
 
-		for (i=0; i < ctr501->count; i++) {
+		for (i=0; i < numshares; i++) {
 			WERROR status;
 			union srvsvc_NetShareInfo info;
+			enum srvsvc_ShareType type;
 
 			nterr = share_get_config(mem_ctx, sctx, snames[i], &scfg);
 			if (!NT_STATUS_IS_OK(nterr)) {
 				DEBUG(1, ("ERROR: Service [%s] disappeared after enumeration", snames[i]));
 				return WERR_GENERAL_FAILURE;
 			}
-			info.info501 = &ctr501->array[i];
+
+			type = dcesrv_common_get_share_type(mem_ctx, dce_ctx, scfg);
+			if (type & STYPE_HIDDEN) {
+				ctr501->count--;
+				talloc_free(scfg);
+				continue;
+			}
+
+			info.info501 = &ctr501->array[y];
 			status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, \
r->in.info_ctr->level, &info);  if (!W_ERROR_IS_OK(status)) {
 				return status;
 			}
 			talloc_free(scfg);
+			y++;
 		}
 		talloc_free(snames);
 
@@ -883,7 +924,7 @@ static WERROR dcesrv_srvsvc_NetShareEnumAll(struct \
dcesrv_call_state *dce_call,  }
 	case 502:
 	{
-		unsigned int i;
+		unsigned int i, y = 0;
 		struct srvsvc_NetShareCtr502 *ctr502;
 
 		SRVSVC_CHECK_ADMIN_ACCESS;
@@ -902,21 +943,31 @@ static WERROR dcesrv_srvsvc_NetShareEnumAll(struct \
dcesrv_call_state *dce_call,  ctr502->array = talloc_array(mem_ctx, struct \
srvsvc_NetShareInfo502, ctr502->count);  W_ERROR_HAVE_NO_MEMORY(ctr502->array);
 
-		for (i=0; i < ctr502->count; i++) {
+		for (i=0; i < numshares; i++) {
 			WERROR status;
 			union srvsvc_NetShareInfo info;
+			enum srvsvc_ShareType type;
 
 			nterr = share_get_config(mem_ctx, sctx, snames[i], &scfg);
 			if (!NT_STATUS_IS_OK(nterr)) {
 				DEBUG(1, ("ERROR: Service [%s] disappeared after enumeration", snames[i]));
 				return WERR_GENERAL_FAILURE;
 			}
-			info.info502 = &ctr502->array[i];
+
+			type = dcesrv_common_get_share_type(mem_ctx, dce_ctx, scfg);
+			if (type & STYPE_HIDDEN) {
+				ctr502->count--;
+				talloc_free(scfg);
+				continue;
+			}
+
+			info.info502 = &ctr502->array[y];
 			status = dcesrv_srvsvc_fiel_ShareInfo(dce_call, mem_ctx, scfg, \
r->in.info_ctr->level, &info);  if (!W_ERROR_IS_OK(status)) {
 				return status;
 			}
 			talloc_free(scfg);
+			y++;
 		}
 		talloc_free(snames);
 
-- 
1.7.0.4



[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic