diff options
| -rw-r--r-- | source3/printing/nt_printing.c | 157 | 
1 files changed, 134 insertions, 23 deletions
diff --git a/source3/printing/nt_printing.c b/source3/printing/nt_printing.c index af651d76fe..180154218c 100644 --- a/source3/printing/nt_printing.c +++ b/source3/printing/nt_printing.c @@ -376,12 +376,12 @@ static uint32 add_a_printer_driver_3(NT_PRINTER_DRIVER_INFO_LEVEL_3 *driver)  ****************************************************************************/  static uint32 get_a_printer_driver_3(NT_PRINTER_DRIVER_INFO_LEVEL_3 **info_ptr, fstring in_prt, fstring in_arch)  { -	FILE *f; +	FILE *f = NULL;  	pstring file;  	fstring driver_name;  	fstring architecture; -	NT_PRINTER_DRIVER_INFO_LEVEL_3 *info; -	char *line; +	NT_PRINTER_DRIVER_INFO_LEVEL_3 *info = NULL; +	char *line = NULL;  	fstring p;  	char *v;  	int i=0; @@ -402,16 +402,19 @@ static uint32 get_a_printer_driver_3(NT_PRINTER_DRIVER_INFO_LEVEL_3 **info_ptr,  	if((f = sys_fopen(file, "r")) == NULL)  	{ -		DEBUG(2, ("cannot open printer driver file [%s]\n", file)); +		DEBUG(2, ("get_a_printer_driver_3: Cannot open printer driver file [%s]. Error was %s\n", file, strerror(errno) ));  		return(2);  	}  	/* the file exists, allocate some memory */ -	info=(NT_PRINTER_DRIVER_INFO_LEVEL_3 *)malloc(sizeof(NT_PRINTER_DRIVER_INFO_LEVEL_3)); +	if((info=(NT_PRINTER_DRIVER_INFO_LEVEL_3 *)malloc(sizeof(NT_PRINTER_DRIVER_INFO_LEVEL_3))) == NULL) +		goto err; +  	ZERO_STRUCTP(info);  	/* allocate a 4Kbytes buffer for parsing lines */ -	line=(char *)malloc(4096*sizeof(char)); +	if((line=(char *)malloc(4096*sizeof(char))) == NULL) +		goto err;  	while ( fgets(line, 4095, f) )  	{ @@ -459,9 +462,11 @@ static uint32 get_a_printer_driver_3(NT_PRINTER_DRIVER_INFO_LEVEL_3 **info_ptr,  		if (!strncmp(p, "dependentfile", strlen("dependentfile")))  		{ -			dependentfiles=(char **)Realloc(dependentfiles, sizeof(char *)*(i+1)); +			if((dependentfiles=(char **)Realloc(dependentfiles, sizeof(char *)*(i+1))) == NULL) +				goto err; -			dependentfiles[i]=(char *)malloc( sizeof(char)* (strlen(v)+1) ); +			if((dependentfiles[i]=(char *)malloc( sizeof(char)* (strlen(v)+1) )) == NULL) +				goto err;  			StrnCpy(dependentfiles[i], v, strlen(v) );  			i++; @@ -481,6 +486,25 @@ static uint32 get_a_printer_driver_3(NT_PRINTER_DRIVER_INFO_LEVEL_3 **info_ptr,  	*info_ptr=info;  	return (0);	 + +  err: + +	if(f) +		fclose(f); +	if(line) +		free(line); +	if(info) +		free(info); + +	if(dependentfiles) { +		for(;i >= 0; i--) +			if(dependentfiles[i]) +				free(dependentfiles[i]); + +		free(dependentfiles); +	} + +	return (2);  }  /**************************************************************************** @@ -690,7 +714,7 @@ fill a NT_PRINTER_PARAM from a text file  used when reading from disk.  ****************************************************************************/ -static void dissect_and_fill_a_param(NT_PRINTER_PARAM *param, char *v) +static BOOL dissect_and_fill_a_param(NT_PRINTER_PARAM *param, char *v)  {  	char *tok[5];  	int count = 0; @@ -708,11 +732,13 @@ static void dissect_and_fill_a_param(NT_PRINTER_PARAM *param, char *v)  	StrnCpy(param->value, tok[0], sizeof(param->value)-1);  	param->type=atoi(tok[1]);  	param->data_len=atoi(tok[2]); -	param->data=(uint8 *)malloc(param->data_len * sizeof(uint8));			 +	if((param->data=(uint8 *)malloc(param->data_len * sizeof(uint8))) == NULL) +		return False;  	strhex_to_str(param->data, 2*(param->data_len), tok[3]);		  	param->next=NULL;	  	DEBUGADD(105,("value:[%s], len:[%d]\n", param->value, param->data_len)); +	return True;  }  /**************************************************************************** @@ -796,18 +822,79 @@ 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) +{ +	NT_PRINTER_PARAM *param = *param_ptr; + +	if(param == NULL) +		return; + +	if(param->data) +		free(param->data); + +	free(param); +	*param_ptr = NULL; +} + +/**************************************************************************** + Clean up and deallocate a (maybe partially) allocated NT_DEVICEMODE. +****************************************************************************/ + +static void free_nt_devicemode(NT_DEVICEMODE **devmode_ptr) +{ +	NT_DEVICEMODE *nt_devmode = *devmode_ptr; + +	if(nt_devmode == NULL) +		return; + +	if(nt_devmode->private) +		free(nt_devmode->private); + +	free(nt_devmode); +	*devmode_ptr = NULL; +} + +/**************************************************************************** + Clean up and deallocate a (maybe partially) allocated NT_PRINTER_INFO_LEVEL_2. +****************************************************************************/ + +static void free_nt_printer_info_level_2(NT_PRINTER_INFO_LEVEL_2 **info_ptr) +{ +	NT_PRINTER_INFO_LEVEL_2 *info = *info_ptr; +	NT_PRINTER_PARAM *param_ptr; + +	if(info == NULL) +		return; + +	free_nt_devicemode(&info->devmode); + +	for(param_ptr = info->specific; param_ptr; ) { +		NT_PRINTER_PARAM *tofree = param_ptr; + +		param_ptr = param_ptr->next; +		free_nt_printer_param(&tofree); +	} + +	free(info); +	*info_ptr = NULL; +} + +/****************************************************************************  ****************************************************************************/  static uint32 get_a_printer_2(NT_PRINTER_INFO_LEVEL_2 **info_ptr, fstring sharename)  { -	FILE *f; +	FILE *f = NULL;  	pstring file;  	fstring printer_name; -	NT_PRINTER_INFO_LEVEL_2 *info; -	NT_DEVICEMODE *nt_devmode; -	NT_PRINTER_PARAM *param; -	char *line; +	NT_PRINTER_INFO_LEVEL_2 *info = NULL; +	NT_DEVICEMODE *nt_devmode = NULL; +	NT_PRINTER_PARAM *param = NULL; +	char *line = NULL;  	fstring p; -	char *v; +	char *v = NULL;  	/*  	 * the sharename argument is the SAMBA sharename @@ -819,21 +906,26 @@ static uint32 get_a_printer_2(NT_PRINTER_INFO_LEVEL_2 **info_ptr, fstring sharen  	if((f = sys_fopen(file, "r")) == NULL)  	{ -		DEBUG(2, ("cannot open printer file [%s]\n", file)); +		DEBUG(2, ("get_a_printer_2: Cannot open printer file [%s]. Error was %s\n", file, strerror(errno) ));  		return(2);  	}  	/* the file exists, allocate some memory */ -	info=(NT_PRINTER_INFO_LEVEL_2 *)malloc(sizeof(NT_PRINTER_INFO_LEVEL_2)); +	if((info=(NT_PRINTER_INFO_LEVEL_2 *)malloc(sizeof(NT_PRINTER_INFO_LEVEL_2))) == NULL) +		goto err; +  	ZERO_STRUCTP(info); -	nt_devmode=(NT_DEVICEMODE *)malloc(sizeof(NT_DEVICEMODE)); +	if((nt_devmode=(NT_DEVICEMODE *)malloc(sizeof(NT_DEVICEMODE))) == NULL) +		goto err; +  	ZERO_STRUCTP(nt_devmode);  	init_devicemode(nt_devmode);  	info->devmode=nt_devmode; -	line=(char *)malloc(4096*sizeof(char)); +	if((line=(char *)malloc(4096*sizeof(char))) == NULL) +		goto err;  	while ( fgets(line, 4095, f) )  	{ @@ -998,7 +1090,9 @@ static uint32 get_a_printer_2(NT_PRINTER_INFO_LEVEL_2 **info_ptr, fstring sharen  		if (!strncmp(p, "private", strlen("private")))  		{ -			nt_devmode->private=(uint8 *)malloc(nt_devmode->driverextra*sizeof(uint8)); +			if((nt_devmode->private=(uint8 *)malloc(nt_devmode->driverextra*sizeof(uint8))) == NULL) +				goto err; +  			strhex_to_str(nt_devmode->private, 2*nt_devmode->driverextra, v);  		} @@ -1006,10 +1100,13 @@ static uint32 get_a_printer_2(NT_PRINTER_INFO_LEVEL_2 **info_ptr, fstring sharen  		if (!strncmp(p, "specific", strlen("specific")))  		{ -			param=(NT_PRINTER_PARAM *)malloc(sizeof(NT_PRINTER_PARAM)); +			if((param=(NT_PRINTER_PARAM *)malloc(sizeof(NT_PRINTER_PARAM))) == NULL) +				goto err; +  			ZERO_STRUCTP(param); -			dissect_and_fill_a_param(param, v); +			if(!dissect_and_fill_a_param(param, v)) +				goto err;  			dump_a_param(param); @@ -1023,6 +1120,16 @@ static uint32 get_a_printer_2(NT_PRINTER_INFO_LEVEL_2 **info_ptr, fstring sharen  	*info_ptr=info;  	return (0);	 + +  err: + +	if(f) +		fclose(f); +	if(info) +		free_nt_printer_info_level_2(&info); +	if(line) +		free(line); +	return(2);  }  /**************************************************************************** @@ -1303,6 +1410,8 @@ BOOL get_specific_param_by_index(NT_PRINTER_INFO_LEVEL printer, uint32 level, ui  	*type=param->type;		  	StrnCpy(value, param->value, sizeof(fstring)-1);  	*data=(uint8 *)malloc(param->data_len*sizeof(uint8)); +	if(*data == NULL) +		return False;  	memcpy(*data, param->data, param->data_len);  	*len=param->data_len;  	return True; @@ -1336,6 +1445,8 @@ BOOL get_specific_param(NT_PRINTER_INFO_LEVEL printer, uint32 level,  		*type=param->type;	  		*data=(uint8 *)malloc(param->data_len*sizeof(uint8)); +		if(*data == NULL) +			return False;  		memcpy(*data, param->data, param->data_len);  		*len=param->data_len;  | 
