From ea52cc486f5af3b5672f773827b5eb32d5102fef Mon Sep 17 00:00:00 2001 From: Gerald Carter Date: Fri, 27 Apr 2001 16:17:58 +0000 Subject: [PATCH] fixed memory leaks in rpcclient's cmd_spoolss_XXX() functions by moving to talloc() for cli_spoolss_XX(). Previously, the prs_struct's where using the TALLOC_CTX from the cli_state struct which lasted for the entire rpcclient session. Not good for long term connections. --- source/include/proto.h | 74 +++++++++--- source/libsmb/cli_spoolss.c | 237 ++++++++++++++++++++++++--------------- source/rpc_parse/parse_spoolss.c | 44 +++++--- source/rpcclient/cmd_spoolss.c | 147 +++++++++++++++++++----- 4 files changed, 350 insertions(+), 152 deletions(-) diff --git a/source/include/proto.h b/source/include/proto.h index 132a3ed7f70..2f222e9db61 100644 --- a/source/include/proto.h +++ b/source/include/proto.h @@ -796,24 +796,46 @@ struct cli_state *cli_spoolss_initialise(struct cli_state *cli, char *system_name, struct ntuser_creds *creds); void cli_spoolss_shutdown(struct cli_state *cli); -uint32 cli_spoolss_open_printer_ex(struct cli_state *cli, char *printername, - char *datatype, uint32 access_required, - char *station, char *username, - POLICY_HND *pol); -uint32 cli_spoolss_close_printer(struct cli_state *cli, POLICY_HND *pol); -uint32 cli_spoolss_enum_printers(struct cli_state *cli, uint32 flags, - uint32 level, int *returned, - PRINTER_INFO_CTR *ctr); -uint32 cli_spoolss_enum_ports(struct cli_state *cli, uint32 level, - int *returned, PORT_INFO_CTR *ctr); +uint32 cli_spoolss_open_printer_ex( + struct cli_state *cli, + TALLOC_CTX *mem_ctx, + char *printername, + char *datatype, + uint32 access_required, + char *station, + char *username, + POLICY_HND *pol +); +uint32 cli_spoolss_close_printer( + struct cli_state *cli, + TALLOC_CTX *mem_ctx, + POLICY_HND *pol +); +uint32 cli_spoolss_enum_printers( + struct cli_state *cli, + TALLOC_CTX *mem_ctx, + uint32 flags, + uint32 level, + int *returned, + PRINTER_INFO_CTR *ctr +); +uint32 cli_spoolss_enum_ports( + struct cli_state *cli, + TALLOC_CTX *mem_ctx, + uint32 level, + int *returned, + PORT_INFO_CTR *ctr +); uint32 cli_spoolss_getprinter( struct cli_state *cli, + TALLOC_CTX *mem_ctx, POLICY_HND *pol, uint32 level, PRINTER_INFO_CTR *ctr ); uint32 cli_spoolss_setprinter( struct cli_state *cli, + TALLOC_CTX *mem_ctx, POLICY_HND *pol, uint32 level, PRINTER_INFO_CTR *ctr, @@ -821,6 +843,7 @@ uint32 cli_spoolss_setprinter( ); uint32 cli_spoolss_getprinterdriver ( struct cli_state *cli, + TALLOC_CTX *mem_ctx, POLICY_HND *pol, uint32 level, char* env, @@ -828,6 +851,7 @@ uint32 cli_spoolss_getprinterdriver ( ); uint32 cli_spoolss_enumprinterdrivers ( struct cli_state *cli, + TALLOC_CTX *mem_ctx, uint32 level, char* env, uint32 *returned, @@ -835,17 +859,20 @@ uint32 cli_spoolss_enumprinterdrivers ( ); uint32 cli_spoolss_getprinterdriverdir ( struct cli_state *cli, + TALLOC_CTX *mem_ctx, uint32 level, char* env, DRIVER_DIRECTORY_CTR *ctr ); uint32 cli_spoolss_addprinterdriver ( struct cli_state *cli, + TALLOC_CTX *mem_ctx, uint32 level, PRINTER_DRIVER_CTR *ctr ); uint32 cli_spoolss_addprinterex ( struct cli_state *cli, + TALLOC_CTX *mem_ctx, uint32 level, PRINTER_INFO_CTR *ctr ); @@ -1580,9 +1607,6 @@ void close_sock(void); int write_sock(void *buffer, int count); int read_reply(struct winbindd_response *response); void free_response(struct winbindd_response *response); -enum nss_status winbindd_request(int req_type, - struct winbindd_request *request, - struct winbindd_response *response); /*The following definitions come from param/loadparm.c */ @@ -3157,6 +3181,7 @@ BOOL make_spoolss_q_open_printer_ex(SPOOL_Q_OPEN_PRINTER_EX *q_u, const fstring clientname, const fstring user_name); BOOL make_spoolss_q_addprinterex( + TALLOC_CTX *mem_ctx, SPOOL_Q_ADDPRINTEREX *q_u, const char *srv_name, const char* clientname, @@ -3164,6 +3189,7 @@ BOOL make_spoolss_q_addprinterex( uint32 level, PRINTER_INFO_CTR *ctr); BOOL make_spoolss_printer_info_2( + TALLOC_CTX *mem_ctx, SPOOL_PRINTER_INFO_LEVEL_2 **spool_info2, PRINTER_INFO_2 *info ); @@ -3245,9 +3271,14 @@ BOOL make_spoolss_q_getprinterdriver2(SPOOL_Q_GETPRINTERDRIVER2 *q_u, NEW_BUFFER *buffer, uint32 offered); BOOL spoolss_io_q_getprinterdriver2(char *desc, SPOOL_Q_GETPRINTERDRIVER2 *q_u, prs_struct *ps, int depth); BOOL spoolss_io_r_getprinterdriver2(char *desc, SPOOL_R_GETPRINTERDRIVER2 *r_u, prs_struct *ps, int depth); -BOOL make_spoolss_q_enumprinters(SPOOL_Q_ENUMPRINTERS *q_u, uint32 flags, - fstring servername, uint32 level, - NEW_BUFFER *buffer, uint32 offered); +BOOL make_spoolss_q_enumprinters( + SPOOL_Q_ENUMPRINTERS *q_u, + uint32 flags, + fstring servername, + uint32 level, + NEW_BUFFER *buffer, + uint32 offered +); BOOL make_spoolss_q_enumports(SPOOL_Q_ENUMPORTS *q_u, fstring servername, uint32 level, NEW_BUFFER *buffer, uint32 offered); @@ -3256,6 +3287,7 @@ BOOL spoolss_io_r_enumprinters(char *desc, SPOOL_R_ENUMPRINTERS *r_u, prs_struct BOOL spoolss_io_r_getprinter(char *desc, SPOOL_R_GETPRINTER *r_u, prs_struct *ps, int depth); BOOL spoolss_io_q_getprinter(char *desc, SPOOL_Q_GETPRINTER *q_u, prs_struct *ps, int depth); BOOL make_spoolss_q_getprinter( + TALLOC_CTX *mem_ctx, SPOOL_Q_GETPRINTER *q_u, const POLICY_HND *hnd, uint32 level, @@ -3263,6 +3295,7 @@ BOOL make_spoolss_q_getprinter( uint32 offered ); BOOL make_spoolss_q_setprinter( + TALLOC_CTX *mem_ctx, SPOOL_Q_SETPRINTER *q_u, const POLICY_HND *hnd, uint32 level, @@ -3314,15 +3347,22 @@ BOOL spool_io_printer_driver_info_level_6(char *desc, SPOOL_PRINTER_DRIVER_INFO_ BOOL smb_io_unibuffer(char *desc, UNISTR2 *buffer, prs_struct *ps, int depth); BOOL spool_io_printer_driver_info_level(char *desc, SPOOL_PRINTER_DRIVER_INFO_LEVEL *il, prs_struct *ps, int depth); BOOL make_spoolss_q_addprinterdriver( + TALLOC_CTX *mem_ctx, SPOOL_Q_ADDPRINTERDRIVER *q_u, const char* srv_name, uint32 level, PRINTER_DRIVER_CTR *info); BOOL make_spoolss_driver_info_3( + TALLOC_CTX *mem_ctx, SPOOL_PRINTER_DRIVER_INFO_LEVEL_3 **spool_drv_info, DRIVER_INFO_3 *info3 ); -BOOL make_spoolss_buffer5(BUFFER5 *buf5, uint32 len, uint16 *src); +BOOL make_spoolss_buffer5( + TALLOC_CTX *mem_ctx, + BUFFER5 *buf5, + uint32 len, + uint16 *src +); BOOL spoolss_io_q_addprinterdriver(char *desc, SPOOL_Q_ADDPRINTERDRIVER *q_u, prs_struct *ps, int depth); BOOL spoolss_io_r_addprinterdriver(char *desc, SPOOL_R_ADDPRINTERDRIVER *q_u, prs_struct *ps, int depth); BOOL uni_2_asc_printer_driver_3(SPOOL_PRINTER_DRIVER_INFO_LEVEL_3 *uni, diff --git a/source/libsmb/cli_spoolss.c b/source/libsmb/cli_spoolss.c index db761e57bfa..f68483dabe3 100644 --- a/source/libsmb/cli_spoolss.c +++ b/source/libsmb/cli_spoolss.c @@ -87,10 +87,16 @@ void cli_spoolss_shutdown(struct cli_state *cli) /* Open printer ex */ -uint32 cli_spoolss_open_printer_ex(struct cli_state *cli, char *printername, - char *datatype, uint32 access_required, - char *station, char *username, - POLICY_HND *pol) +uint32 cli_spoolss_open_printer_ex( + struct cli_state *cli, + TALLOC_CTX *mem_ctx, + char *printername, + char *datatype, + uint32 access_required, + char *station, + char *username, + POLICY_HND *pol +) { prs_struct qbuf, rbuf; SPOOL_Q_OPEN_PRINTER_EX q; @@ -102,8 +108,8 @@ uint32 cli_spoolss_open_printer_ex(struct cli_state *cli, char *printername, /* Initialise parse structures */ - prs_init(&qbuf, MAX_PDU_FRAG_LEN, cli->mem_ctx, MARSHALL); - prs_init(&rbuf, 0, cli->mem_ctx, UNMARSHALL); + prs_init(&qbuf, MAX_PDU_FRAG_LEN, mem_ctx, MARSHALL); + prs_init(&rbuf, 0, mem_ctx, UNMARSHALL); /* Initialise input parameters */ @@ -140,7 +146,11 @@ uint32 cli_spoolss_open_printer_ex(struct cli_state *cli, char *printername, /* Close a printer handle */ -uint32 cli_spoolss_close_printer(struct cli_state *cli, POLICY_HND *pol) +uint32 cli_spoolss_close_printer( + struct cli_state *cli, + TALLOC_CTX *mem_ctx, + POLICY_HND *pol +) { prs_struct qbuf, rbuf; SPOOL_Q_CLOSEPRINTER q; @@ -152,8 +162,8 @@ uint32 cli_spoolss_close_printer(struct cli_state *cli, POLICY_HND *pol) /* Initialise parse structures */ - prs_init(&qbuf, MAX_PDU_FRAG_LEN, cli->mem_ctx, MARSHALL); - prs_init(&rbuf, 0, cli->mem_ctx, UNMARSHALL); + prs_init(&qbuf, MAX_PDU_FRAG_LEN, mem_ctx, MARSHALL); + prs_init(&rbuf, 0, mem_ctx, UNMARSHALL); /* Initialise input parameters */ @@ -201,8 +211,12 @@ static void init_buffer(NEW_BUFFER *buffer, uint32 size, TALLOC_CTX *ctx) /* Decode various printer info levels - perhaps this should live in parse_spoolss.c? */ -static void decode_printer_info_0(NEW_BUFFER *buffer, uint32 returned, - PRINTER_INFO_0 **info) +static void decode_printer_info_0( + TALLOC_CTX *mem_ctx, + NEW_BUFFER *buffer, + uint32 returned, + PRINTER_INFO_0 **info +) { uint32 i; PRINTER_INFO_0 *inf; @@ -218,13 +232,17 @@ static void decode_printer_info_0(NEW_BUFFER *buffer, uint32 returned, *info=inf; } -static void decode_printer_info_1(NEW_BUFFER *buffer, uint32 returned, - PRINTER_INFO_1 **info) +static void decode_printer_info_1( + TALLOC_CTX *mem_ctx, + NEW_BUFFER *buffer, + uint32 returned, + PRINTER_INFO_1 **info +) { uint32 i; PRINTER_INFO_1 *inf; - inf=(PRINTER_INFO_1 *)malloc(returned*sizeof(PRINTER_INFO_1)); + inf=(PRINTER_INFO_1 *)talloc(mem_ctx, returned*sizeof(PRINTER_INFO_1)); buffer->prs.data_offset=0; @@ -235,13 +253,17 @@ static void decode_printer_info_1(NEW_BUFFER *buffer, uint32 returned, *info=inf; } -static void decode_printer_info_2(NEW_BUFFER *buffer, uint32 returned, - PRINTER_INFO_2 **info) +static void decode_printer_info_2( + TALLOC_CTX *mem_ctx, + NEW_BUFFER *buffer, + uint32 returned, + PRINTER_INFO_2 **info +) { uint32 i; PRINTER_INFO_2 *inf; - inf=(PRINTER_INFO_2 *)malloc(returned*sizeof(PRINTER_INFO_2)); + inf=(PRINTER_INFO_2 *)talloc(mem_ctx, returned*sizeof(PRINTER_INFO_2)); buffer->prs.data_offset=0; @@ -254,13 +276,17 @@ static void decode_printer_info_2(NEW_BUFFER *buffer, uint32 returned, *info=inf; } -static void decode_printer_info_3(NEW_BUFFER *buffer, uint32 returned, - PRINTER_INFO_3 **info) +static void decode_printer_info_3( + TALLOC_CTX *mem_ctx, + NEW_BUFFER *buffer, + uint32 returned, + PRINTER_INFO_3 **info +) { uint32 i; PRINTER_INFO_3 *inf; - inf=(PRINTER_INFO_3 *)malloc(returned*sizeof(PRINTER_INFO_3)); + inf=(PRINTER_INFO_3 *)talloc(mem_ctx, returned*sizeof(PRINTER_INFO_3)); buffer->prs.data_offset=0; @@ -275,13 +301,17 @@ static void decode_printer_info_3(NEW_BUFFER *buffer, uint32 returned, /********************************************************************** Decode a PORT_INFO_1 struct from a NEW_BUFFER **********************************************************************/ -static void decode_port_info_1(NEW_BUFFER *buffer, uint32 returned, - PORT_INFO_1 **info) +static void decode_port_info_1( + TALLOC_CTX *mem_ctx, + NEW_BUFFER *buffer, + uint32 returned, + PORT_INFO_1 **info +) { uint32 i; PORT_INFO_1 *inf; - inf=(PORT_INFO_1*)malloc(returned*sizeof(PORT_INFO_1)); + inf=(PORT_INFO_1*)talloc(mem_ctx, returned*sizeof(PORT_INFO_1)); prs_set_offset(&buffer->prs, 0); @@ -295,13 +325,16 @@ static void decode_port_info_1(NEW_BUFFER *buffer, uint32 returned, /********************************************************************** Decode a PORT_INFO_2 struct from a NEW_BUFFER **********************************************************************/ -static void decode_port_info_2(NEW_BUFFER *buffer, uint32 returned, - PORT_INFO_2 **info) +static void decode_port_info_2( + TALLOC_CTX *mem_ctx, + NEW_BUFFER *buffer, + uint32 returned, + PORT_INFO_2 **info) { uint32 i; PORT_INFO_2 *inf; - inf=(PORT_INFO_2*)malloc(returned*sizeof(PORT_INFO_2)); + inf=(PORT_INFO_2*)talloc(mem_ctx, returned*sizeof(PORT_INFO_2)); prs_set_offset(&buffer->prs, 0); @@ -312,13 +345,17 @@ static void decode_port_info_2(NEW_BUFFER *buffer, uint32 returned, *info=inf; } -static void decode_printer_driver_1(NEW_BUFFER *buffer, uint32 returned, - DRIVER_INFO_1 **info) +static void decode_printer_driver_1( + TALLOC_CTX *mem_ctx, + NEW_BUFFER *buffer, + uint32 returned, + DRIVER_INFO_1 **info +) { uint32 i; DRIVER_INFO_1 *inf; - inf=(DRIVER_INFO_1 *)malloc(returned*sizeof(DRIVER_INFO_1)); + inf=(DRIVER_INFO_1 *)talloc(mem_ctx, returned*sizeof(DRIVER_INFO_1)); buffer->prs.data_offset=0; @@ -329,13 +366,17 @@ static void decode_printer_driver_1(NEW_BUFFER *buffer, uint32 returned, *info=inf; } -static void decode_printer_driver_2(NEW_BUFFER *buffer, uint32 returned, - DRIVER_INFO_2 **info) +static void decode_printer_driver_2( + TALLOC_CTX *mem_ctx, + NEW_BUFFER *buffer, + uint32 returned, + DRIVER_INFO_2 **info +) { uint32 i; DRIVER_INFO_2 *inf; - inf=(DRIVER_INFO_2 *)malloc(returned*sizeof(DRIVER_INFO_2)); + inf=(DRIVER_INFO_2 *)talloc(mem_ctx, returned*sizeof(DRIVER_INFO_2)); buffer->prs.data_offset=0; @@ -347,6 +388,7 @@ static void decode_printer_driver_2(NEW_BUFFER *buffer, uint32 returned, } static void decode_printer_driver_3( + TALLOC_CTX *mem_ctx, NEW_BUFFER *buffer, uint32 returned, DRIVER_INFO_3 **info @@ -355,7 +397,7 @@ static void decode_printer_driver_3( uint32 i; DRIVER_INFO_3 *inf; - inf=(DRIVER_INFO_3 *)malloc(returned*sizeof(DRIVER_INFO_3)); + inf=(DRIVER_INFO_3 *)talloc(mem_ctx, returned*sizeof(DRIVER_INFO_3)); buffer->prs.data_offset=0; @@ -367,6 +409,7 @@ static void decode_printer_driver_3( } static void decode_printerdriverdir_1 ( + TALLOC_CTX *mem_ctx, NEW_BUFFER *buffer, uint32 returned, DRIVER_DIRECTORY_1 **info @@ -374,7 +417,7 @@ static void decode_printerdriverdir_1 ( { DRIVER_DIRECTORY_1 *inf; - inf=(DRIVER_DIRECTORY_1 *)malloc(sizeof(DRIVER_DIRECTORY_1)); + inf=(DRIVER_DIRECTORY_1 *)talloc(mem_ctx, sizeof(DRIVER_DIRECTORY_1)); prs_set_offset(&buffer->prs, 0); @@ -386,9 +429,14 @@ static void decode_printerdriverdir_1 ( /* Enumerate printers */ -uint32 cli_spoolss_enum_printers(struct cli_state *cli, uint32 flags, - uint32 level, int *returned, - PRINTER_INFO_CTR *ctr) +uint32 cli_spoolss_enum_printers( + struct cli_state *cli, + TALLOC_CTX *mem_ctx, + uint32 flags, + uint32 level, + int *returned, + PRINTER_INFO_CTR *ctr +) { prs_struct qbuf, rbuf; SPOOL_Q_ENUMPRINTERS q; @@ -407,10 +455,10 @@ uint32 cli_spoolss_enum_printers(struct cli_state *cli, uint32 flags, do { /* Initialise input parameters */ - init_buffer(&buffer, needed, cli->mem_ctx); + init_buffer(&buffer, needed, mem_ctx); - prs_init(&qbuf, MAX_PDU_FRAG_LEN, cli->mem_ctx, MARSHALL); - prs_init(&rbuf, 0, cli->mem_ctx, UNMARSHALL); + prs_init(&qbuf, MAX_PDU_FRAG_LEN, mem_ctx, MARSHALL); + prs_init(&rbuf, 0, mem_ctx, UNMARSHALL); make_spoolss_q_enumprinters(&q, flags, server, level, &buffer, needed); @@ -430,21 +478,20 @@ uint32 cli_spoolss_enum_printers(struct cli_state *cli, uint32 flags, /* Return output parameters */ - if ((result = r.status) == NT_STATUS_NOPROBLEMO && r.returned > 0) { - - *returned = r.returned; + if (((result=r.status) == NT_STATUS_NOPROBLEMO) && (*returned = r.returned)) + { switch (level) { case 1: - decode_printer_info_1(r.buffer, r.returned, + decode_printer_info_1(mem_ctx, r.buffer, r.returned, &ctr->printers_1); break; case 2: - decode_printer_info_2(r.buffer, r.returned, + decode_printer_info_2(mem_ctx, r.buffer, r.returned, &ctr->printers_2); break; case 3: - decode_printer_info_3(r.buffer, r.returned, + decode_printer_info_3(mem_ctx, r.buffer, r.returned, &ctr->printers_3); break; } @@ -460,8 +507,13 @@ uint32 cli_spoolss_enum_printers(struct cli_state *cli, uint32 flags, } /* Enumerate printer ports */ -uint32 cli_spoolss_enum_ports(struct cli_state *cli, uint32 level, - int *returned, PORT_INFO_CTR *ctr) +uint32 cli_spoolss_enum_ports( + struct cli_state *cli, + TALLOC_CTX *mem_ctx, + uint32 level, + int *returned, + PORT_INFO_CTR *ctr +) { prs_struct qbuf, rbuf; SPOOL_Q_ENUMPORTS q; @@ -480,10 +532,10 @@ uint32 cli_spoolss_enum_ports(struct cli_state *cli, uint32 level, do { /* Initialise input parameters */ - init_buffer(&buffer, needed, cli->mem_ctx); + init_buffer(&buffer, needed, mem_ctx); - prs_init(&qbuf, MAX_PDU_FRAG_LEN, cli->mem_ctx, MARSHALL); - prs_init(&rbuf, 0, cli->mem_ctx, UNMARSHALL); + prs_init(&qbuf, MAX_PDU_FRAG_LEN, mem_ctx, MARSHALL); + prs_init(&rbuf, 0, mem_ctx, UNMARSHALL); make_spoolss_q_enumports(&q, server, level, &buffer, needed); @@ -509,11 +561,11 @@ uint32 cli_spoolss_enum_ports(struct cli_state *cli, uint32 level, switch (level) { case 1: - decode_port_info_1(r.buffer, r.returned, + decode_port_info_1(mem_ctx, r.buffer, r.returned, &ctr->port.info_1); break; case 2: - decode_port_info_2(r.buffer, r.returned, + decode_port_info_2(mem_ctx, r.buffer, r.returned, &ctr->port.info_2); break; } @@ -531,6 +583,7 @@ uint32 cli_spoolss_enum_ports(struct cli_state *cli, uint32 level, /* Get printer info */ uint32 cli_spoolss_getprinter( struct cli_state *cli, + TALLOC_CTX *mem_ctx, POLICY_HND *pol, uint32 level, PRINTER_INFO_CTR *ctr @@ -549,12 +602,12 @@ uint32 cli_spoolss_getprinter( do { /* Initialise input parameters */ - init_buffer(&buffer, needed, cli->mem_ctx); + init_buffer(&buffer, needed, mem_ctx); - prs_init(&qbuf, MAX_PDU_FRAG_LEN, cli->mem_ctx, MARSHALL); - prs_init(&rbuf, 0, cli->mem_ctx, UNMARSHALL); + prs_init(&qbuf, MAX_PDU_FRAG_LEN, mem_ctx, MARSHALL); + prs_init(&rbuf, 0, mem_ctx, UNMARSHALL); - make_spoolss_q_getprinter(&q, pol, level, &buffer, needed); + make_spoolss_q_getprinter(mem_ctx, &q, pol, level, &buffer, needed); /* Marshall data and send request */ if (!spoolss_io_q_getprinter("", &q, &qbuf, 0) || @@ -574,16 +627,16 @@ uint32 cli_spoolss_getprinter( switch (level) { case 0: - decode_printer_info_0(r.buffer, 1, &ctr->printers_0); + decode_printer_info_0(mem_ctx, r.buffer, 1, &ctr->printers_0); break; case 1: - decode_printer_info_1(r.buffer, 1, &ctr->printers_1); + decode_printer_info_1(mem_ctx, r.buffer, 1, &ctr->printers_1); break; case 2: - decode_printer_info_2(r.buffer, 1, &ctr->printers_2); + decode_printer_info_2(mem_ctx, r.buffer, 1, &ctr->printers_2); break; case 3: - decode_printer_info_3(r.buffer, 1, &ctr->printers_3); + decode_printer_info_3(mem_ctx, r.buffer, 1, &ctr->printers_3); break; } } @@ -602,6 +655,7 @@ uint32 cli_spoolss_getprinter( */ uint32 cli_spoolss_setprinter( struct cli_state *cli, + TALLOC_CTX *mem_ctx, POLICY_HND *pol, uint32 level, PRINTER_INFO_CTR *ctr, @@ -617,10 +671,10 @@ uint32 cli_spoolss_setprinter( ZERO_STRUCT(r); /* Initialise input parameters */ - prs_init(&qbuf, MAX_PDU_FRAG_LEN, cli->mem_ctx, MARSHALL); - prs_init(&rbuf, 0, cli->mem_ctx, UNMARSHALL); + prs_init(&qbuf, MAX_PDU_FRAG_LEN, mem_ctx, MARSHALL); + prs_init(&rbuf, 0, mem_ctx, UNMARSHALL); - make_spoolss_q_setprinter(&q, pol, level, ctr, command); + make_spoolss_q_setprinter(mem_ctx, &q, pol, level, ctr, command); /* Marshall data and send request */ result = NT_STATUS_UNSUCCESSFUL; @@ -653,6 +707,7 @@ done: */ uint32 cli_spoolss_getprinterdriver ( struct cli_state *cli, + TALLOC_CTX *mem_ctx, POLICY_HND *pol, uint32 level, char* env, @@ -677,10 +732,10 @@ uint32 cli_spoolss_getprinterdriver ( { /* Initialise input parameters */ - init_buffer(&buffer, needed, cli->mem_ctx); + init_buffer(&buffer, needed, mem_ctx); - prs_init(&qbuf, MAX_PDU_FRAG_LEN, cli->mem_ctx, MARSHALL); - prs_init(&rbuf, 0, cli->mem_ctx, UNMARSHALL); + prs_init(&qbuf, MAX_PDU_FRAG_LEN, mem_ctx, MARSHALL); + prs_init(&rbuf, 0, mem_ctx, UNMARSHALL); /* write the request */ @@ -707,13 +762,13 @@ uint32 cli_spoolss_getprinterdriver ( switch (level) { case 1: - decode_printer_driver_1(r.buffer, 1, &ctr->info1); + decode_printer_driver_1(mem_ctx, r.buffer, 1, &ctr->info1); break; case 2: - decode_printer_driver_2(r.buffer, 1, &ctr->info2); + decode_printer_driver_2(mem_ctx, r.buffer, 1, &ctr->info2); break; case 3: - decode_printer_driver_3(r.buffer, 1, &ctr->info3); + decode_printer_driver_3(mem_ctx, r.buffer, 1, &ctr->info3); break; } } @@ -732,6 +787,7 @@ uint32 cli_spoolss_getprinterdriver ( */ uint32 cli_spoolss_enumprinterdrivers ( struct cli_state *cli, + TALLOC_CTX *mem_ctx, uint32 level, char* env, uint32 *returned, @@ -755,10 +811,10 @@ uint32 cli_spoolss_enumprinterdrivers ( do { /* Initialise input parameters */ - init_buffer(&buffer, needed, cli->mem_ctx); + init_buffer(&buffer, needed, mem_ctx); - prs_init(&qbuf, MAX_PDU_FRAG_LEN, cli->mem_ctx, MARSHALL); - prs_init(&rbuf, 0, cli->mem_ctx, UNMARSHALL); + prs_init(&qbuf, MAX_PDU_FRAG_LEN, mem_ctx, MARSHALL); + prs_init(&rbuf, 0, mem_ctx, UNMARSHALL); /* write the request */ @@ -787,13 +843,13 @@ uint32 cli_spoolss_enumprinterdrivers ( switch (level) { case 1: - decode_printer_driver_1(r.buffer, r.returned, &ctr->info1); + decode_printer_driver_1(mem_ctx, r.buffer, r.returned, &ctr->info1); break; case 2: - decode_printer_driver_2(r.buffer, r.returned, &ctr->info2); + decode_printer_driver_2(mem_ctx, r.buffer, r.returned, &ctr->info2); break; case 3: - decode_printer_driver_3(r.buffer, r.returned, &ctr->info3); + decode_printer_driver_3(mem_ctx, r.buffer, r.returned, &ctr->info3); break; } } @@ -813,6 +869,7 @@ uint32 cli_spoolss_enumprinterdrivers ( */ uint32 cli_spoolss_getprinterdriverdir ( struct cli_state *cli, + TALLOC_CTX *mem_ctx, uint32 level, char* env, DRIVER_DIRECTORY_CTR *ctr @@ -835,10 +892,10 @@ uint32 cli_spoolss_getprinterdriverdir ( do { /* Initialise input parameters */ - init_buffer(&buffer, needed, cli->mem_ctx); + init_buffer(&buffer, needed, mem_ctx); - prs_init(&qbuf, MAX_PDU_FRAG_LEN, cli->mem_ctx, MARSHALL); - prs_init(&rbuf, 0, cli->mem_ctx, UNMARSHALL); + prs_init(&qbuf, MAX_PDU_FRAG_LEN, mem_ctx, MARSHALL); + prs_init(&rbuf, 0, mem_ctx, UNMARSHALL); /* write the request */ @@ -864,7 +921,7 @@ uint32 cli_spoolss_getprinterdriverdir ( switch (level) { case 1: - decode_printerdriverdir_1(r.buffer, 1, &ctr->info1); + decode_printerdriverdir_1(mem_ctx, r.buffer, 1, &ctr->info1); break; } } @@ -883,6 +940,7 @@ uint32 cli_spoolss_getprinterdriverdir ( */ uint32 cli_spoolss_addprinterdriver ( struct cli_state *cli, + TALLOC_CTX *mem_ctx, uint32 level, PRINTER_DRIVER_CTR *ctr ) @@ -890,22 +948,22 @@ uint32 cli_spoolss_addprinterdriver ( prs_struct qbuf, rbuf; SPOOL_Q_ADDPRINTERDRIVER q; SPOOL_R_ADDPRINTERDRIVER r; - uint32 result; + uint32 result = NT_STATUS_UNSUCCESSFUL; fstring server; ZERO_STRUCT(q); ZERO_STRUCT(r); - + slprintf (server, sizeof(fstring)-1, "\\\\%s", cli->desthost); strupper (server); /* Initialise input parameters */ - prs_init(&qbuf, MAX_PDU_FRAG_LEN, cli->mem_ctx, MARSHALL); - prs_init(&rbuf, 0, cli->mem_ctx, UNMARSHALL); + prs_init(&qbuf, MAX_PDU_FRAG_LEN, mem_ctx, MARSHALL); + prs_init(&rbuf, 0, mem_ctx, UNMARSHALL); /* write the request */ - make_spoolss_q_addprinterdriver (&q, server, level, ctr); + make_spoolss_q_addprinterdriver (mem_ctx, &q, server, level, ctr); /* Marshall data and send request */ result = NT_STATUS_UNSUCCESSFUL; @@ -929,7 +987,7 @@ uint32 cli_spoolss_addprinterdriver ( done: prs_mem_free(&qbuf); prs_mem_free(&rbuf); - + return result; } @@ -938,6 +996,7 @@ done: */ uint32 cli_spoolss_addprinterex ( struct cli_state *cli, + TALLOC_CTX *mem_ctx, uint32 level, PRINTER_INFO_CTR *ctr ) @@ -961,12 +1020,12 @@ uint32 cli_spoolss_addprinterex ( /* Initialise input parameters */ - prs_init(&qbuf, MAX_PDU_FRAG_LEN, cli->mem_ctx, MARSHALL); - prs_init(&rbuf, 0, cli->mem_ctx, UNMARSHALL); + prs_init(&qbuf, MAX_PDU_FRAG_LEN, mem_ctx, MARSHALL); + prs_init(&rbuf, 0, mem_ctx, UNMARSHALL); /* write the request */ - make_spoolss_q_addprinterex (&q, server, client, user, level, ctr); + make_spoolss_q_addprinterex (mem_ctx, &q, server, client, user, level, ctr); /* Marshall data and send request */ result = NT_STATUS_UNSUCCESSFUL; diff --git a/source/rpc_parse/parse_spoolss.c b/source/rpc_parse/parse_spoolss.c index ff3e53273a0..b18656b482c 100644 --- a/source/rpc_parse/parse_spoolss.c +++ b/source/rpc_parse/parse_spoolss.c @@ -761,6 +761,7 @@ BOOL make_spoolss_q_open_printer_ex(SPOOL_Q_OPEN_PRINTER_EX *q_u, * init a structure. ********************************************************************/ BOOL make_spoolss_q_addprinterex( + TALLOC_CTX *mem_ctx, SPOOL_Q_ADDPRINTEREX *q_u, const char *srv_name, const char* clientname, @@ -783,7 +784,7 @@ BOOL make_spoolss_q_addprinterex( { case 2: /* init q_u->info.info2 from *info */ - if (!make_spoolss_printer_info_2(&q_u->info.info_2, ctr->printers_2)) + if (!make_spoolss_printer_info_2(mem_ctx, &q_u->info.info_2, ctr->printers_2)) { DEBUG(0,("make_spoolss_q_addprinterex: Unable to fill SPOOL_Q_ADDPRINTEREX struct!\n")); return False; @@ -818,6 +819,7 @@ create a SPOOL_PRINTER_INFO_2 stuct from a PRINTER_INFO_2 struct *******************************************************************/ BOOL make_spoolss_printer_info_2( + TALLOC_CTX *mem_ctx, SPOOL_PRINTER_INFO_LEVEL_2 **spool_info2, PRINTER_INFO_2 *info ) @@ -826,8 +828,7 @@ BOOL make_spoolss_printer_info_2( SPOOL_PRINTER_INFO_LEVEL_2 *inf; /* allocate the necessary memory */ - inf = (SPOOL_PRINTER_INFO_LEVEL_2*)malloc(sizeof(SPOOL_PRINTER_INFO_LEVEL_2)); - if (!spool_info2) + if (!(inf=(SPOOL_PRINTER_INFO_LEVEL_2*)talloc(mem_ctx, sizeof(SPOOL_PRINTER_INFO_LEVEL_2)))) { DEBUG(0,("make_spoolss_printer_info_2: Unable to allocate SPOOL_PRINTER_INFO_LEVEL_2 sruct!\n")); return False; @@ -3256,9 +3257,14 @@ BOOL spoolss_io_r_getprinterdriver2(char *desc, SPOOL_R_GETPRINTERDRIVER2 *r_u, * init a structure. ********************************************************************/ -BOOL make_spoolss_q_enumprinters(SPOOL_Q_ENUMPRINTERS *q_u, uint32 flags, - fstring servername, uint32 level, - NEW_BUFFER *buffer, uint32 offered) +BOOL make_spoolss_q_enumprinters( + SPOOL_Q_ENUMPRINTERS *q_u, + uint32 flags, + fstring servername, + uint32 level, + NEW_BUFFER *buffer, + uint32 offered +) { q_u->flags=flags; @@ -3420,6 +3426,7 @@ BOOL spoolss_io_q_getprinter(char *desc, SPOOL_Q_GETPRINTER *q_u, prs_struct *ps ********************************************************************/ BOOL make_spoolss_q_getprinter( + TALLOC_CTX *mem_ctx, SPOOL_Q_GETPRINTER *q_u, const POLICY_HND *hnd, uint32 level, @@ -3444,6 +3451,7 @@ BOOL make_spoolss_q_getprinter( * init a structure. ********************************************************************/ BOOL make_spoolss_q_setprinter( + TALLOC_CTX *mem_ctx, SPOOL_Q_SETPRINTER *q_u, const POLICY_HND *hnd, uint32 level, @@ -3474,7 +3482,7 @@ BOOL make_spoolss_q_setprinter( info->printers_2->devmode = NULL; info->printers_2->secdesc = NULL; - make_spoolss_printer_info_2 (&q_u->info.info_2, info->printers_2); + make_spoolss_printer_info_2 (mem_ctx, &q_u->info.info_2, info->printers_2); #if 0 /* JERRY TEST */ q_u->secdesc_ctr = (SEC_DESC_BUF*)malloc(sizeof(SEC_DESC_BUF)); if (!q_u->secdesc_ctr) @@ -4700,6 +4708,7 @@ BOOL spool_io_printer_driver_info_level(char *desc, SPOOL_PRINTER_DRIVER_INFO_LE ******************************************************************/ BOOL make_spoolss_q_addprinterdriver( + TALLOC_CTX *mem_ctx, SPOOL_Q_ADDPRINTERDRIVER *q_u, const char* srv_name, uint32 level, @@ -4718,7 +4727,7 @@ BOOL make_spoolss_q_addprinterdriver( { /* info level 3 is supported by Windows 95/98, WinNT and Win2k */ case 3 : - make_spoolss_driver_info_3(&q_u->info.info_3, info->info3); + make_spoolss_driver_info_3(mem_ctx, &q_u->info.info_3, info->info3); break; /* info level 6 is supported by WinME and Win2k */ @@ -4735,6 +4744,7 @@ BOOL make_spoolss_q_addprinterdriver( } BOOL make_spoolss_driver_info_3( + TALLOC_CTX *mem_ctx, SPOOL_PRINTER_DRIVER_INFO_LEVEL_3 **spool_drv_info, DRIVER_INFO_3 *info3 ) @@ -4745,11 +4755,8 @@ BOOL make_spoolss_driver_info_3( BOOL null_char = False; SPOOL_PRINTER_DRIVER_INFO_LEVEL_3 *inf; - inf = (SPOOL_PRINTER_DRIVER_INFO_LEVEL_3*) - malloc(sizeof(SPOOL_PRINTER_DRIVER_INFO_LEVEL_3)); - if (!inf) + if (!(inf=(SPOOL_PRINTER_DRIVER_INFO_LEVEL_3*)talloc_zero(mem_ctx, sizeof(SPOOL_PRINTER_DRIVER_INFO_LEVEL_3)))) return False; - memset (inf, 0x0, sizeof(SPOOL_PRINTER_DRIVER_INFO_LEVEL_3)); inf->cversion = info3->version; inf->name_ptr = (info3->name.buffer!=NULL)?1:0; @@ -4793,7 +4800,7 @@ BOOL make_spoolss_driver_info_3( } inf->dependentfiles_ptr = (info3->dependentfiles != NULL) ? 1 : 0; inf->dependentfilessize = len; - if(!make_spoolss_buffer5(&inf->dependentfiles, len, info3->dependentfiles)) + if(!make_spoolss_buffer5(mem_ctx, &inf->dependentfiles, len, info3->dependentfiles)) { safe_free (inf); return False; @@ -4808,18 +4815,21 @@ BOOL make_spoolss_driver_info_3( make a BUFFER5 struct from a uint16* ******************************************************************/ -BOOL make_spoolss_buffer5(BUFFER5 *buf5, uint32 len, uint16 *src) +BOOL make_spoolss_buffer5( + TALLOC_CTX *mem_ctx, + BUFFER5 *buf5, + uint32 len, + uint16 *src +) { buf5->buf_len = len; - if((buf5->buffer=(uint16*)malloc(sizeof(uint16)*len)) == NULL) + if((buf5->buffer=(uint16*)talloc_memdup(mem_ctx, src, sizeof(uint16)*len)) == NULL) { DEBUG(0,("make_spoolss_buffer5: Unable to malloc memory for buffer!\n")); return False; } - memcpy(buf5->buffer, src, sizeof(uint16)*len); - return True; } diff --git a/source/rpcclient/cmd_spoolss.c b/source/rpcclient/cmd_spoolss.c index 52ff8b2cdfe..b4d9070edb3 100644 --- a/source/rpcclient/cmd_spoolss.c +++ b/source/rpcclient/cmd_spoolss.c @@ -148,6 +148,7 @@ static uint32 cmd_spoolss_open_printer_ex(struct cli_state *cli, int argc, char pstring printername; fstring server, user; POLICY_HND hnd; + TALLOC_CTX *mem_ctx; if (argc != 2) { printf("Usage: %s \n", argv[0]); @@ -156,7 +157,13 @@ static uint32 cmd_spoolss_open_printer_ex(struct cli_state *cli, int argc, char if (!cli) return NT_STATUS_UNSUCCESSFUL; - + + if (!(mem_ctx=talloc_init())) + { + DEBUG(0,("cmd_spoolss_open_printer_ex: talloc_init returned NULL!\n")); + return NT_STATUS_UNSUCCESSFUL; + } + slprintf (server, sizeof(fstring)-1, "\\\\%s", cli->desthost); strupper (server); @@ -171,18 +178,19 @@ static uint32 cmd_spoolss_open_printer_ex(struct cli_state *cli, int argc, char } /* Open the printer handle */ - result = cli_spoolss_open_printer_ex (cli, printername, "", + result = cli_spoolss_open_printer_ex (cli, mem_ctx, printername, "", MAXIMUM_ALLOWED_ACCESS, server, user, &hnd); if (result == NT_STATUS_NOPROBLEMO) { printf ("Printer %s opened successfully\n", printername); - result = cli_spoolss_close_printer (cli, &hnd); + result = cli_spoolss_close_printer (cli, mem_ctx, &hnd); if (result != NT_STATUS_NOPROBLEMO) { printf ("Error closing printer handle! (%s)\n", get_nt_error_msg(result)); } } cli_nt_session_close(cli); + talloc_destroy(mem_ctx); return result; } @@ -335,14 +343,22 @@ static uint32 cmd_spoolss_enum_printers(struct cli_state *cli, int argc, char ** info_level = 1; PRINTER_INFO_CTR ctr; int returned; - uint32 i; - + uint32 i = 0; + TALLOC_CTX *mem_ctx; + if (argc > 2) { printf("Usage: %s [level]\n", argv[0]); return NT_STATUS_NOPROBLEMO; } + if (!(mem_ctx=talloc_init())) + { + DEBUG(0,("cmd_spoolss_enum_printers: talloc_init returned NULL!\n")); + return NT_STATUS_UNSUCCESSFUL; + } + + if (argc == 2) { info_level = atoi(argv[1]); } @@ -356,10 +372,14 @@ static uint32 cmd_spoolss_enum_printers(struct cli_state *cli, int argc, char ** /* Enumerate printers -- Should we enumerate types other than PRINTER_ENUM_LOCAL? Maybe accept as a parameter? --jerry */ ZERO_STRUCT(ctr); - result = cli_spoolss_enum_printers(cli, PRINTER_ENUM_LOCAL, + result = cli_spoolss_enum_printers(cli, mem_ctx, PRINTER_ENUM_LOCAL, info_level, &returned, &ctr); - if (result == NT_STATUS_NOPROBLEMO) { + if (result == NT_STATUS_NOPROBLEMO) + { + if (!returned) + printf ("No Printers printers returned.\n"); + switch(info_level) { case 0: for (i=0; i 2) { printf("Usage: %s [level]\n", argv[0]); return NT_STATUS_NOPROBLEMO; } + + if (!(mem_ctx=talloc_init())) + { + DEBUG(0,("cmd_spoolss_enum_ports: talloc_init returned NULL!\n")); + return NT_STATUS_UNSUCCESSFUL; + } + if (argc == 2) { info_level = atoi(argv[1]); @@ -448,7 +477,7 @@ static uint32 cmd_spoolss_enum_ports(struct cli_state *cli, int argc, char **arg /* Enumerate ports */ ZERO_STRUCT(ctr); - result = cli_spoolss_enum_ports(cli, info_level, &returned, &ctr); + result = cli_spoolss_enum_ports(cli, mem_ctx, info_level, &returned, &ctr); if (result == NT_STATUS_NOPROBLEMO) { int i; @@ -469,6 +498,7 @@ static uint32 cmd_spoolss_enum_ports(struct cli_state *cli, int argc, char **arg } cli_nt_session_close(cli); + talloc_destroy(mem_ctx); return result; } @@ -486,12 +516,20 @@ static uint32 cmd_spoolss_getprinter(struct cli_state *cli, int argc, char **arg fstring printername, servername, username; + TALLOC_CTX *mem_ctx; if (argc == 1 || argc > 3) { printf("Usage: %s [level]\n", argv[0]); return NT_STATUS_NOPROBLEMO; } + if (!(mem_ctx=talloc_init())) + { + DEBUG(0,("cmd_spoolss_getprinter: talloc_init returned NULL!\n")); + return NT_STATUS_UNSUCCESSFUL; + } + + /* Initialise RPC connection */ if (!cli_nt_session_open (cli, PIPE_SPOOLSS)) { fprintf (stderr, "Could not initialize spoolss pipe!\n"); @@ -510,7 +548,7 @@ static uint32 cmd_spoolss_getprinter(struct cli_state *cli, int argc, char **arg /* get a printer handle */ if ((result = cli_spoolss_open_printer_ex( - cli, printername, "", MAXIMUM_ALLOWED_ACCESS, servername, + cli, mem_ctx, printername, "", MAXIMUM_ALLOWED_ACCESS, servername, username, &pol)) != NT_STATUS_NOPROBLEMO) { goto done; } @@ -518,7 +556,7 @@ static uint32 cmd_spoolss_getprinter(struct cli_state *cli, int argc, char **arg opened_hnd = True; /* Get printer info */ - if ((result = cli_spoolss_getprinter(cli, &pol, info_level, &ctr)) + if ((result = cli_spoolss_getprinter(cli, mem_ctx, &pol, info_level, &ctr)) != NT_STATUS_NOPROBLEMO) { goto done; } @@ -545,9 +583,10 @@ static uint32 cmd_spoolss_getprinter(struct cli_state *cli, int argc, char **arg done: if (opened_hnd) - cli_spoolss_close_printer(cli, &pol); + cli_spoolss_close_printer(cli, mem_ctx, &pol); cli_nt_session_close(cli); + talloc_destroy(mem_ctx); return result; } @@ -676,6 +715,7 @@ static uint32 cmd_spoolss_getdriver(struct cli_state *cli, int argc, char **argv server, user; uint32 i; + TALLOC_CTX *mem_ctx; if ((argc == 1) || (argc > 3)) { @@ -683,6 +723,12 @@ static uint32 cmd_spoolss_getdriver(struct cli_state *cli, int argc, char **argv return NT_STATUS_NOPROBLEMO; } + if (!(mem_ctx=talloc_init())) + { + DEBUG(0,("cmd_spoolss_getdriver: talloc_init returned NULL!\n")); + return NT_STATUS_UNSUCCESSFUL; + } + /* Initialise RPC connection */ if (!cli_nt_session_open (cli, PIPE_SPOOLSS)) { @@ -699,7 +745,7 @@ static uint32 cmd_spoolss_getdriver(struct cli_state *cli, int argc, char **argv info_level = atoi(argv[2]); /* Open a printer handle */ - if ((result=cli_spoolss_open_printer_ex (cli, printername, "", + if ((result=cli_spoolss_open_printer_ex (cli, mem_ctx, printername, "", MAXIMUM_ALLOWED_ACCESS, server, user, &pol)) != NT_STATUS_NO_PROBLEMO) { printf ("Error opening printer handle for %s!\n", printername); @@ -711,7 +757,7 @@ static uint32 cmd_spoolss_getdriver(struct cli_state *cli, int argc, char **argv /* loop through and print driver info level for each architecture */ for (i=0; archi_table[i].long_archi!=NULL; i++) { - result = cli_spoolss_getprinterdriver (cli, &pol, info_level, + result = cli_spoolss_getprinterdriver (cli, mem_ctx, &pol, info_level, archi_table[i].long_archi, &ctr); switch (result) @@ -753,8 +799,9 @@ static uint32 cmd_spoolss_getdriver(struct cli_state *cli, int argc, char **argv /* cleanup */ if (opened_hnd) - cli_spoolss_close_printer (cli, &pol); + cli_spoolss_close_printer (cli, mem_ctx, &pol); cli_nt_session_close (cli); + talloc_destroy(mem_ctx); if (result==ERROR_UNKNOWN_PRINTER_DRIVER) return NT_STATUS_NO_PROBLEMO; @@ -774,6 +821,7 @@ static uint32 cmd_spoolss_enum_drivers(struct cli_state *cli, int argc, char **a fstring server; uint32 i, j, returned; + TALLOC_CTX *mem_ctx; if (argc > 2) { @@ -781,6 +829,12 @@ static uint32 cmd_spoolss_enum_drivers(struct cli_state *cli, int argc, char **a return NT_STATUS_NOPROBLEMO; } + if (!(mem_ctx=talloc_init())) + { + DEBUG(0,("cmd_spoolss_enum_drivers: talloc_init returned NULL!\n")); + return NT_STATUS_UNSUCCESSFUL; + } + /* Initialise RPC connection */ if (!cli_nt_session_open (cli, PIPE_SPOOLSS)) { @@ -799,7 +853,7 @@ static uint32 cmd_spoolss_enum_drivers(struct cli_state *cli, int argc, char **a for (i=0; archi_table[i].long_archi!=NULL; i++) { returned = 0; - result = cli_spoolss_enumprinterdrivers (cli, info_level, + result = cli_spoolss_enumprinterdrivers (cli, mem_ctx, info_level, archi_table[i].long_archi, &returned, &ctr); if (returned == 0) @@ -841,6 +895,7 @@ static uint32 cmd_spoolss_enum_drivers(struct cli_state *cli, int argc, char **a /* cleanup */ cli_nt_session_close (cli); + talloc_destroy(mem_ctx); if (result==ERROR_UNKNOWN_PRINTER_DRIVER) return NT_STATUS_NO_PROBLEMO; @@ -871,6 +926,7 @@ static uint32 cmd_spoolss_getdriverdir(struct cli_state *cli, int argc, char **a uint32 result; fstring env; DRIVER_DIRECTORY_CTR ctr; + TALLOC_CTX *mem_ctx; if (argc > 2) { @@ -884,6 +940,13 @@ static uint32 cmd_spoolss_getdriverdir(struct cli_state *cli, int argc, char **a fprintf (stderr, "Could not initialize spoolss pipe!\n"); return NT_STATUS_UNSUCCESSFUL; } + + if (!(mem_ctx=talloc_init())) + { + DEBUG(0,("cmd_spoolss_getdriverdir: talloc_init returned NULL!\n")); + return NT_STATUS_UNSUCCESSFUL; + } + /* get the arguments need to open the printer handle */ if (argc == 2) @@ -892,7 +955,7 @@ static uint32 cmd_spoolss_getdriverdir(struct cli_state *cli, int argc, char **a fstrcpy (env, "Windows NT x86"); /* Get the directory. Only use Info level 1 */ - if ((result = cli_spoolss_getprinterdriverdir (cli, 1, env, &ctr)) + if ((result = cli_spoolss_getprinterdriverdir (cli, mem_ctx, 1, env, &ctr)) != NT_STATUS_NO_PROBLEMO) { return result; @@ -903,6 +966,7 @@ static uint32 cmd_spoolss_getdriverdir(struct cli_state *cli, int argc, char **a /* cleanup */ cli_nt_session_close (cli); + talloc_destroy(mem_ctx); return result; @@ -966,7 +1030,11 @@ static char* get_driver_3_param (char* str, char* delim, UNISTR* dest) :::\ : *******************************************************************************/ -static BOOL init_drv_info_3_members (DRIVER_INFO_3 *info, char *args) +static BOOL init_drv_info_3_members ( + TALLOC_CTX *mem_ctx, + DRIVER_INFO_3 *info, + char *args +) { char *str, *str2; uint32 len, i; @@ -997,7 +1065,7 @@ static BOOL init_drv_info_3_members (DRIVER_INFO_3 *info, char *args) /* allocate the space; add one extra slot for a terminating NULL. Each filename is NULL terminated and the end contains a double NULL */ - if ((info->dependentfiles=(uint16*)malloc((len+1)*sizeof(uint16))) == NULL) + if ((info->dependentfiles=(uint16*)talloc(mem_ctx, (len+1)*sizeof(uint16))) == NULL) { DEBUG(0,("init_drv_info_3_members: Unable to malloc memory for dependenfiles\n")); return False; @@ -1020,6 +1088,7 @@ static uint32 cmd_spoolss_addprinterdriver (struct cli_state *cli, int argc, cha DRIVER_INFO_3 info3; fstring arch; fstring driver_name; + TALLOC_CTX *mem_ctx = NULL; /* parse the command arguements */ if (argc != 3) @@ -1031,6 +1100,12 @@ static uint32 cmd_spoolss_addprinterdriver (struct cli_state *cli, int argc, cha return NT_STATUS_NOPROBLEMO; } + + if (!(mem_ctx=talloc_init())) + { + DEBUG(0,("cmd_spoolss_addprinterdriver: talloc_init returned NULL!\n")); + return NT_STATUS_UNSUCCESSFUL; + } /* Initialise RPC connection */ if (!cli_nt_session_open (cli, PIPE_SPOOLSS)) @@ -1050,16 +1125,15 @@ static uint32 cmd_spoolss_addprinterdriver (struct cli_state *cli, int argc, cha else set_drv_info_3_env(&info3, arch); - if (!init_drv_info_3_members(&info3, argv[2])) + if (!init_drv_info_3_members(mem_ctx, &info3, argv[2])) { printf ("Error Invalid parameter list - %s.\n", argv[2]); return NT_STATUS_INVALID_PARAMETER; } - /* Get the directory. Only use Info level 1 */ ctr.info3 = &info3; - if ((result = cli_spoolss_addprinterdriver (cli, level, &ctr)) + if ((result = cli_spoolss_addprinterdriver (cli, mem_ctx, level, &ctr)) != NT_STATUS_NO_PROBLEMO) { return result; @@ -1070,6 +1144,7 @@ static uint32 cmd_spoolss_addprinterdriver (struct cli_state *cli, int argc, cha /* cleanup */ cli_nt_session_close (cli); + talloc_destroy(mem_ctx); return result; @@ -1083,6 +1158,7 @@ static uint32 cmd_spoolss_addprinterex (struct cli_state *cli, int argc, char ** PRINTER_INFO_CTR ctr; PRINTER_INFO_2 info2; fstring server; + TALLOC_CTX *mem_ctx = NULL; /* parse the command arguements */ if (argc != 5) @@ -1090,6 +1166,13 @@ static uint32 cmd_spoolss_addprinterex (struct cli_state *cli, int argc, char ** printf ("Usage: %s \n", argv[0]); return NT_STATUS_NOPROBLEMO; } + + if (!(mem_ctx=talloc_init())) + { + DEBUG(0,("cmd_spoolss_addprinterex: talloc_init returned NULL!\n")); + return NT_STATUS_UNSUCCESSFUL; + } + slprintf (server, sizeof(fstring)-1, "\\\\%s", cli->desthost); strupper (server); @@ -1130,11 +1213,8 @@ static uint32 cmd_spoolss_addprinterex (struct cli_state *cli, int argc, char ** info2.averageppm = 0; */ - - - /* Get the directory. Only use Info level 1 */ ctr.printers_2 = &info2; - if ((result = cli_spoolss_addprinterex (cli, level, &ctr)) + if ((result = cli_spoolss_addprinterex (cli, mem_ctx, level, &ctr)) != NT_STATUS_NO_PROBLEMO) { cli_nt_session_close (cli); @@ -1145,6 +1225,7 @@ static uint32 cmd_spoolss_addprinterex (struct cli_state *cli, int argc, char ** /* cleanup */ cli_nt_session_close (cli); + talloc_destroy(mem_ctx); return result; @@ -1161,6 +1242,7 @@ static uint32 cmd_spoolss_setdriver (struct cli_state *cli, int argc, char **arg fstring servername, printername, username; + TALLOC_CTX *mem_ctx = NULL; /* parse the command arguements */ if (argc != 3) @@ -1169,6 +1251,12 @@ static uint32 cmd_spoolss_setdriver (struct cli_state *cli, int argc, char **arg return NT_STATUS_NOPROBLEMO; } + if (!(mem_ctx=talloc_init())) + { + DEBUG(0,("cmd_spoolss_setdriver: talloc_init returned NULL!\n")); + return NT_STATUS_UNSUCCESSFUL; + } + slprintf (servername, sizeof(fstring)-1, "\\\\%s", cli->desthost); strupper (servername); slprintf (printername, sizeof(fstring)-1, "%s\\%s", servername, argv[1]); @@ -1183,7 +1271,7 @@ static uint32 cmd_spoolss_setdriver (struct cli_state *cli, int argc, char **arg /* get a printer handle */ - if ((result = cli_spoolss_open_printer_ex(cli, printername, "", + if ((result = cli_spoolss_open_printer_ex(cli, mem_ctx, printername, "", MAXIMUM_ALLOWED_ACCESS, servername, username, &pol)) != NT_STATUS_NOPROBLEMO) { @@ -1195,7 +1283,7 @@ static uint32 cmd_spoolss_setdriver (struct cli_state *cli, int argc, char **arg /* Get printer info */ ZERO_STRUCT (info2); ctr.printers_2 = &info2; - if ((result = cli_spoolss_getprinter(cli, &pol, level, &ctr)) != NT_STATUS_NOPROBLEMO) + if ((result = cli_spoolss_getprinter(cli, mem_ctx, &pol, level, &ctr)) != NT_STATUS_NOPROBLEMO) { printf ("Unable to retreive printer information!\n"); goto done; @@ -1203,7 +1291,7 @@ static uint32 cmd_spoolss_setdriver (struct cli_state *cli, int argc, char **arg /* set the printer driver */ init_unistr(&ctr.printers_2->drivername, argv[2]); - if ((result = cli_spoolss_setprinter(cli, &pol, level, &ctr, 0)) != NT_STATUS_NO_PROBLEMO) + if ((result = cli_spoolss_setprinter(cli, mem_ctx, &pol, level, &ctr, 0)) != NT_STATUS_NO_PROBLEMO) { printf ("SetPrinter call failed!\n"); goto done;; @@ -1214,8 +1302,9 @@ static uint32 cmd_spoolss_setdriver (struct cli_state *cli, int argc, char **arg done: /* cleanup */ if (opened_hnd) - cli_spoolss_close_printer(cli, &pol); + cli_spoolss_close_printer(cli, mem_ctx, &pol); cli_nt_session_close (cli); + talloc_destroy(mem_ctx); return result; } -- 2.11.4.GIT