summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source4/include/structs.h2
-rw-r--r--source4/librpc/idl/spoolss.idl23
-rw-r--r--source4/librpc/ndr/ndr_spoolss_buf.c6
-rw-r--r--source4/torture/rpc/spoolss.c9
4 files changed, 17 insertions, 23 deletions
diff --git a/source4/include/structs.h b/source4/include/structs.h
index b83c342e89..502180e966 100644
--- a/source4/include/structs.h
+++ b/source4/include/structs.h
@@ -72,6 +72,8 @@ struct spoolss_EndPagePrinter;
struct spoolss_WritePrinter;
struct spoolss_ReadPrinter;
+struct spoolss_DeviceMode;
+
struct ntptr_context;
struct ntptr_GenericHandle;
diff --git a/source4/librpc/idl/spoolss.idl b/source4/librpc/idl/spoolss.idl
index 87a909b22f..0dec162763 100644
--- a/source4/librpc/idl/spoolss.idl
+++ b/source4/librpc/idl/spoolss.idl
@@ -56,7 +56,7 @@
uint32 unknown29;
} spoolss_PrinterInfo0;
- typedef struct {
+ typedef [gensize] struct {
string32 devicename;
uint16 specversion;
uint16 driverversion;
@@ -282,8 +282,8 @@
/******************/
/* Function: 0x01 */
typedef struct {
- uint32 size;
- [subcontext(4),subcontext_size(size)] spoolss_DeviceMode *devmode;
+ [value(_ndr_size_spoolss_DeviceMode(devmode, ndr->flags))] uint32 _ndr_size;
+ [subcontext(4),subcontext_size(_ndr_size)] spoolss_DeviceMode *devmode;
} spoolss_DevmodeContainer;
WERROR spoolss_OpenPrinter(
@@ -349,7 +349,7 @@
[in] uint32 level,
[in] DATA_BLOB *buffer,
[in] uint32 offered,
- [out,subcontext(4),switch_is(level)] spoolss_JobInfo *info,
+ [out,subcontext(4),subcontext_size(offered),switch_is(level)] spoolss_JobInfo *info,
[out] uint32 needed
);
@@ -419,17 +419,12 @@
[default];
} spoolss_SetPrinterInfo;
- typedef struct {
- uint32 size;
- [subcontext(4),subcontext_size(size)] security_descriptor *sd;
- } spoolss_SecDescContainer;
-
WERROR spoolss_SetPrinter(
[in,ref] policy_handle *handle,
[in] uint32 level,
[in,switch_is(level)] spoolss_SetPrinterInfo info,
[in] spoolss_DevmodeContainer devmode_ctr,
- [in] spoolss_SecDescContainer secdesc_ctr,
+ [in] sec_desc_buf secdesc_ctr,
[in] spoolss_PrinterControl command
);
@@ -440,7 +435,7 @@
[in] uint32 level,
[in] DATA_BLOB *buffer,
[in] uint32 offered,
- [out,subcontext(4),switch_is(level)] spoolss_PrinterInfo *info,
+ [out,subcontext(4),subcontext_size(offered),switch_is(level)] spoolss_PrinterInfo *info,
[out] uint32 needed
);
@@ -591,7 +586,7 @@
[in] uint32 level,
[in] DATA_BLOB *buffer,
[in] uint32 offered,
- [out,subcontext(4),switch_is(level)] spoolss_DriverDirectoryInfo *info,
+ [out,subcontext(4),subcontext_size(offered),switch_is(level)] spoolss_DriverDirectoryInfo *info,
[out] uint32 needed
);
@@ -759,7 +754,7 @@
[in] unistr value_name,
[in] uint32 offered,
[out] spoolss_PrinterDataType type,
- [out,subcontext(4),switch_is(type)] spoolss_PrinterData data,
+ [out,subcontext(4),subcontext_size(offered),switch_is(type)] spoolss_PrinterData data,
[out] uint32 needed
);
@@ -859,7 +854,7 @@
[in] uint32 level,
[in] DATA_BLOB *buffer,
[in] uint32 offered,
- [out,subcontext(4),switch_is(level)] spoolss_FormInfo *info,
+ [out,subcontext(4),subcontext_size(offered),switch_is(level)] spoolss_FormInfo *info,
[out] uint32 needed
);
diff --git a/source4/librpc/ndr/ndr_spoolss_buf.c b/source4/librpc/ndr/ndr_spoolss_buf.c
index 594c56dda3..d9f9522eda 100644
--- a/source4/librpc/ndr/ndr_spoolss_buf.c
+++ b/source4/librpc/ndr/ndr_spoolss_buf.c
@@ -523,3 +523,9 @@ NTSTATUS ndr_push_spoolss_SetPrinterData(struct ndr_push *ndr, int flags, const
}
return NT_STATUS_OK;
}
+
+uint32_t _ndr_size_spoolss_DeviceMode(struct spoolss_DeviceMode *devmode, uint32_t flags)
+{
+ if (!devmode) return 0;
+ return ndr_size_spoolss_DeviceMode(devmode,flags);
+}
diff --git a/source4/torture/rpc/spoolss.c b/source4/torture/rpc/spoolss.c
index fcbec4e561..07a8addada 100644
--- a/source4/torture/rpc/spoolss.c
+++ b/source4/torture/rpc/spoolss.c
@@ -100,7 +100,6 @@ static BOOL test_OpenPrinter_server(struct test_spoolss_context *ctx)
op.in.printername = talloc_asprintf(ctx, "\\\\%s", dcerpc_server_name(ctx->p));
op.in.datatype = NULL;
- op.in.devmode_ctr.size = 0;
op.in.devmode_ctr.devmode= NULL;
op.in.access_mask = 0;
op.out.handle = &ctx->server_handle;
@@ -1328,9 +1327,7 @@ static BOOL test_PausePrinter(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
r.in.handle = handle;
r.in.level = 0;
r.in.info.info1 = NULL;
- r.in.devmode_ctr.size = 0;
r.in.devmode_ctr.devmode= NULL;
- r.in.secdesc_ctr.size = 0;
r.in.secdesc_ctr.sd = NULL;
r.in.command = SPOOLSS_PRINTER_CONTROL_PAUSE;
@@ -1360,9 +1357,7 @@ static BOOL test_ResumePrinter(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
r.in.handle = handle;
r.in.level = 0;
r.in.info.info1 = NULL;
- r.in.devmode_ctr.size = 0;
r.in.devmode_ctr.devmode= NULL;
- r.in.secdesc_ctr.size = 0;
r.in.secdesc_ctr.sd = NULL;
r.in.command = SPOOLSS_PRINTER_CONTROL_RESUME;
@@ -1663,7 +1658,6 @@ static BOOL test_OpenPrinter_badname(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
op.in.printername = name;
op.in.datatype = NULL;
- op.in.devmode_ctr.size = 0;
op.in.devmode_ctr.devmode= NULL;
op.in.access_mask = 0;
op.out.handle = &handle;
@@ -1686,7 +1680,6 @@ static BOOL test_OpenPrinter_badname(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
opEx.in.printername = name;
opEx.in.datatype = NULL;
- opEx.in.devmode_ctr.size = 0;
opEx.in.devmode_ctr.devmode = NULL;
opEx.in.access_mask = 0;
opEx.in.level = 1;
@@ -1744,7 +1737,6 @@ static BOOL test_OpenPrinter(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
r.in.printername = talloc_asprintf(mem_ctx, "\\\\%s\\%s", dcerpc_server_name(p), name);
r.in.datatype = NULL;
- r.in.devmode_ctr.size = 0;
r.in.devmode_ctr.devmode= NULL;
r.in.access_mask = SEC_FLAG_MAXIMUM_ALLOWED;
r.out.handle = &handle;
@@ -1794,7 +1786,6 @@ static BOOL call_OpenPrinterEx(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
}
r.in.datatype = NULL;
- r.in.devmode_ctr.size = 0;
r.in.devmode_ctr.devmode= NULL;
r.in.access_mask = SEC_FLAG_MAXIMUM_ALLOWED;
r.in.level = 1;