summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimo Sorce <idra@samba.org>2006-09-12 02:24:21 +0000
committerGerald (Jerry) Carter <jerry@samba.org>2007-10-10 14:18:25 -0500
commit7736d2f65cf0479c6a1588e3656809047a4b3d49 (patch)
treed5c83a090e3d177a40b9d6db8b13cd7e4f25511a
parent33c4fea4cdf7d5418423a81e53ce7b051500f287 (diff)
downloadsamba-7736d2f65cf0479c6a1588e3656809047a4b3d49.tar.gz
samba-7736d2f65cf0479c6a1588e3656809047a4b3d49.tar.bz2
samba-7736d2f65cf0479c6a1588e3656809047a4b3d49.zip
r18412: Implement NetiNameValidate but just for share name right now (type 9)
Simo. (This used to be commit 906429834a102349582017ef73a69e211ef5c500)
-rw-r--r--source4/rpc_server/common/server_info.c9
-rw-r--r--source4/rpc_server/srvsvc/dcesrv_srvsvc.c42
2 files changed, 50 insertions, 1 deletions
diff --git a/source4/rpc_server/common/server_info.c b/source4/rpc_server/common/server_info.c
index cd8106c03a..12f5c90e8d 100644
--- a/source4/rpc_server/common/server_info.c
+++ b/source4/rpc_server/common/server_info.c
@@ -132,4 +132,13 @@ _PUBLIC_ const char *dcesrv_common_get_userpath(TALLOC_CTX *mem_ctx, struct dces
return talloc_strdup(mem_ctx, "c:\\");
}
+#define INVALID_SHARE_NAME_CHARS " \"*+,./:;<=>?[\\]|"
+_PUBLIC_ bool dcesrv_common_validate_share_name(TALLOC_CTX *mem_ctx, const char *share_name)
+{
+ if (strpbrk(share_name, INVALID_SHARE_NAME_CHARS)) {
+ return False;
+ }
+
+ return True;
+}
diff --git a/source4/rpc_server/srvsvc/dcesrv_srvsvc.c b/source4/rpc_server/srvsvc/dcesrv_srvsvc.c
index d850af5ebd..2464da447a 100644
--- a/source4/rpc_server/srvsvc/dcesrv_srvsvc.c
+++ b/source4/rpc_server/srvsvc/dcesrv_srvsvc.c
@@ -1273,7 +1273,47 @@ static WERROR srvsvc_NetPathCompare(struct dcesrv_call_state *dce_call, TALLOC_C
static WERROR srvsvc_NetNameValidate(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
struct srvsvc_NetNameValidate *r)
{
- DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
+ int len;
+
+ if ((r->in.flags != 0x0) && (r->in.flags != 0x80000000)) {
+ return WERR_INVALID_NAME;
+ }
+
+ switch (r->in.name_type) {
+ case 1:
+ case 2:
+ case 3:
+ case 4:
+ case 5:
+ case 6:
+ case 7:
+ case 8:
+ return WERR_NOT_SUPPORTED;
+
+ case 9: /* validate share name */
+
+ len = strlen_m(r->in.name);
+ if ((r->in.flags == 0x0) && (len > 81)) {
+ return WERR_INVALID_NAME;
+ }
+ if ((r->in.flags == 0x80000000) && (len > 13)) {
+ return WERR_INVALID_NAME;
+ }
+ if (! dcesrv_common_validate_share_name(mem_ctx, r->in.name)) {
+ return WERR_INVALID_NAME;
+ }
+ return WERR_OK;
+
+ case 10:
+ case 11:
+ case 12:
+ case 13:
+ return WERR_NOT_SUPPORTED;
+ default:
+ return WERR_INVALID_PARAM;
+ }
+
+ return WERR_INVALID_PARAM;
}