diff options
-rw-r--r-- | source3/printing/nt_printing.c | 65 | ||||
-rwxr-xr-x | source3/rpc_server/srv_spoolss.c | 39 |
2 files changed, 87 insertions, 17 deletions
diff --git a/source3/printing/nt_printing.c b/source3/printing/nt_printing.c index 9d357204df..a384b8e31a 100644 --- a/source3/printing/nt_printing.c +++ b/source3/printing/nt_printing.c @@ -128,22 +128,41 @@ add a form struct at the end of the list ****************************************************************************/ void add_a_form(nt_forms_struct **list, FORM form, int count) { - int n=count; + int n=0; + BOOL update; + fstring form_name; - *list=Realloc(*list, (n+1)*sizeof(nt_forms_struct)); + /* + * NT tries to add forms even when + * they are already in the base + * only update the values if already present + */ - (*list)[n].flag=form.flags; - (*list)[n].width=form.size_x; - (*list)[n].length=form.size_y; - (*list)[n].left=form.left; - (*list)[n].top=form.top; - (*list)[n].right=form.right; - (*list)[n].bottom=form.bottom; + update=False; + + unistr2_to_ascii(form_name, &(form.name), sizeof(form_name)-1); + for (n=0; n<count && update==False; n++) + { + if (!strncmp((*list)[n].name, form_name, strlen(form_name))) + { + DEBUG(3, ("NT workaround, [%s] already exists\n", form_name)); + update=True; + } + } - if (form.name_ptr) - { - unistr2_to_ascii((*list)[n].name, &(form.name), sizeof((*list)[n].name)-1); - } + if (update==False) + { + *list=Realloc(*list, (n+1)*sizeof(nt_forms_struct)); + unistr2_to_ascii((*list)[n].name, &(form.name), sizeof((*list)[n].name)-1); + } + + (*list)[n].flag=form.flags; + (*list)[n].width=form.size_x; + (*list)[n].length=form.size_y; + (*list)[n].left=form.left; + (*list)[n].top=form.top; + (*list)[n].right=form.right; + (*list)[n].bottom=form.bottom; } @@ -1123,6 +1142,7 @@ uint32 free_a_printer(NT_PRINTER_INFO_LEVEL printer, uint32 level) { next_param=param->next; DEBUG(6,("deleting param [%s]\n", param->value)); + free(param->data); free(param); param=next_param; } @@ -1196,6 +1216,8 @@ uint32 get_a_printer_driver(NT_PRINTER_DRIVER_INFO_LEVEL *driver, uint32 level, uint32 free_a_printer_driver(NT_PRINTER_DRIVER_INFO_LEVEL driver, uint32 level) { uint32 success; + NT_PRINTER_DRIVER_INFO_LEVEL_3 *info3; + char **dependentfiles; switch (level) { @@ -1203,7 +1225,22 @@ uint32 free_a_printer_driver(NT_PRINTER_DRIVER_INFO_LEVEL driver, uint32 level) { if (driver.info_3 != NULL) { - free(driver.info_3); + info3=driver.info_3; + dependentfiles=info3->dependentfiles; + + while ( **dependentfiles != '\0' ) + { + free (*dependentfiles); + dependentfiles++; + } + + /* the last one (1 char !) */ + free (*dependentfiles); + + dependentfiles=info3->dependentfiles; + free (dependentfiles); + + free(info3); success=0; } else diff --git a/source3/rpc_server/srv_spoolss.c b/source3/rpc_server/srv_spoolss.c index eee3fcbe68..736ed07dca 100755 --- a/source3/rpc_server/srv_spoolss.c +++ b/source3/rpc_server/srv_spoolss.c @@ -1728,7 +1728,7 @@ static void enum_all_printers_info_2(PRINTER_INFO_2 ***printers, uint32 *number, { DEBUG(4,("Found a printer: %s[%x]\n",lp_servicename(snum),snum)); *printers=Realloc(*printers, (*number+1)*sizeof(PRINTER_INFO_2 *)); - DEBUG(4,("ReAlloced memory for [%d] PRINTER_INFO_1 pointers at [%p]\n", *number+1, *printers)); + DEBUG(4,("ReAlloced memory for [%d] PRINTER_INFO_2 pointers at [%p]\n", *number+1, *printers)); if (enum_printer_info_2( &((*printers)[*number]), snum, *number, conn) ) { (*number)++; @@ -2071,7 +2071,6 @@ static void make_unistr_array(UNISTR ***uni_array, char **char_array, char *wher DEBUGADD(7,("last one\n")); *uni_array=(UNISTR **)Realloc(*uni_array, sizeof(UNISTR *)*(i+1)); - (*uni_array)[i]=(UNISTR *)malloc( sizeof(UNISTR)); (*uni_array)[i]=0x0000; DEBUGADD(6,("last one:done\n")); } @@ -2190,8 +2189,20 @@ static void spoolss_reply_getprinterdriver2(SPOOL_Q_GETPRINTERDRIVER2 *q_u, prs_ if (info1!=NULL) free(info1); if (info2!=NULL) free(info2); - if (info3!=NULL) free(info3); + if (info3!=NULL) + { + UNISTR **dependentfiles; + int j=0; + dependentfiles=info3->dependentfiles; + while ( dependentfiles[j] != NULL ) + { + free(dependentfiles[j]); + j++; + } + free(dependentfiles); + free(info3); + } } /******************************************************************** @@ -3055,6 +3066,20 @@ static void spoolss_reply_enumprinterdrivers(SPOOL_Q_ENUMPRINTERDRIVERS *q_u, pr } case 3: { + UNISTR **dependentfiles; + + for (i=0; i<count; i++) + { + int j=0; + dependentfiles=(driver_info_3[i]).dependentfiles; + while ( dependentfiles[j] != NULL ) + { + free(dependentfiles[j]); + j++; + } + + free(dependentfiles); + } free(driver_info_3); break; } @@ -3617,6 +3642,8 @@ static void spoolss_reply_enumprintprocessors(SPOOL_Q_ENUMPRINTPROCESSORS *q_u, r_u.info_1=info_1; spoolss_io_r_enumprintprocessors("", &r_u, rdata, 0); + + free(info_1); } /**************************************************************************** @@ -3629,6 +3656,8 @@ static void api_spoolss_enumprintprocessors(pipes_struct *p, prs_struct *data, spoolss_io_q_enumprintprocessors("", &q_u, data, 0); spoolss_reply_enumprintprocessors(&q_u, rdata); + + spoolss_io_free_buffer(&(q_u.buffer)); } /**************************************************************************** @@ -3660,6 +3689,8 @@ static void spoolss_reply_enumprintmonitors(SPOOL_Q_ENUMPRINTMONITORS *q_u, prs_ r_u.info_1=info_1; spoolss_io_r_enumprintmonitors("", &r_u, rdata, 0); + + free(info_1); } /**************************************************************************** @@ -3672,6 +3703,8 @@ static void api_spoolss_enumprintmonitors(pipes_struct *p, prs_struct *data, spoolss_io_q_enumprintmonitors("", &q_u, data, 0); spoolss_reply_enumprintmonitors(&q_u, rdata); + + spoolss_io_free_buffer(&(q_u.buffer)); } /**************************************************************************** |