[server] fix directory handle leak in failure condition, switch to strlcpy and strlcat for %include folder parsing

This commit is contained in:
Michael Rash 2015-12-12 12:30:24 -08:00
parent ba3d16c5e3
commit f2e6b6cc68

View File

@ -1353,7 +1353,7 @@ parse_access_folder(fko_srv_options_t *opts, char *access_folder, int *depth)
char *extension; char *extension;
DIR *dir_ptr; DIR *dir_ptr;
char include_file[MAX_PATH_LEN] ={0}; char include_file[MAX_PATH_LEN] = {0};
struct dirent *dp; struct dirent *dp;
(*depth)++; (*depth)++;
@ -1381,10 +1381,13 @@ parse_access_folder(fko_srv_options_t *opts, char *access_folder, int *depth)
if (extension && !strcmp(extension, ".conf")) if (extension && !strcmp(extension, ".conf"))
{ {
if (strlen(access_folder) + 1 + strlen(dp->d_name) > MAX_PATH_LEN - 1) //Bail out rather than write past the end of include_file if (strlen(access_folder) + 1 + strlen(dp->d_name) > MAX_PATH_LEN - 1) //Bail out rather than write past the end of include_file
{
closedir(dir_ptr);
return EXIT_FAILURE; return EXIT_FAILURE;
strcpy(include_file, access_folder); //construct the full path }
strcat(include_file, "/"); strlcpy(include_file, access_folder, sizeof(include_file)); //construct the full path
strcat(include_file, dp->d_name); strlcat(include_file, "/", sizeof(include_file));
strlcat(include_file, dp->d_name, sizeof(include_file));
if (parse_access_file(opts, include_file, depth) == EXIT_FAILURE) if (parse_access_file(opts, include_file, depth) == EXIT_FAILURE)
{ {
closedir(dir_ptr); closedir(dir_ptr);
@ -1392,7 +1395,7 @@ parse_access_folder(fko_srv_options_t *opts, char *access_folder, int *depth)
} }
} }
} }
closedir (dir_ptr); closedir(dir_ptr);
return EXIT_SUCCESS; return EXIT_SUCCESS;
} }
@ -1511,9 +1514,6 @@ parse_access_file(fko_srv_options_t *opts, char *access_filename, int *depth)
* NOTE: If a new access.conf parameter is created. It also needs * NOTE: If a new access.conf parameter is created. It also needs
* to be accounted for in the following if/if else construct. * to be accounted for in the following if/if else construct.
*/ */
if(CONF_VAR_IS(var, "%include")) if(CONF_VAR_IS(var, "%include"))
{ {
if ((*depth) < MAX_DEPTH) if ((*depth) < MAX_DEPTH)