From: Stefan Metzmacher Date: Fri, 1 Jul 2005 11:04:33 +0000 (+0000) Subject: r8050: - make use of more [value()] properties X-Git-Tag: samba-4.0.0alpha6~801^3~10176 X-Git-Url: http://git.samba.org/samba.git/?a=commitdiff_plain;h=88df3c81ee283819faed2d521e98b1922c03854d;p=sfrench%2Fsamba-autobuild%2F.git r8050: - make use of more [value()] properties - the out subcontext's need to have a fixed size of r->in.offered, to make windows clients happy metze (This used to be commit 054e1ca434b2f81de199eeb41cb6233524fc5779) --- diff --git a/source4/include/structs.h b/source4/include/structs.h index b83c342e898..502180e9666 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 87a909b22fd..0dec162763d 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 594c56dda35..d9f9522eda2 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 fcbec4e561f..07a8addada5 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;