From 6fc9564c337af90f3486ec5fd14924204f5784cf Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Tue, 1 Nov 2005 19:24:55 +0000 Subject: r11443: Fix error code returns on client spoolss code. Fix them up a *lot*. Jeremy. (This used to be commit 762fff4ddb505b90ada1ea54348dba1a8b9af631) --- source3/rpc_client/cli_spoolss.c | 397 +++++++++++++++++++++++++++------------ 1 file changed, 280 insertions(+), 117 deletions(-) (limited to 'source3/rpc_client/cli_spoolss.c') diff --git a/source3/rpc_client/cli_spoolss.c b/source3/rpc_client/cli_spoolss.c index 4322bacfc8..62dca0afe7 100644 --- a/source3/rpc_client/cli_spoolss.c +++ b/source3/rpc_client/cli_spoolss.c @@ -33,269 +33,369 @@ /********************************************************************** **********************************************************************/ -static void decode_printer_info_0(TALLOC_CTX *mem_ctx, RPC_BUFFER *buffer, +static BOOL decode_printer_info_0(TALLOC_CTX *mem_ctx, RPC_BUFFER *buffer, uint32 returned, PRINTER_INFO_0 **info) { - uint32 i; - PRINTER_INFO_0 *inf; + uint32 i; + PRINTER_INFO_0 *inf; - inf=TALLOC_ARRAY(mem_ctx, PRINTER_INFO_0, returned); + inf=TALLOC_ARRAY(mem_ctx, PRINTER_INFO_0, returned); + if (!inf) { + return False; + } memset(inf, 0, returned*sizeof(PRINTER_INFO_0)); prs_set_offset(&buffer->prs,0); - for (i=0; iprs,0); - for (i=0; iprs,0); - for (i=0; iprs,0); - for (i=0; iprs,0); for (i=0; iprs, 0); + prs_set_offset(&buffer->prs, 0); - for (i=0; iprs, 0); + prs_set_offset(&buffer->prs, 0); - for (i=0; iprs,0); - for (i=0; iprs,0); - for (i=0; iprs,0); - for (i=0; iprs, 0); + prs_set_offset(&buffer->prs, 0); - smb_io_driverdir_1("", buffer, inf, 0); + if (!smb_io_driverdir_1("", buffer, inf, 0)) { + return False; + } *info=inf; + return True; } /********************************************************************** **********************************************************************/ -static void decode_jobs_1(TALLOC_CTX *mem_ctx, RPC_BUFFER *buffer, +static BOOL decode_jobs_1(TALLOC_CTX *mem_ctx, RPC_BUFFER *buffer, uint32 num_jobs, JOB_INFO_1 **jobs) { uint32 i; *jobs = TALLOC_ARRAY(mem_ctx, JOB_INFO_1, num_jobs); + if (!jobs) { + return False; + } prs_set_offset(&buffer->prs,0); - for (i = 0; i < num_jobs; i++) - smb_io_job_info_1("", buffer, &((*jobs)[i]), 0); + for (i = 0; i < num_jobs; i++) { + if (!smb_io_job_info_1("", buffer, &((*jobs)[i]), 0)) { + return False; + } + } + + return True; } /********************************************************************** **********************************************************************/ -static void decode_jobs_2(TALLOC_CTX *mem_ctx, RPC_BUFFER *buffer, +static BOOL decode_jobs_2(TALLOC_CTX *mem_ctx, RPC_BUFFER *buffer, uint32 num_jobs, JOB_INFO_2 **jobs) { uint32 i; *jobs = TALLOC_ARRAY(mem_ctx, JOB_INFO_2, num_jobs); + if (!jobs) { + return False; + } prs_set_offset(&buffer->prs,0); - for (i = 0; i < num_jobs; i++) - smb_io_job_info_2("", buffer, &((*jobs)[i]), 0); + for (i = 0; i < num_jobs; i++) { + if (!smb_io_job_info_2("", buffer, &((*jobs)[i]), 0)) { + return False; + } + } + + return True; } /********************************************************************** **********************************************************************/ -static void decode_forms_1(TALLOC_CTX *mem_ctx, RPC_BUFFER *buffer, +static BOOL decode_forms_1(TALLOC_CTX *mem_ctx, RPC_BUFFER *buffer, uint32 num_forms, FORM_1 **forms) { int i; *forms = TALLOC_ARRAY(mem_ctx, FORM_1, num_forms); + if (!forms) { + return False; + } prs_set_offset(&buffer->prs,0); - for (i = 0; i < num_forms; i++) - smb_io_form_1("", buffer, &((*forms)[i]), 0); + for (i = 0; i < num_forms; i++) { + if (!smb_io_form_1("", buffer, &((*forms)[i]), 0)) { + return False; + } + } + + return True; } /********************************************************************** @@ -401,19 +501,29 @@ WERROR rpccli_spoolss_enum_printers(struct rpc_pipe_client *cli, TALLOC_CTX *mem switch (level) { case 0: - decode_printer_info_0(mem_ctx, out.buffer, out.returned, &ctr->printers_0); + if (!decode_printer_info_0(mem_ctx, out.buffer, out.returned, &ctr->printers_0)) { + return WERR_GENERAL_FAILURE; + } break; case 1: - decode_printer_info_1(mem_ctx, out.buffer, out.returned, &ctr->printers_1); + if (!decode_printer_info_1(mem_ctx, out.buffer, out.returned, &ctr->printers_1)) { + return WERR_GENERAL_FAILURE; + } break; case 2: - decode_printer_info_2(mem_ctx, out.buffer, out.returned, &ctr->printers_2); + if (!decode_printer_info_2(mem_ctx, out.buffer, out.returned, &ctr->printers_2)) { + return WERR_GENERAL_FAILURE; + } break; case 3: - decode_printer_info_3(mem_ctx, out.buffer, out.returned, &ctr->printers_3); + if (!decode_printer_info_3(mem_ctx, out.buffer, out.returned, &ctr->printers_3)) { + WERR_GENERAL_FAILURE; + } break; + default: + return WERR_UNKNOWN_LEVEL; } - + *num_printers = out.returned; return out.status; @@ -471,12 +581,18 @@ WERROR rpccli_spoolss_enum_ports(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ct switch (level) { case 1: - decode_port_info_1(mem_ctx, out.buffer, out.returned, &ctr->port.info_1); + if (!decode_port_info_1(mem_ctx, out.buffer, out.returned, &ctr->port.info_1)) { + return WERR_GENERAL_FAILURE; + } break; case 2: - decode_port_info_2(mem_ctx, out.buffer, out.returned, &ctr->port.info_2); + if (!decode_port_info_2(mem_ctx, out.buffer, out.returned, &ctr->port.info_2)) { + return WERR_GENERAL_FAILURE; + } break; - } + default: + return WERR_UNKNOWN_LEVEL; + } *num_ports = out.returned; @@ -534,21 +650,33 @@ WERROR rpccli_spoolss_getprinter(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ct switch (level) { case 0: - decode_printer_info_0(mem_ctx, out.buffer, 1, &ctr->printers_0); + if (!decode_printer_info_0(mem_ctx, out.buffer, 1, &ctr->printers_0)) { + return WERR_GENERAL_FAILURE; + } break; case 1: - decode_printer_info_1(mem_ctx, out.buffer, 1, &ctr->printers_1); + if (!decode_printer_info_1(mem_ctx, out.buffer, 1, &ctr->printers_1)) { + return WERR_GENERAL_FAILURE; + } break; case 2: - decode_printer_info_2(mem_ctx, out.buffer, 1, &ctr->printers_2); + if (!decode_printer_info_2(mem_ctx, out.buffer, 1, &ctr->printers_2)) { + return WERR_GENERAL_FAILURE; + } break; case 3: - decode_printer_info_3(mem_ctx, out.buffer, 1, &ctr->printers_3); + if (!decode_printer_info_3(mem_ctx, out.buffer, 1, &ctr->printers_3)) { + return WERR_GENERAL_FAILURE; + } break; case 7: - decode_printer_info_7(mem_ctx, out.buffer, 1, &ctr->printers_7); + if (!decode_printer_info_7(mem_ctx, out.buffer, 1, &ctr->printers_7)) { + return WERR_GENERAL_FAILURE; + } break; - } + default: + return WERR_UNKNOWN_LEVEL; + } return out.status; } @@ -635,14 +763,22 @@ WERROR rpccli_spoolss_getprinterdriver(struct rpc_pipe_client *cli, switch (level) { case 1: - decode_printer_driver_1(mem_ctx, out.buffer, 1, &ctr->info1); + if (!decode_printer_driver_1(mem_ctx, out.buffer, 1, &ctr->info1)) { + return WERR_GENERAL_FAILURE; + } break; case 2: - decode_printer_driver_2(mem_ctx, out.buffer, 1, &ctr->info2); + if (!decode_printer_driver_2(mem_ctx, out.buffer, 1, &ctr->info2)) { + return WERR_GENERAL_FAILURE; + } break; case 3: - decode_printer_driver_3(mem_ctx, out.buffer, 1, &ctr->info3); + if (!decode_printer_driver_3(mem_ctx, out.buffer, 1, &ctr->info3)) { + return WERR_GENERAL_FAILURE; + } break; + default: + return WERR_UNKNOWN_LEVEL; } return out.status; @@ -709,14 +845,22 @@ WERROR rpccli_spoolss_enumprinterdrivers (struct rpc_pipe_client *cli, switch (level) { case 1: - decode_printer_driver_1(mem_ctx, out.buffer, out.returned, &ctr->info1); + if (!decode_printer_driver_1(mem_ctx, out.buffer, out.returned, &ctr->info1)) { + return WERR_GENERAL_FAILURE; + } break; case 2: - decode_printer_driver_2(mem_ctx, out.buffer, out.returned, &ctr->info2); + if (!decode_printer_driver_2(mem_ctx, out.buffer, out.returned, &ctr->info2)) { + return WERR_GENERAL_FAILURE; + } break; case 3: - decode_printer_driver_3(mem_ctx, out.buffer, out.returned, &ctr->info3); + if (!decode_printer_driver_3(mem_ctx, out.buffer, out.returned, &ctr->info3)) { + return WERR_GENERAL_FAILURE; + } break; + default: + return WERR_UNKNOWN_LEVEL; } } @@ -778,7 +922,9 @@ WERROR rpccli_spoolss_getprinterdriverdir (struct rpc_pipe_client *cli, if (!W_ERROR_IS_OK(out.status)) return out.status; - decode_printerdriverdir_1(mem_ctx, out.buffer, 1, &ctr->info1); + if (!decode_printerdriverdir_1(mem_ctx, out.buffer, 1, &ctr->info1)) { + return WERR_GENERAL_FAILURE; + } return out.status; } @@ -1062,7 +1208,9 @@ WERROR rpccli_spoolss_getform(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx, if (!W_ERROR_IS_OK(out.status)) return out.status; - smb_io_form_1("", out.buffer, form, 0); + if (!smb_io_form_1("", out.buffer, form, 0)) { + return WERR_GENERAL_FAILURE; + } return out.status; } @@ -1141,7 +1289,9 @@ WERROR rpccli_spoolss_enumforms(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx *num_forms = out.numofforms; - decode_forms_1(mem_ctx, out.buffer, *num_forms, forms); + if (!decode_forms_1(mem_ctx, out.buffer, *num_forms, forms)) { + return WERR_GENERAL_FAILURE; + } return out.status; } @@ -1197,14 +1347,18 @@ WERROR rpccli_spoolss_enumjobs(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx, switch(level) { case 1: - decode_jobs_1(mem_ctx, out.buffer, out.returned, &ctr->job.job_info_1); + if (!decode_jobs_1(mem_ctx, out.buffer, out.returned, &ctr->job.job_info_1)) { + return WERR_GENERAL_FAILURE; + } break; case 2: - decode_jobs_2(mem_ctx, out.buffer, out.returned, &ctr->job.job_info_2); + if (!decode_jobs_2(mem_ctx, out.buffer, out.returned, &ctr->job.job_info_2)) { + return WERR_GENERAL_FAILURE; + } break; default: DEBUG(3, ("unsupported info level %d", level)); - break; + return WERR_UNKNOWN_LEVEL; } *returned = out.returned; @@ -1287,11 +1441,17 @@ WERROR rpccli_spoolss_getjob(struct rpc_pipe_client *cli, TALLOC_CTX *mem_ctx, switch(level) { case 1: - decode_jobs_1(mem_ctx, out.buffer, 1, &ctr->job.job_info_1); + if (!decode_jobs_1(mem_ctx, out.buffer, 1, &ctr->job.job_info_1)) { + return WERR_GENERAL_FAILURE; + } break; case 2: - decode_jobs_2(mem_ctx, out.buffer, 1, &ctr->job.job_info_2); + if (!decode_jobs_2(mem_ctx, out.buffer, 1, &ctr->job.job_info_2)) { + return WERR_GENERAL_FAILURE; + } break; + default: + return WERR_UNKNOWN_LEVEL; } return out.status; @@ -1788,6 +1948,9 @@ WERROR rpccli_spoolss_enumprinterkey(struct rpc_pipe_client *cli, TALLOC_CTX *me if (keylist) { *keylist = SMB_MALLOC_ARRAY(uint16, out.keys.buf_len); + if (!*keylist) { + return WERR_NOMEM; + } memcpy(*keylist, out.keys.buffer, out.keys.buf_len * 2); if (len) *len = out.keys.buf_len * 2; -- cgit