[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