1
0
mirror of https://github.com/samba-team/samba.git synced 2025-01-26 10:04:02 +03:00

[s3]loadparm: refactor freeing of parameter data out and reduce memleak.

Add new functions free_parameter(), free_parameters() and
free_global_parameters() and use these in the appropriate places,
reducing code duplication.

Also, always TALLOC_FREE data of type P_LIST, thus reducing mem-leaks:
This had not been done in init_globals before.

Michael
This commit is contained in:
Michael Adam 2008-09-27 22:19:56 +02:00
parent e56c89b5e8
commit 3358a139d2

View File

@ -4572,6 +4572,54 @@ static void init_printer_values(struct service *pService)
}
}
/**
* Free the allocated data for one parameter for a given share.
*/
static void free_parameter(int snum, struct parm_struct parm)
{
void *parm_ptr;
if (parm.ptr == NULL); {
return;
}
if (snum < 0) {
parm_ptr = parm.ptr;
} else if (parm.p_class != P_LOCAL) {
return;
} else {
parm_ptr = lp_local_ptr(snum, parm.ptr);
}
if ((parm.type == P_STRING) ||
(parm.type == P_USTRING))
{
string_free((char**)parm_ptr);
} else if (parm.type == P_LIST) {
TALLOC_FREE(*((char***)parm_ptr));
}
}
/**
* Free the allocated parameter data for a share.
*/
static void free_parameters(int snum)
{
uint32_t i;
for (i=0; parm_table[i].label; i++) {
free_parameter(snum, parm_table[i]);
}
}
/**
* Free the allocated global parameters.
*/
static void free_global_parameters(void)
{
free_parameters(GLOBAL_SECTION_SNUM);
}
/***************************************************************************
Initialise the global parameter structure.
***************************************************************************/
@ -4596,14 +4644,7 @@ static void init_globals(bool first_time_only)
}
done_init = True;
} else {
for (i = 0; parm_table[i].label; i++) {
if ((parm_table[i].type == P_STRING ||
parm_table[i].type == P_USTRING) &&
parm_table[i].ptr)
{
string_free((char **)parm_table[i].ptr);
}
}
free_global_parameters();
}
memset((void *)&Globals, '\0', sizeof(Globals));
@ -5645,6 +5686,7 @@ static void init_service(struct service *pservice)
copy_service(pservice, &sDefault, NULL);
}
/**
* free a param_opts structure.
* param_opts handling should be moved to talloc;
@ -5680,7 +5722,6 @@ static void free_param_opts(struct param_opt_struct **popts)
static void free_service(struct service *pservice)
{
int i;
if (!pservice)
return;
@ -5688,24 +5729,11 @@ static void free_service(struct service *pservice)
DEBUG(5, ("free_service: Freeing service %s\n",
pservice->szService));
free_parameters(getservicebyname(pservice->szService, NULL));
string_free(&pservice->szService);
bitmap_free(pservice->copymap);
for (i = 0; parm_table[i].label; i++) {
if ((parm_table[i].type == P_STRING ||
parm_table[i].type == P_USTRING) &&
parm_table[i].p_class == P_LOCAL)
string_free((char **)
(((char *)pservice) +
PTR_DIFF(parm_table[i].ptr, &sDefault)));
else if (parm_table[i].type == P_LIST &&
parm_table[i].p_class == P_LOCAL)
TALLOC_FREE(*((char ***)
(((char *)pservice) +
PTR_DIFF(parm_table[i].ptr,
&sDefault))));
}
free_param_opts(&pservice->param_opt);
ZERO_STRUCTP(pservice);
@ -8728,17 +8756,7 @@ void gfree_loadparm(void)
/* Now release all resources allocated to global
parameters and the default service */
for (i = 0; parm_table[i].label; i++)
{
if ( parm_table[i].type == P_STRING
|| parm_table[i].type == P_USTRING )
{
string_free( (char**)parm_table[i].ptr );
}
else if (parm_table[i].type == P_LIST) {
TALLOC_FREE( *((char***)parm_table[i].ptr) );
}
}
free_global_parameters();
}