[SCM] Samba Shared Repository - branch master updated - release-4-0-0alpha7-990-gf930f50

Günther Deschner gd at samba.org
Thu Apr 9 23:12:14 GMT 2009


The branch, master has been updated
       via  f930f504e1d5e78d2f6f36cab9ce36dbeb34e955 (commit)
       via  b7caf138518028507809bd6d356ec53b1564f0a1 (commit)
       via  c0b71db8e155c1d5e09b5be23ea681fd90955ac7 (commit)
       via  ade9ef19835b6464eeddd351a165eb4b9bf2366c (commit)
       via  43eb50655e71e5f407ffbd7069cc2d45a3b478b6 (commit)
       via  e4b4a07357920756f5bf0ca991ec8f4b38dc7968 (commit)
       via  7065b2b2ad604a3faf8df0e123e04ed7f532afda (commit)
      from  76da89daaadc358c836817cf597a1ff1489a9029 (commit)

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit f930f504e1d5e78d2f6f36cab9ce36dbeb34e955
Author: Günther Deschner <gd at samba.org>
Date:   Fri Apr 10 00:44:36 2009 +0200

    s3-selftest: enable the RPC-NTSVCS torture test against Samba3.
    
    Guenther

commit b7caf138518028507809bd6d356ec53b1564f0a1
Author: Günther Deschner <gd at samba.org>
Date:   Fri Apr 10 00:43:55 2009 +0200

    s3-ntsvcs: fix _PNP_GetDeviceList and _PNP_GetDeviceListSize.
    
    Guenther

commit c0b71db8e155c1d5e09b5be23ea681fd90955ac7
Author: Günther Deschner <gd at samba.org>
Date:   Fri Apr 10 00:42:35 2009 +0200

    s4-smbtorture: perform the ntsvcs devicelist tests against the Spooler service.
    
    Guenther

commit ade9ef19835b6464eeddd351a165eb4b9bf2366c
Author: Günther Deschner <gd at samba.org>
Date:   Fri Apr 10 00:00:44 2009 +0200

    s3-rpcclient: allow to set flags in cmd_ntsvcs_get_dev_list().
    
    Guenther

commit 43eb50655e71e5f407ffbd7069cc2d45a3b478b6
Author: Günther Deschner <gd at samba.org>
Date:   Thu Apr 9 23:44:24 2009 +0200

    error-codes: add WERR_CM_INVALID_POINTER.
    
    Guenther

commit e4b4a07357920756f5bf0ca991ec8f4b38dc7968
Author: Günther Deschner <gd at samba.org>
Date:   Fri Apr 10 00:01:41 2009 +0200

    s3: re-run make samba3-idl.
    
    Guenther

commit 7065b2b2ad604a3faf8df0e123e04ed7f532afda
Author: Günther Deschner <gd at samba.org>
Date:   Thu Apr 9 17:53:36 2009 +0200

    ntsvcs: add PNP_GetIdListFlags flags.
    
    Guenther

-----------------------------------------------------------------------

Summary of changes:
 libcli/util/werror.h                  |    1 +
 librpc/gen_ndr/ndr_ntsvcs.c           |   43 +++++++++++++++++++++---
 librpc/gen_ndr/ndr_ntsvcs.h           |    1 +
 librpc/gen_ndr/ntsvcs.h               |   13 +++++++
 librpc/idl/ntsvcs.idl                 |   19 ++++++++++-
 source3/rpc_server/srv_ntsvcs_nt.c    |   41 ++++++++++++++----------
 source3/rpcclient/cmd_ntsvcs.c        |   12 +++++--
 source3/script/tests/test_posix_s3.sh |    2 +-
 source4/torture/rpc/ntsvcs.c          |   56 ++++++++++++++++++++++----------
 9 files changed, 140 insertions(+), 48 deletions(-)


Changeset truncated at 500 lines:

