summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeremy Allison <jra@samba.org>2000-11-17 02:22:35 +0000
committerJeremy Allison <jra@samba.org>2000-11-17 02:22:35 +0000
commit475fb713a9427b54c747a4e71a011c7db29d5e13 (patch)
tree201275f216533a9e30675ce35a6f8d21595ab8fb
parent08036f0f3d3a1dbddc6b3aaba976670e80e47cab (diff)
downloadsamba-475fb713a9427b54c747a4e71a011c7db29d5e13.tar.gz
samba-475fb713a9427b54c747a4e71a011c7db29d5e13.tar.bz2
samba-475fb713a9427b54c747a4e71a011c7db29d5e13.zip
Fix for memory leak when adding driver.
Jeremy. (This used to be commit eeab4e0290f9df84025e91c85d27b21e0c02781f)
-rw-r--r--source3/include/proto.h3
-rw-r--r--source3/printing/nt_printing.c13
-rw-r--r--source3/rpc_parse/parse_spoolss.c2
-rw-r--r--source3/rpc_server/srv_spoolss_nt.c8
4 files changed, 14 insertions, 12 deletions
diff --git a/source3/include/proto.h b/source3/include/proto.h
index d8d7180cc1..27d4c12123 100644
--- a/source3/include/proto.h
+++ b/source3/include/proto.h
@@ -1751,8 +1751,9 @@ uint32 clean_up_driver_struct(NT_PRINTER_DRIVER_INFO_LEVEL driver_abstract,
BOOL move_driver_to_download_area(NT_PRINTER_DRIVER_INFO_LEVEL driver_abstract, uint32 level, struct current_user *user, uint32 *perr);
uint32 get_a_printer_driver_9x_compatible(pstring line, fstring model);
uint32 del_a_printer(char *sharename);
-BOOL add_a_specific_param(NT_PRINTER_INFO_LEVEL_2 *info_2, NT_PRINTER_PARAM *param);
+void add_a_specific_param(NT_PRINTER_INFO_LEVEL_2 *info_2, NT_PRINTER_PARAM **param);
BOOL unlink_specific_param_if_exist(NT_PRINTER_INFO_LEVEL_2 *info_2, NT_PRINTER_PARAM *param);
+void free_nt_printer_param(NT_PRINTER_PARAM **param_ptr);
NT_DEVICEMODE *construct_nt_devicemode(const fstring default_devicename);
NT_DEVICEMODE *dup_nt_devicemode(NT_DEVICEMODE *nt_devicemode);
void free_nt_devicemode(NT_DEVICEMODE **devmode_ptr);
diff --git a/source3/printing/nt_printing.c b/source3/printing/nt_printing.c
index 34d9538752..bbe01b87f6 100644
--- a/source3/printing/nt_printing.c
+++ b/source3/printing/nt_printing.c
@@ -1777,17 +1777,17 @@ static uint32 update_a_printer_2(NT_PRINTER_INFO_LEVEL_2 *info)
/****************************************************************************
****************************************************************************/
-BOOL add_a_specific_param(NT_PRINTER_INFO_LEVEL_2 *info_2, NT_PRINTER_PARAM *param)
+void add_a_specific_param(NT_PRINTER_INFO_LEVEL_2 *info_2, NT_PRINTER_PARAM **param)
{
NT_PRINTER_PARAM *current;
DEBUG(108,("add_a_specific_param\n"));
- param->next=NULL;
+ (*param)->next=NULL;
if (info_2->specific == NULL)
{
- info_2->specific=param;
+ info_2->specific=*param;
}
else
{
@@ -1795,9 +1795,10 @@ BOOL add_a_specific_param(NT_PRINTER_INFO_LEVEL_2 *info_2, NT_PRINTER_PARAM *par
while (current->next != NULL) {
current=current->next;
}
- current->next=param;
+ current->next=*param;
}
- return (True);
+
+ *param = NULL;
}
/****************************************************************************
@@ -1844,7 +1845,7 @@ BOOL unlink_specific_param_if_exist(NT_PRINTER_INFO_LEVEL_2 *info_2, NT_PRINTER_
/****************************************************************************
Clean up and deallocate a (maybe partially) allocated NT_PRINTER_PARAM.
****************************************************************************/
-static void free_nt_printer_param(NT_PRINTER_PARAM **param_ptr)
+void free_nt_printer_param(NT_PRINTER_PARAM **param_ptr)
{
NT_PRINTER_PARAM *param = *param_ptr;
diff --git a/source3/rpc_parse/parse_spoolss.c b/source3/rpc_parse/parse_spoolss.c
index c4196b0334..61206d4e70 100644
--- a/source3/rpc_parse/parse_spoolss.c
+++ b/source3/rpc_parse/parse_spoolss.c
@@ -5338,7 +5338,7 @@ BOOL convert_specific_param(NT_PRINTER_PARAM **param, const UNISTR2 *value,
*param=(NT_PRINTER_PARAM *)malloc(sizeof(NT_PRINTER_PARAM));
if(*param == NULL)
return False;
- ZERO_STRUCTP(*param);
+ memset((char *)*param, '\0', sizeof(NT_PRINTER_PARAM));
DEBUGADD(6,("Allocated a new PARAM struct\n"));
}
unistr2_to_ascii((*param)->value, value, sizeof((*param)->value)-1);
diff --git a/source3/rpc_server/srv_spoolss_nt.c b/source3/rpc_server/srv_spoolss_nt.c
index 30acc14904..a04c85368f 100644
--- a/source3/rpc_server/srv_spoolss_nt.c
+++ b/source3/rpc_server/srv_spoolss_nt.c
@@ -5198,13 +5198,13 @@ uint32 _spoolss_setprinterdata( POLICY_HND *handle,
unlink_specific_param_if_exist(printer->info_2, param);
- if (!add_a_specific_param(printer->info_2, param))
- status = ERROR_INVALID_PARAMETER;
- else
- status = mod_a_printer(*printer, 2);
+ add_a_specific_param(printer->info_2, &param);
+ status = mod_a_printer(*printer, 2);
done:
free_a_printer(&printer, 2);
+ if (param)
+ free_nt_printer_param(&param);
safe_free(old_param.data);
return status;