1
0
mirror of https://github.com/samba-team/samba.git synced 2024-12-25 23:21:54 +03:00

Don't duplicate forms anymore, just update the definition.

Many memory leaks fixed.

	J.F.
This commit is contained in:
Jean-François Micouleau 0001-01-01 00:00:00 +00:00
parent a893df5c00
commit f328ae8024
2 changed files with 87 additions and 17 deletions

View File

@ -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;
if (form.name_ptr)
{
unistr2_to_ascii((*list)[n].name, &(form.name), sizeof((*list)[n].name)-1);
}
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 (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

View File

@ -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));
}
/****************************************************************************