diff --git a/libcli/util/werror.h b/libcli/util/werror.h
index ede4996..2e6b696 100644
--- a/libcli/util/werror.h
+++ b/libcli/util/werror.h
@@ -198,6 +198,7 @@ typedef uint32_t WERROR;
 /* Configuration Manager Errors */
 /* Basically Win32 errors meanings are specific to the \ntsvcs pipe */
 
+#define WERR_CM_INVALID_POINTER W_ERROR(3)
 #define WERR_CM_BUFFER_SMALL W_ERROR(26)
 #define WERR_CM_NO_MORE_HW_PROFILES W_ERROR(35)
 #define WERR_CM_NO_SUCH_VALUE W_ERROR(37)
diff --git a/librpc/gen_ndr/ndr_ntsvcs.c b/librpc/gen_ndr/ndr_ntsvcs.c
index ef2ecc1..d317c9f 100644
--- a/librpc/gen_ndr/ndr_ntsvcs.c
+++ b/librpc/gen_ndr/ndr_ntsvcs.c
@@ -4,6 +4,37 @@
 #include "../librpc/gen_ndr/ndr_ntsvcs.h"
 
 #include "librpc/gen_ndr/ndr_winreg.h"
+static enum ndr_err_code ndr_push_PNP_GetIdListFlags(struct ndr_push *ndr, int ndr_flags, uint32_t r)
+{
+	NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r));
+	return NDR_ERR_SUCCESS;
+}
+
+static enum ndr_err_code ndr_pull_PNP_GetIdListFlags(struct ndr_pull *ndr, int ndr_flags, uint32_t *r)
+{
+	uint32_t v;
+	NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &v));
+	*r = v;
+	return NDR_ERR_SUCCESS;
+}
+
+_PUBLIC_ void ndr_print_PNP_GetIdListFlags(struct ndr_print *ndr, const char *name, uint32_t r)
+{
+	ndr_print_uint32(ndr, name, r);
+	ndr->depth++;
+	ndr_print_bitmap_flag(ndr, sizeof(uint32_t), "CM_GETIDLIST_FILTER_ENUMERATOR", CM_GETIDLIST_FILTER_ENUMERATOR, r);
+	ndr_print_bitmap_flag(ndr, sizeof(uint32_t), "CM_GETIDLIST_FILTER_SERVICE", CM_GETIDLIST_FILTER_SERVICE, r);
+	ndr_print_bitmap_flag(ndr, sizeof(uint32_t), "CM_GETIDLIST_FILTER_EJECTRELATIONS", CM_GETIDLIST_FILTER_EJECTRELATIONS, r);
+	ndr_print_bitmap_flag(ndr, sizeof(uint32_t), "CM_GETIDLIST_FILTER_REMOVALRELATIONS", CM_GETIDLIST_FILTER_REMOVALRELATIONS, r);
+	ndr_print_bitmap_flag(ndr, sizeof(uint32_t), "CM_GETIDLIST_FILTER_POWERRELATIONS", CM_GETIDLIST_FILTER_POWERRELATIONS, r);
+	ndr_print_bitmap_flag(ndr, sizeof(uint32_t), "CM_GETIDLIST_FILTER_BUSRELATIONS", CM_GETIDLIST_FILTER_BUSRELATIONS, r);
+	ndr_print_bitmap_flag(ndr, sizeof(uint32_t), "CM_GETIDLIST_DONOTGENERATE", CM_GETIDLIST_DONOTGENERATE, r);
+	ndr_print_bitmap_flag(ndr, sizeof(uint32_t), "CM_GETIDLIST_FILTER_TRANSPORTRELATIONS", CM_GETIDLIST_FILTER_TRANSPORTRELATIONS, r);
+	ndr_print_bitmap_flag(ndr, sizeof(uint32_t), "CM_GETIDLIST_FILTER_PRESENT", CM_GETIDLIST_FILTER_PRESENT, r);
+	ndr_print_bitmap_flag(ndr, sizeof(uint32_t), "CM_GETIDLIST_FILTER_CLASS", CM_GETIDLIST_FILTER_CLASS, r);
+	ndr->depth--;
+}
+
 static enum ndr_err_code ndr_push_PNP_HwProfInfo(struct ndr_push *ndr, int ndr_flags, const struct PNP_HwProfInfo *r)
 {
 	uint32_t cntr_friendly_name_0;
@@ -522,7 +553,7 @@ static enum ndr_err_code ndr_push_PNP_GetDeviceList(struct ndr_push *ndr, int fl
 			return ndr_push_error(ndr, NDR_ERR_INVALID_POINTER, "NULL [ref] pointer");
 		}
 		NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, *r->in.length));
