spoolss: fix spoolss_PrinterData size calculation.
authorGünther Deschner <gd@samba.org>
Sat, 12 Dec 2009 01:52:41 +0000 (02:52 +0100)
committerGünther Deschner <gd@samba.org>
Mon, 14 Dec 2009 09:39:34 +0000 (10:39 +0100)
Currently we were crashing in EnumPrinterDataEx when an e.g. an empty (NULL)
string for a separator file was returned.

Guenther

librpc/gen_ndr/ndr_spoolss.c
librpc/gen_ndr/ndr_spoolss.h
librpc/gen_ndr/spoolss.h
librpc/idl/spoolss.idl
librpc/ndr/ndr_spoolss_buf.c
librpc/ndr/ndr_spoolss_buf.h

index 388d707d3b6b1cc0b2380c7db51ed62b263df85d..f4cf9687bde07f5dbbf924dc1ac53f1773d706f6 100644 (file)
@@ -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));
index 2fb6e9ffea6c46a7e6b6866e1173eb0e7d57c5bd..b3680065722cd7b2c2350661d116bca4c90b043e 100644 (file)
@@ -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);
index 146dde5e2d47fad01c4a723035da0abebbd3bbc0..5b88e08ac3f84b90d425d375e76c3d01b05283fe 100644 (file)
@@ -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
index 14ddba8173d6d58b8f53ba1791eb054ade5ff41b..1695c5a8ccb947450bc98798945086fbcb716ca4 100644 (file)
@@ -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;
index 853d9aaac6f4eb28361454cf60fb83e36e4a797a..b8d6f83ab6c17a9815743a62b2a9836b9f4af455 100644 (file)
@@ -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);
+}
+
index c0c553b241b2c0a854ed5b6a1c344b75594a2788..a53ab7bb8ce4791d5428afb395c1117f7109badb 100644 (file)
@@ -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)