The branch, master has been updated via e316624... spoolss: fix spoolss_PrinterData size calculation. via 5ae61cf... spoolss: trivial fix for spoolss_FormInfo2 IDL. from 801fbd0... s4-smbtorture: check whether a returned buffer size is a multiple of 4 in RPC-SPOOLSS.
http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master - Log ----------------------------------------------------------------- commit e316624ddb8d4e178b03b315bfafd793e6c297c8 Author: Günther Deschner <g...@samba.org> Date: Sat Dec 12 02:52:41 2009 +0100 spoolss: fix spoolss_PrinterData size calculation. Currently we were crashing in EnumPrinterDataEx when an e.g. an empty (NULL) string for a separator file was returned. Guenther commit 5ae61cfbc281f346fd3712a975c5796f9cfbc6c2 Author: Günther Deschner <g...@samba.org> Date: Sat Dec 12 02:51:44 2009 +0100 spoolss: trivial fix for spoolss_FormInfo2 IDL. Guenther ----------------------------------------------------------------------- Summary of changes: librpc/gen_ndr/ndr_spoolss.c | 14 ++++++-------- librpc/gen_ndr/ndr_spoolss.h | 1 - librpc/gen_ndr/spoolss.h | 5 +++-- librpc/idl/spoolss.idl | 5 +++-- librpc/ndr/ndr_spoolss_buf.c | 8 ++++++++ librpc/ndr/ndr_spoolss_buf.h | 1 + 6 files changed, 21 insertions(+), 13 deletions(-) Changeset truncated at 500 lines: diff --git a/librpc/gen_ndr/ndr_spoolss.c b/librpc/gen_ndr/ndr_spoolss.c index 79cabd8..f4cf968 100644 --- a/librpc/gen_ndr/ndr_spoolss.c +++ b/librpc/gen_ndr/ndr_spoolss.c @@ -15724,11 +15724,6 @@ _PUBLIC_ void ndr_print_spoolss_PrinterData(struct ndr_print *ndr, const char *n } } -_PUBLIC_ size_t ndr_size_spoolss_PrinterData(const union spoolss_PrinterData *r, uint32_t level, struct smb_iconv_convenience *ic, int flags) -{ - return ndr_size_union(r, flags, level, (ndr_push_flags_fn_t)ndr_push_spoolss_PrinterData, ic); -} - static enum ndr_err_code ndr_push_spoolss_FormFlags(struct ndr_push *ndr, int ndr_flags, enum spoolss_FormFlags r) { NDR_CHECK(ndr_push_enum_uint32(ndr, NDR_SCALARS, r)); @@ -15984,7 +15979,8 @@ _PUBLIC_ enum ndr_err_code ndr_push_spoolss_FormInfo2(struct ndr_push *ndr, int NDR_CHECK(ndr_push_relative_ptr1(ndr, r->display_name)); ndr->flags = _flags_save_string; } - NDR_CHECK(ndr_push_uint32(ndr, NDR_SCALARS, r->lang_id)); + NDR_CHECK(ndr_push_uint16(ndr, NDR_SCALARS, r->lang_id)); + NDR_CHECK(ndr_push_uint16(ndr, NDR_SCALARS, r->unused)); NDR_CHECK(ndr_push_trailer_align(ndr, 5)); } if (ndr_flags & NDR_BUFFERS) { @@ -16093,7 +16089,8 @@ _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_FormInfo2(struct ndr_pull *ndr, int } ndr->flags = _flags_save_string; } - NDR_CHECK(ndr_pull_uint32(ndr, NDR_SCALARS, &r->lang_id)); + NDR_CHECK(ndr_pull_uint16(ndr, NDR_SCALARS, &r->lang_id)); + NDR_CHECK(ndr_pull_uint16(ndr, NDR_SCALARS, &r->unused)); NDR_CHECK(ndr_pull_trailer_align(ndr, 5)); } if (ndr_flags & NDR_BUFFERS) { @@ -16206,7 +16203,8 @@ _PUBLIC_ void ndr_print_spoolss_FormInfo2(struct ndr_print *ndr, const char *nam ndr_print_string(ndr, "display_name", r->display_name); } ndr->depth--; - ndr_print_uint32(ndr, "lang_id", r->lang_id); + ndr_print_uint16(ndr, "lang_id", r->lang_id); + ndr_print_uint16(ndr, "unused", r->unused); ndr->depth--; } diff --git a/librpc/gen_ndr/ndr_spoolss.h b/librpc/gen_ndr/ndr_spoolss.h index 2fb6e9f..b368006 100644 --- a/librpc/gen_ndr/ndr_spoolss.h +++ b/librpc/gen_ndr/ndr_spoolss.h @@ -433,7 +433,6 @@ size_t ndr_size_spoolss_OSVersionEx(const struct spoolss_OSVersionEx *r, struct enum ndr_err_code ndr_push_spoolss_PrinterData(struct ndr_push *ndr, int ndr_flags, const union spoolss_PrinterData *r); enum ndr_err_code ndr_pull_spoolss_PrinterData(struct ndr_pull *ndr, int ndr_flags, union spoolss_PrinterData *r); void ndr_print_spoolss_PrinterData(struct ndr_print *ndr, const char *name, const union spoolss_PrinterData *r); -size_t ndr_size_spoolss_PrinterData(const union spoolss_PrinterData *r, uint32_t level, struct smb_iconv_convenience *ic, int flags); void ndr_print_spoolss_FormFlags(struct ndr_print *ndr, const char *name, enum spoolss_FormFlags r); void ndr_print_spoolss_FormSize(struct ndr_print *ndr, const char *name, const struct spoolss_FormSize *r); void ndr_print_spoolss_FormArea(struct ndr_print *ndr, const char *name, const struct spoolss_FormArea *r); diff --git a/librpc/gen_ndr/spoolss.h b/librpc/gen_ndr/spoolss.h index 77d7c52..5b88e08 100644 --- a/librpc/gen_ndr/spoolss.h +++ b/librpc/gen_ndr/spoolss.h @@ -1569,7 +1569,7 @@ union spoolss_PrinterData { uint32_t value;/* [case(REG_DWORD)] */ const char ** string_array;/* [flag(LIBNDR_FLAG_STR_NULLTERM),case(REG_MULTI_SZ)] */ DATA_BLOB data;/* [flag(LIBNDR_FLAG_REMAINING),default] */ -}/* [gensize,public,nodiscriminant] */; +}/* [nodiscriminant,public] */; enum spoolss_FormFlags #ifndef USE_UINT_ENUMS @@ -1620,7 +1620,8 @@ struct spoolss_FormInfo2 { const char * mui_dll;/* [relative,flag(LIBNDR_FLAG_STR_NULLTERM)] */ uint32_t ressource_id; const char * display_name;/* [relative,flag(LIBNDR_FLAG_STR_NULLTERM)] */ - uint32_t lang_id; + uint16_t lang_id; + uint16_t unused; }/* [gensize,public] */; union spoolss_FormInfo { diff --git a/librpc/idl/spoolss.idl b/librpc/idl/spoolss.idl index ceff885..1695c5a 100644 --- a/librpc/idl/spoolss.idl +++ b/librpc/idl/spoolss.idl @@ -1524,7 +1524,7 @@ import "misc.idl", "security.idl", "winreg.idl"; uint8 reserved; } spoolss_OSVersionEx; - typedef [nodiscriminant,public,gensize] union { + typedef [nodiscriminant,public] union { [case(REG_NONE)]; [case(REG_SZ)] nstring string; [case(REG_BINARY),flag(NDR_REMAINING)] DATA_BLOB binary; @@ -1697,7 +1697,8 @@ import "misc.idl", "security.idl", "winreg.idl"; [relative] nstring *mui_dll; uint32 ressource_id; [relative] nstring *display_name; - uint32 lang_id; + uint16 lang_id; + uint16 unused; } spoolss_FormInfo2; typedef [nodiscriminant,relative_base,public,gensize] union { diff --git a/librpc/ndr/ndr_spoolss_buf.c b/librpc/ndr/ndr_spoolss_buf.c index 853d9aa..b8d6f83 100644 --- a/librpc/ndr/ndr_spoolss_buf.c +++ b/librpc/ndr/ndr_spoolss_buf.c @@ -1355,3 +1355,11 @@ void ndr_print_spoolss_Field(struct ndr_print *ndr, const char *name, const unio } } +_PUBLIC_ size_t ndr_size_spoolss_PrinterData(const union spoolss_PrinterData *r, uint32_t level, struct smb_iconv_convenience *ic, int flags) +{ + if (!r) { + return 0; + } + return ndr_size_union(r, flags, level, (ndr_push_flags_fn_t)ndr_push_spoolss_PrinterData, ic); +} + diff --git a/librpc/ndr/ndr_spoolss_buf.h b/librpc/ndr/ndr_spoolss_buf.h index c0c553b..a53ab7b 100644 --- a/librpc/ndr/ndr_spoolss_buf.h +++ b/librpc/ndr/ndr_spoolss_buf.h @@ -53,6 +53,7 @@ size_t ndr_size_spoolss_StringArray(const struct spoolss_StringArray *r, struct _PUBLIC_ enum ndr_err_code ndr_push_spoolss_DriverInfo101(struct ndr_push *ndr, int ndr_flags, const struct spoolss_DriverInfo101 *r); _PUBLIC_ enum ndr_err_code ndr_pull_spoolss_DriverInfo101(struct ndr_pull *ndr, int ndr_flags, struct spoolss_DriverInfo101 *r); void ndr_print_spoolss_Field(struct ndr_print *ndr, const char *name, const union spoolss_Field *r); +size_t ndr_size_spoolss_PrinterData(const union spoolss_PrinterData *r, uint32_t level, struct smb_iconv_convenience *ic, int flags); #undef _PRINTF_ATTRIBUTE #define _PRINTF_ATTRIBUTE(a1, a2) -- Samba Shared Repository