-		NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->in.flags));
+		NDR_CHECK(ndr_push_PNP_GetIdListFlags(ndr, NDR_SCALARS, r->in.flags));
 	}
 	if (flags & NDR_OUT) {
 		if (r->out.buffer == NULL) {
@@ -578,7 +609,7 @@ static enum ndr_err_code ndr_pull_PNP_GetDeviceList(struct ndr_pull *ndr, int fl
 		NDR_PULL_SET_MEM_CTX(ndr, r->in.length, LIBNDR_FLAG_REF_ALLOC);
 		NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, r->in.length));
 		NDR_PULL_SET_MEM_CTX(ndr, _mem_save_length_0, LIBNDR_FLAG_REF_ALLOC);
-		NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->in.flags));
+		NDR_CHECK(ndr_pull_PNP_GetIdListFlags(ndr, NDR_SCALARS, &r->in.flags));
 		NDR_PULL_ALLOC_N(ndr, r->out.buffer, *r->in.length);
 		memset(r->out.buffer, 0, (*r->in.length) * sizeof(*r->out.buffer));
 		NDR_PULL_ALLOC(ndr, r->out.length);
@@ -638,7 +669,7 @@ _PUBLIC_ void ndr_print_PNP_GetDeviceList(struct ndr_print *ndr, const char *nam
 		ndr->depth++;
 		ndr_print_uint32(ndr, "length", *r->in.length);
 		ndr->depth--;
-		ndr_print_uint32(ndr, "flags", r->in.flags);
+		ndr_print_PNP_GetIdListFlags(ndr, "flags", r->in.flags);
 		ndr->depth--;
 	}
 	if (flags & NDR_OUT) {
@@ -677,7 +708,7 @@ static enum ndr_err_code ndr_push_PNP_GetDeviceListSize(struct ndr_push *ndr, in
 			NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, ndr_charset_length(r->in.devicename, CH_UTF16)));
 			NDR_CHECK(ndr_push_charset(ndr, NDR_SCALARS, r->in.devicename, ndr_charset_length(r->in.devicename, CH_UTF16), sizeof(uint16_t), CH_UTF16));
 		}
-		NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->in.flags));
+		NDR_CHECK(ndr_push_PNP_GetIdListFlags(ndr, NDR_SCALARS, r->in.flags));
 	}
 	if (flags & NDR_OUT) {
 		if (r->out.size == NULL) {
@@ -715,7 +746,7 @@ static enum ndr_err_code ndr_pull_PNP_GetDeviceListSize(struct ndr_pull *ndr, in
 			NDR_CHECK(ndr_pull_charset(ndr, NDR_SCALARS, &r->in.devicename, ndr_get_array_length(ndr, &r->in.devicename), sizeof(uint16_t), CH_UTF16));
 			NDR_PULL_SET_MEM_CTX(ndr, _mem_save_devicename_0, 0);
 		}
-		NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->in.flags));
+		NDR_CHECK(ndr_pull_PNP_GetIdListFlags(ndr, NDR_SCALARS, &r->in.flags));
 		NDR_PULL_ALLOC(ndr, r->out.size);
 		ZERO_STRUCTP(r->out.size);
 	}
@@ -748,7 +779,7 @@ _PUBLIC_ void ndr_print_PNP_GetDeviceListSize(struct ndr_print *ndr, const char
 			ndr_print_string(ndr, "devicename", r->in.devicename);
 		}
 		ndr->depth--;
