s4-spoolss: fix spoolss_GetPrinterData w.r.t. out pointer changes.
authorGünther Deschner <gd@samba.org>
Sat, 14 Mar 2009 00:38:08 +0000 (01:38 +0100)
committerGünther Deschner <gd@samba.org>
Tue, 17 Mar 2009 10:38:02 +0000 (11:38 +0100)
Guenther
(cherry picked from commit be9a34e75d03ca09b4d57c57f59f83d4214c7754)

source4/ntptr/simple_ldb/ntptr_simple_ldb.c
source4/rpc_server/spoolss/dcesrv_spoolss.c

index aea5d08c3f35f9104840f829d9219e1b782352cd..f4ba6b71575b332bb0ffb7359ac6b25627c90d97 100644 (file)
@@ -128,43 +128,43 @@ static WERROR sptr_GetPrintServerData(struct ntptr_GenericHandle *server, TALLOC
        struct dcerpc_server_info *server_info = lp_dcerpc_server_info(mem_ctx, server->ntptr->lp_ctx);
        if (strcmp("W3SvcInstalled", r->in.value_name) == 0) {
                *r->out.type            = SPOOLSS_PRINTER_DATA_TYPE_UINT32;
-               r->out.data.value       = 0;
+               r->out.data->value      = 0;
                return WERR_OK;
        } else if (strcmp("BeepEnabled", r->in.value_name) == 0) {
                *r->out.type            = SPOOLSS_PRINTER_DATA_TYPE_UINT32;
-               r->out.data.value       = 0;
+               r->out.data->value      = 0;
                return WERR_OK;
        } else if (strcmp("EventLog", r->in.value_name) == 0) {
                *r->out.type            = SPOOLSS_PRINTER_DATA_TYPE_UINT32;
-               r->out.data.value       = 0;
+               r->out.data->value      = 0;
                return WERR_OK;
        } else if (strcmp("NetPopup", r->in.value_name) == 0) {
                *r->out.type            = SPOOLSS_PRINTER_DATA_TYPE_UINT32;
-               r->out.data.value       = 0;
+               r->out.data->value      = 0;
                return WERR_OK;
        } else if (strcmp("NetPopupToComputer", r->in.value_name) == 0) {
                *r->out.type            = SPOOLSS_PRINTER_DATA_TYPE_UINT32;
-               r->out.data.value       = 0;
+               r->out.data->value      = 0;
                return  WERR_OK;
        } else if (strcmp("MajorVersion", r->in.value_name) == 0) {
                *r->out.type            = SPOOLSS_PRINTER_DATA_TYPE_UINT32;
-               r->out.data.value       = 3;
+               r->out.data->value      = 3;
                return WERR_OK;
        } else if (strcmp("MinorVersion", r->in.value_name) == 0) {
                *r->out.type            = SPOOLSS_PRINTER_DATA_TYPE_UINT32;
-               r->out.data.value       = 0;
+               r->out.data->value      = 0;
                return WERR_OK;
        } else if (strcmp("DefaultSpoolDirectory", r->in.value_name) == 0) {
                *r->out.type            = SPOOLSS_PRINTER_DATA_TYPE_STRING;
-               r->out.data.string      = "C:\\PRINTERS";
+               r->out.data->string     = "C:\\PRINTERS";
                return  WERR_OK;
        } else if (strcmp("Architecture", r->in.value_name) == 0) {
                *r->out.type            = SPOOLSS_PRINTER_DATA_TYPE_STRING;
-               r->out.data.string      = SPOOLSS_ARCHITECTURE_NT_X86;
+               r->out.data->string     = SPOOLSS_ARCHITECTURE_NT_X86;
                return  WERR_OK;
        } else if (strcmp("DsPresent", r->in.value_name) == 0) {
                *r->out.type            = SPOOLSS_PRINTER_DATA_TYPE_UINT32;
-               r->out.data.value       = 1;
+               r->out.data->value      = 1;
                return WERR_OK;
        } else if (strcmp("OSVersion", r->in.value_name) == 0) {
                DATA_BLOB blob;
@@ -182,7 +182,7 @@ static WERROR sptr_GetPrintServerData(struct ntptr_GenericHandle *server, TALLOC
                }
 
                *r->out.type            = SPOOLSS_PRINTER_DATA_TYPE_BINARY;
-               r->out.data.binary      = blob;
+               r->out.data->binary     = blob;
                return WERR_OK;
        } else if (strcmp("OSVersionEx", r->in.value_name) == 0) {
                DATA_BLOB blob;
@@ -202,16 +202,16 @@ static WERROR sptr_GetPrintServerData(struct ntptr_GenericHandle *server, TALLOC
                }
 
                *r->out.type            = SPOOLSS_PRINTER_DATA_TYPE_BINARY;
-               r->out.data.binary      = blob;
+               r->out.data->binary     = blob;
                return WERR_OK;
        } else if (strcmp("DNSMachineName", r->in.value_name) == 0) {
                if (!lp_realm(server->ntptr->lp_ctx)) return WERR_INVALID_PARAM;
 
                *r->out.type            = SPOOLSS_PRINTER_DATA_TYPE_STRING;
-               r->out.data.string      = talloc_asprintf(mem_ctx, "%s.%s",
+               r->out.data->string     = talloc_asprintf(mem_ctx, "%s.%s",
                                                                   lp_netbios_name(server->ntptr->lp_ctx),
                                                                   lp_realm(server->ntptr->lp_ctx));
-               W_ERROR_HAVE_NO_MEMORY(r->out.data.string);
+               W_ERROR_HAVE_NO_MEMORY(r->out.data->string);
                return WERR_OK;
        }
 
index 61c8009716b691bb2d81c4b0d8ff266d19ebd6ab..820fb7d39ef5b49a8540648c40693742e709e328 100644 (file)
@@ -583,6 +583,12 @@ static WERROR dcesrv_spoolss_GetPrinterData(struct dcesrv_call_state *dce_call,
        r->out.type = talloc_zero(mem_ctx, enum spoolss_PrinterDataType);
        W_ERROR_HAVE_NO_MEMORY(r->out.type);
 
+       r->out.needed = talloc_zero(mem_ctx, uint32_t);
+       W_ERROR_HAVE_NO_MEMORY(r->out.needed);
+
+       r->out.data = talloc_zero(mem_ctx, union spoolss_PrinterData);
+       W_ERROR_HAVE_NO_MEMORY(r->out.data);
+
        switch (handle->type) {
                case NTPTR_HANDLE_SERVER:
                        status = ntptr_GetPrintServerData(handle, mem_ctx, r);
@@ -594,7 +600,7 @@ static WERROR dcesrv_spoolss_GetPrinterData(struct dcesrv_call_state *dce_call,
 
        W_ERROR_NOT_OK_RETURN(status);
 
-       *r->out.needed  = ndr_size_spoolss_PrinterData(&r->out.data, *r->out.type, ic, 0);
+       *r->out.needed  = ndr_size_spoolss_PrinterData(r->out.data, *r->out.type, ic, 0);
        *r->out.type    = SPOOLSS_BUFFER_OK(*r->out.type, SPOOLSS_PRINTER_DATA_TYPE_NULL);
        r->out.data     = SPOOLSS_BUFFER_OK(r->out.data, r->out.data);
        return SPOOLSS_BUFFER_OK(WERR_OK, WERR_MORE_DATA);