summaryrefslogtreecommitdiff
path: root/source3/printing
diff options
context:
space:
mode:
authorJean-François Micouleau <jfm@samba.org>1999-09-25 14:18:48 +0000
committerJean-François Micouleau <jfm@samba.org>1999-09-25 14:18:48 +0000
commit0490365b04564750d73eea36af0ba1444d1d3d77 (patch)
tree67e7e5ca707f6cfdd82657479e9176be363878d9 /source3/printing
parent7b88001235e6228ed672541f4afd2b06b610b8e1 (diff)
downloadsamba-0490365b04564750d73eea36af0ba1444d1d3d77.tar.gz
samba-0490365b04564750d73eea36af0ba1444d1d3d77.tar.bz2
samba-0490365b04564750d73eea36af0ba1444d1d3d77.zip
Don't duplicate forms anymore, just update the definition.
Many memory leaks fixed. J.F. (This used to be commit f328ae8024584599324ae4263bb9fb89a358279f)
Diffstat (limited to 'source3/printing')
-rw-r--r--source3/printing/nt_printing.c65
1 files changed, 51 insertions, 14 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