-		ndr_print_uint32(ndr, "flags", r->in.flags);
+		ndr_print_PNP_GetIdListFlags(ndr, "flags", r->in.flags);
 		ndr->depth--;
 	}
 	if (flags & NDR_OUT) {
diff --git a/librpc/gen_ndr/ndr_ntsvcs.h b/librpc/gen_ndr/ndr_ntsvcs.h
index b70c383..a5ad373 100644
--- a/librpc/gen_ndr/ndr_ntsvcs.h
+++ b/librpc/gen_ndr/ndr_ntsvcs.h
@@ -142,6 +142,7 @@ extern const struct ndr_interface_table ndr_table_ntsvcs;
 #define NDR_PNP_GETSERVERSIDEDEVICEINSTALLFLAGS (0x40)
 
 #define NDR_NTSVCS_CALL_COUNT (65)
+void ndr_print_PNP_GetIdListFlags(struct ndr_print *ndr, const char *name, uint32_t r);
 void ndr_print_PNP_HwProfInfo(struct ndr_print *ndr, const char *name, const struct PNP_HwProfInfo *r);
 void ndr_print_PNP_Disconnect(struct ndr_print *ndr, const char *name, int flags, const struct PNP_Disconnect *r);
 void ndr_print_PNP_Connect(struct ndr_print *ndr, const char *name, int flags, const struct PNP_Connect *r);
diff --git a/librpc/gen_ndr/ntsvcs.h b/librpc/gen_ndr/ntsvcs.h
index 804c452..f59fcae 100644
--- a/librpc/gen_ndr/ntsvcs.h
+++ b/librpc/gen_ndr/ntsvcs.h
@@ -8,7 +8,20 @@
 #ifndef _HEADER_ntsvcs
 #define _HEADER_ntsvcs
 
+#define CM_GETIDLIST_FILTER_NONE	( 0x00000000 )
 #define DEV_REGPROP_DESC	( 1 )
+/* bitmap PNP_GetIdListFlags */
+#define CM_GETIDLIST_FILTER_ENUMERATOR ( 0x00000001 )
+#define CM_GETIDLIST_FILTER_SERVICE ( 0x00000002 )
+#define CM_GETIDLIST_FILTER_EJECTRELATIONS ( 0x00000004 )
+#define CM_GETIDLIST_FILTER_REMOVALRELATIONS ( 0x00000008 )
+#define CM_GETIDLIST_FILTER_POWERRELATIONS ( 0x00000010 )
+#define CM_GETIDLIST_FILTER_BUSRELATIONS ( 0x00000020 )
+#define CM_GETIDLIST_DONOTGENERATE ( 0x10000040 )
+#define CM_GETIDLIST_FILTER_TRANSPORTRELATIONS ( 0x00000080 )
+#define CM_GETIDLIST_FILTER_PRESENT ( 0x00000100 )
+#define CM_GETIDLIST_FILTER_CLASS ( 0x00000200 )
+
 struct PNP_HwProfInfo {
 	uint32_t profile_handle;
 	uint16_t friendly_name[80];
diff --git a/librpc/idl/ntsvcs.idl b/librpc/idl/ntsvcs.idl
index be7fcdf..b1a3b78 100644
--- a/librpc/idl/ntsvcs.idl
+++ b/librpc/idl/ntsvcs.idl
@@ -70,11 +70,26 @@ interface ntsvcs
 	/******************/
 	/* Function: 0x0a */
 
+	const int CM_GETIDLIST_FILTER_NONE	= 0x00000000;
+
+	typedef [bitmap32bit] bitmap {
+		CM_GETIDLIST_FILTER_ENUMERATOR		= 0x00000001,
+		CM_GETIDLIST_FILTER_SERVICE		= 0x00000002,
+		CM_GETIDLIST_FILTER_EJECTRELATIONS	= 0x00000004,
+		CM_GETIDLIST_FILTER_REMOVALRELATIONS	= 0x00000008,
+		CM_GETIDLIST_FILTER_POWERRELATIONS	= 0x00000010,
+		CM_GETIDLIST_FILTER_BUSRELATIONS	= 0x00000020,
+		CM_GETIDLIST_DONOTGENERATE		= 0x10000040,
+		CM_GETIDLIST_FILTER_TRANSPORTRELATIONS	= 0x00000080,
+		CM_GETIDLIST_FILTER_PRESENT		= 0x00000100,
+		CM_GETIDLIST_FILTER_CLASS		= 0x00000200
+	} PNP_GetIdListFlags;
+
 	WERROR PNP_GetDeviceList(
 		[in,unique] [string,charset(UTF16)] uint16 *filter,
 		[out,ref] [size_is(*length),length_is(*length)] uint16 *buffer,
 		[in,out,ref] uint32 *length,
-		[in] uint32 flags
+		[in] PNP_GetIdListFlags flags
 		);
 
 	/******************/
@@ -83,7 +98,7 @@ interface ntsvcs
 	WERROR PNP_GetDeviceListSize(
 		[in,unique] [string,charset(UTF16)] uint16 *devicename,
 		[out,ref] uint32 *size,
-		[in] uint32 flags
+		[in] PNP_GetIdListFlags flags
 		);
 
 	/******************/
diff --git a/source3/rpc_server/srv_ntsvcs_nt.c b/source3/rpc_server/srv_ntsvcs_nt.c
index 681c543..7b8dc93 100644
--- a/source3/rpc_server/srv_ntsvcs_nt.c
+++ b/source3/rpc_server/srv_ntsvcs_nt.c
@@ -3,6 +3,7 @@
  *  RPC Pipe client / server routines
  *
  *  Copyright (C) Gerald (Jerry) Carter             2005.
+ *  Copyright (C) Guenther Deschner                 2008,2009.
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
@@ -50,8 +51,9 @@ WERROR _PNP_GetDeviceListSize(pipes_struct *p,
 {
 	char *devicepath;
 
-	if (!r->in.devicename) {
-		return WERR_ACCESS_DENIED;
+	if ((r->in.flags & CM_GETIDLIST_FILTER_SERVICE) &&
+	    (!r->in.devicename)) {
+		return WERR_CM_INVALID_POINTER;
 	}
 
 	if (!(devicepath = get_device_path(p->mem_ctx, r->in.devicename))) {
@@ -74,13 +76,14 @@ WERROR _PNP_GetDeviceList(pipes_struct *p,
 {
 	char *devicepath;
 	uint32_t size = 0;
+	char **multi_sz = NULL;
+	size_t multi_sz_len;
+	uint16_t *multi_sz_buf;
 
-	DATA_BLOB blob;
-	struct lsa_StringLarge s;
-	enum ndr_err_code ndr_err;
-
-	if ( !r->in.filter )
-		return WERR_ACCESS_DENIED;
+	if ((r->in.flags & CM_GETIDLIST_FILTER_SERVICE) &&
+	    (!r->in.filter)) {
+		return WERR_CM_INVALID_POINTER;
+	}
 
 	if (!(devicepath = get_device_path(p->mem_ctx, r->in.filter))) {
 		return WERR_NOMEM;
@@ -92,20 +95,24 @@ WERROR _PNP_GetDeviceList(pipes_struct *p,
 		return WERR_CM_BUFFER_SMALL;
 	}
 
-	s.string = r->in.filter;
-
-	/* This has to be DOUBLE NULL terminated */
-	ndr_err = ndr_push_struct_blob(&blob, p->mem_ctx, NULL, &s,
-			(ndr_push_flags_fn_t)ndr_push_lsa_StringLarge);
-	if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
-		return ntstatus_to_werror(ndr_map_error2ntstatus(ndr_err));
+	multi_sz = talloc_zero_array(p->mem_ctx, char *, 2);
+	if (!multi_sz) {
+		return WERR_NOMEM;
 	}
 
-	r->out.buffer = (uint16_t *)talloc_memdup(p->mem_ctx, blob.data, blob.length);
-	if (!r->out.buffer) {
+	multi_sz[0] = devicepath;
+
+	multi_sz_len = regval_build_multi_sz(multi_sz, &multi_sz_buf);
+	if (!multi_sz_len) {
 		return WERR_NOMEM;
 	}
 
+	if (*r->in.length < multi_sz_len/2) {
+		return WERR_CM_BUFFER_SMALL;
+	}
+
+	memcpy(r->out.buffer, multi_sz_buf, multi_sz_len);
+
 	return WERR_OK;
 }
 
diff --git a/source3/rpcclient/cmd_ntsvcs.c b/source3/rpcclient/cmd_ntsvcs.c
index eb620d0..a345cdc 100644
--- a/source3/rpcclient/cmd_ntsvcs.c
+++ b/source3/rpcclient/cmd_ntsvcs.c
@@ -235,17 +235,21 @@ static WERROR cmd_ntsvcs_get_dev_list(struct rpc_pipe_client *cli,
 	uint32_t length = 0;
 	uint32_t flags = 0;
 
-	if (argc > 3) {
-		printf("usage: %s [length] [filter]\n", argv[0]);
+	if (argc > 4) {
+		printf("usage: %s [filter] [length] [flags]\n", argv[0]);
 		return WERR_OK;
 	}
 
 	if (argc >= 2) {
-		length = atoi(argv[1]);
+		filter = argv[1];
 	}
 
 	if (argc >= 3) {
-		filter = argv[2];
+		length = atoi(argv[2]);
+	}
+
+	if (argc >= 4) {
+		flags = atoi(argv[3]);
 	}
 
 	buffer = talloc(mem_ctx, uint16_t);
diff --git a/source3/script/tests/test_posix_s3.sh b/source3/script/tests/test_posix_s3.sh
index 18e8ef7..b3a66e1 100755
--- a/source3/script/tests/test_posix_s3.sh
+++ b/source3/script/tests/test_posix_s3.sh
@@ -40,7 +40,7 @@ raw="$raw RAW-SAMBA3ROOTDIRFID"
 rpc="RPC-AUTHCONTEXT RPC-BINDSAMBA3 RPC-SAMBA3-SRVSVC RPC-SAMBA3-SHARESEC"
 rpc="$rpc RPC-SAMBA3-SPOOLSS RPC-SAMBA3-WKSSVC"
 rpc="$rpc RPC-NETLOGSAMBA3 RPC-SAMBA3SESSIONKEY RPC-SAMBA3-GETUSERNAME"
-rpc="$rpc RPC-SVCCTL RPC-SPOOLSS-WIN"
+rpc="$rpc RPC-SVCCTL RPC-SPOOLSS-WIN RPC-NTSVCS"
 
 # NOTE: to enable the UNIX-WHOAMI test, we need to change the default share
 # config to allow guest access. I'm not sure whether this would break other
diff --git a/source4/torture/rpc/ntsvcs.c b/source4/torture/rpc/ntsvcs.c
index 5453102..04494b3 100644
--- a/source4/torture/rpc/ntsvcs.c
+++ b/source4/torture/rpc/ntsvcs.c
@@ -47,18 +47,26 @@ static bool test_PNP_GetVersion(struct torture_context *tctx,
 static bool test_PNP_GetDeviceListSize(struct torture_context *tctx,
 				       struct dcerpc_pipe *p)
 {
-	NTSTATUS status;
 	struct PNP_GetDeviceListSize r;
 	uint32_t size = 0;
 
 	r.in.devicename = NULL;
-	r.in.flags = 0;
+	r.in.flags = CM_GETIDLIST_FILTER_SERVICE;
 	r.out.size = &size;
 
-	status = dcerpc_PNP_GetDeviceListSize(p, tctx, &r);
+	torture_assert_ntstatus_ok(tctx,
+		dcerpc_PNP_GetDeviceListSize(p, tctx, &r),
+		"PNP_GetDeviceListSize");
+	torture_assert_werr_equal(tctx, r.out.result, WERR_CM_INVALID_POINTER,
+		"PNP_GetDeviceListSize");
+
+	r.in.devicename = "Spooler";
 
-	torture_assert_ntstatus_ok(tctx, status, "PNP_GetDeviceListSize");
-	torture_assert_werr_ok(tctx, r.out.result, "PNP_GetDeviceListSize");
+	torture_assert_ntstatus_ok(tctx,
+		dcerpc_PNP_GetDeviceListSize(p, tctx, &r),
+		"PNP_GetDeviceListSize");
+	torture_assert_werr_ok(tctx, r.out.result,
+		"PNP_GetDeviceListSize");
 
 	return true;
 }
@@ -66,7 +74,6 @@ static bool test_PNP_GetDeviceListSize(struct torture_context *tctx,
 static bool test_PNP_GetDeviceList(struct torture_context *tctx,
 				   struct dcerpc_pipe *p)
 {
-	NTSTATUS status;
 	struct PNP_GetDeviceList r;
 	uint16_t *buffer = NULL;
 	uint32_t length = 0;
@@ -74,25 +81,35 @@ static bool test_PNP_GetDeviceList(struct torture_context *tctx,
 	buffer = talloc_array(tctx, uint16_t, 0);
 
 	r.in.filter = NULL;
-	r.in.flags = 0;
+	r.in.flags = CM_GETIDLIST_FILTER_SERVICE;
 	r.in.length = &length;
 	r.out.length = &length;
 	r.out.buffer = buffer;
 
-	status = dcerpc_PNP_GetDeviceList(p, tctx, &r);
-	torture_assert_ntstatus_ok(tctx, status, "PNP_GetDeviceList");
+	torture_assert_ntstatus_ok(tctx,
+		dcerpc_PNP_GetDeviceList(p, tctx, &r),
+		"PNP_GetDeviceList failed");
+	torture_assert_werr_equal(tctx, r.out.result, WERR_CM_INVALID_POINTER,
+		"PNP_GetDeviceList failed");
+
+	r.in.filter = "Spooler";
+
+	torture_assert_ntstatus_ok(tctx,
+		dcerpc_PNP_GetDeviceList(p, tctx, &r),
+		"PNP_GetDeviceList failed");
 
 	if (W_ERROR_EQUAL(r.out.result, WERR_CM_BUFFER_SMALL)) {
 		struct PNP_GetDeviceListSize s;
 
-		s.in.devicename = NULL;
-		s.in.flags = 0;
+		s.in.devicename = "Spooler";
+		s.in.flags = CM_GETIDLIST_FILTER_SERVICE;
 		s.out.size = &length;
 
-		status = dcerpc_PNP_GetDeviceListSize(p, tctx, &s);
-
-		torture_assert_ntstatus_ok(tctx, status, "PNP_GetDeviceListSize");
-		torture_assert_werr_ok(tctx, s.out.result, "PNP_GetDeviceListSize");
+		torture_assert_ntstatus_ok(tctx,
+			dcerpc_PNP_GetDeviceListSize(p, tctx, &s),
+			"PNP_GetDeviceListSize failed");
+		torture_assert_werr_ok(tctx, s.out.result,
+			"PNP_GetDeviceListSize failed");
 	}
 
 	buffer = talloc_array(tctx, uint16_t, length);
@@ -101,9 +118,12 @@ static bool test_PNP_GetDeviceList(struct torture_context *tctx,
 	r.out.length = &length;
 	r.out.buffer = buffer;
 
-	status = dcerpc_PNP_GetDeviceList(p, tctx, &r);
-	torture_assert_ntstatus_ok(tctx, status, "PNP_GetDeviceList");
-	torture_assert_werr_ok(tctx, r.out.result, "PNP_GetDeviceList");
+	torture_assert_ntstatus_ok(tctx,
+		dcerpc_PNP_GetDeviceList(p, tctx, &r),
+		"PNP_GetDeviceList failed");
+
+	torture_assert_werr_ok(tctx, r.out.result,
+		"PNP_GetDeviceList failed");
 
 	return true;
 }


-- 
Samba Shared Repository


More information about the samba-cvs mailing list