Fix for memory leak when adding driver.
authorJeremy Allison <jra@samba.org>
Fri, 17 Nov 2000 02:22:35 +0000 (02:22 +0000)
committerJeremy Allison <jra@samba.org>
Fri, 17 Nov 2000 02:22:35 +0000 (02:22 +0000)
Jeremy.
(This used to be commit eeab4e0290f9df84025e91c85d27b21e0c02781f)

source3/include/proto.h
source3/printing/nt_printing.c
source3/rpc_parse/parse_spoolss.c
source3/rpc_server/srv_spoolss_nt.c

index d8d7180cc19048c6ff35720792dd6e9a9e6f490d..27d4c1212307fe1f7c9a9e7889d54c01722955ad 100644 (file)
@@ -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);
index 34d9538752ab752b530173faa76e8deec641dc0e..bbe01b87f6a9f9f11faa7981af0e8f605643d968 100644 (file)
@@ -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;
 
index c4196b033412a3fdd438ef076f391754f9474193..61206d4e7037991b851636c9d36c87127dcab865 100644 (file)
@@ -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);
index 30acc149049941b4720f819d9c7d06c6e76f461d..a04c85368f7c924ef028d7a00351ccae07f2360e 100644 (file)
@@ -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;