Loading mysys/default.c +121 −14 Original line number Diff line number Diff line Loading @@ -73,7 +73,7 @@ static int search_default_file(DYNAMIC_ARRAY *args,MEM_ROOT *alloc, static int search_default_file_with_ext(DYNAMIC_ARRAY *args, MEM_ROOT *alloc, const char *dir, const char *ext, const char *config_file, TYPELIB *group); TYPELIB *group, int recursion_level); static char *remove_end_comment(char *ptr); Loading Loading @@ -194,7 +194,7 @@ int load_defaults(const char *conf_file, const char **groups, { if ((error= search_default_file_with_ext(&args, &alloc, "", "", forced_default_file, &group)) < 0) &group, 0)) < 0) goto err; if (error > 0) { Loading Loading @@ -311,7 +311,7 @@ static int search_default_file(DYNAMIC_ARRAY *args, MEM_ROOT *alloc, { int error; if ((error= search_default_file_with_ext(args, alloc, dir, *ext, config_file, group)) < 0) config_file, group, 0)) < 0) return error; } return 0; Loading @@ -326,9 +326,11 @@ static int search_default_file(DYNAMIC_ARRAY *args, MEM_ROOT *alloc, args Store pointer to found options here alloc Allocate strings in this object dir directory to read config_file Name of configuration file ext Extension for configuration file config_file Name of configuration file group groups to read recursion_level the level of recursion, got while processing "!include" or "!includedir" RETURN 0 Success Loading @@ -340,12 +342,18 @@ static int search_default_file(DYNAMIC_ARRAY *args, MEM_ROOT *alloc, static int search_default_file_with_ext(DYNAMIC_ARRAY *args, MEM_ROOT *alloc, const char *dir, const char *ext, const char *config_file, TYPELIB *group) TYPELIB *group, int recursion_level) { char name[FN_REFLEN+10],buff[4096],*ptr,*end,*value,*tmp; char name[FN_REFLEN + 10], buff[4096], *ptr, *end, *value, *tmp, **tmp_ext; static const char includedir_keyword[]= "includedir"; static const char include_keyword[]= "include"; const int max_recursion_level= 10; FILE *fp; uint line= 0; my_bool read_values= 0, found_group= 0; uint i; MY_DIR *search_dir; FILEINFO *search_file; if ((dir ? strlen(dir) : 0 )+strlen(config_file) >= FN_REFLEN-3) return 0; /* Ignore wrong paths */ Loading Loading @@ -374,7 +382,7 @@ static int search_default_file_with_ext(DYNAMIC_ARRAY *args, MEM_ROOT *alloc, if ((stat_info.st_mode & S_IWOTH) && (stat_info.st_mode & S_IFMT) == S_IFREG) { fprintf(stderr, "warning: World-writeable config file %s is ignored\n", fprintf(stderr, "warning: World-writable config file %s is ignored\n", name); return 0; } Loading @@ -387,9 +395,108 @@ static int search_default_file_with_ext(DYNAMIC_ARRAY *args, MEM_ROOT *alloc, { line++; /* Ignore comment and empty lines */ for (ptr=buff ; my_isspace(&my_charset_latin1,*ptr) ; ptr++ ) ; for (ptr= buff; my_isspace(&my_charset_latin1, *ptr); ptr++) {} if (*ptr == '#' || *ptr == ';' || !*ptr) continue; /* Configuration File Directives */ if ((*ptr == '!') && (recursion_level < max_recursion_level)) { /* skip over `!' and following whitespace */ for (++ptr; my_isspace(&my_charset_latin1, ptr[0]); ptr++) {} if ((!strncmp(ptr, includedir_keyword, sizeof(includedir_keyword) - 1)) && my_isspace(&my_charset_latin1, ptr[sizeof(includedir_keyword) - 1])) { /* skip over "includedir" and following whitespace */ for (ptr+= sizeof(includedir_keyword) - 1; my_isspace(&my_charset_latin1, ptr[0]); ptr++) {} /* trim trailing whitespace from directory name */ end= ptr + strlen(ptr) - 1; /* This would work fine even if no whitespaces are met since fgets() stores the newline character in the buffer */ for (; my_isspace(&my_charset_latin1, *(end - 1)); end--) {} end[0]= 0; /* print error msg if there is nothing after !inludedir directive */ if (end == ptr) { fprintf(stderr, "error: Wrong !includedir directive in config " "file: %s at line %d\n", name,line); goto err; } if (!(search_dir= my_dir(ptr, MYF(MY_WME)))) goto err; for (i= 0; i < (uint) search_dir->number_off_files; i++) { search_file= search_dir->dir_entry + i; ext= fn_ext(search_file->name); /* check extenstion */ for (tmp_ext= (char**) f_extensions; *tmp_ext; *tmp_ext++) { if (!strcmp(ext, *tmp_ext)) break; } if (*tmp_ext) { if (!(tmp= alloc_root(alloc, 2 + strlen(search_file->name) + strlen(ptr)))) goto err; fn_format(tmp, search_file->name, ptr, "", MY_UNPACK_FILENAME | MY_SAFE_PATH); search_default_file_with_ext(args, alloc, "", "", tmp, group, recursion_level + 1); } } my_dirend(search_dir); } else if ((!strncmp(ptr, include_keyword, sizeof(include_keyword) - 1)) && my_isspace(&my_charset_latin1, ptr[sizeof(include_keyword) - 1])) { /* skip over `include' and following whitespace */ for (ptr+= sizeof(include_keyword) - 1; my_isspace(&my_charset_latin1, ptr[0]); ptr++) {} /* trim trailing whitespace from filename */ end= ptr + strlen(ptr) - 1; for (; my_isspace(&my_charset_latin1, *(end - 1)) ; end--) {} end[0]= 0; if (end == ptr) { fprintf(stderr, "error: Wrong !include directive in config " "file: %s at line %d\n", name,line); goto err; } search_default_file_with_ext(args, alloc, "", "", ptr, group, recursion_level + 1); } continue; } if (*ptr == '[') /* Group name */ { found_group=1; Loading Loading
mysys/default.c +121 −14 Original line number Diff line number Diff line Loading @@ -73,7 +73,7 @@ static int search_default_file(DYNAMIC_ARRAY *args,MEM_ROOT *alloc, static int search_default_file_with_ext(DYNAMIC_ARRAY *args, MEM_ROOT *alloc, const char *dir, const char *ext, const char *config_file, TYPELIB *group); TYPELIB *group, int recursion_level); static char *remove_end_comment(char *ptr); Loading Loading @@ -194,7 +194,7 @@ int load_defaults(const char *conf_file, const char **groups, { if ((error= search_default_file_with_ext(&args, &alloc, "", "", forced_default_file, &group)) < 0) &group, 0)) < 0) goto err; if (error > 0) { Loading Loading @@ -311,7 +311,7 @@ static int search_default_file(DYNAMIC_ARRAY *args, MEM_ROOT *alloc, { int error; if ((error= search_default_file_with_ext(args, alloc, dir, *ext, config_file, group)) < 0) config_file, group, 0)) < 0) return error; } return 0; Loading @@ -326,9 +326,11 @@ static int search_default_file(DYNAMIC_ARRAY *args, MEM_ROOT *alloc, args Store pointer to found options here alloc Allocate strings in this object dir directory to read config_file Name of configuration file ext Extension for configuration file config_file Name of configuration file group groups to read recursion_level the level of recursion, got while processing "!include" or "!includedir" RETURN 0 Success Loading @@ -340,12 +342,18 @@ static int search_default_file(DYNAMIC_ARRAY *args, MEM_ROOT *alloc, static int search_default_file_with_ext(DYNAMIC_ARRAY *args, MEM_ROOT *alloc, const char *dir, const char *ext, const char *config_file, TYPELIB *group) TYPELIB *group, int recursion_level) { char name[FN_REFLEN+10],buff[4096],*ptr,*end,*value,*tmp; char name[FN_REFLEN + 10], buff[4096], *ptr, *end, *value, *tmp, **tmp_ext; static const char includedir_keyword[]= "includedir"; static const char include_keyword[]= "include"; const int max_recursion_level= 10; FILE *fp; uint line= 0; my_bool read_values= 0, found_group= 0; uint i; MY_DIR *search_dir; FILEINFO *search_file; if ((dir ? strlen(dir) : 0 )+strlen(config_file) >= FN_REFLEN-3) return 0; /* Ignore wrong paths */ Loading Loading @@ -374,7 +382,7 @@ static int search_default_file_with_ext(DYNAMIC_ARRAY *args, MEM_ROOT *alloc, if ((stat_info.st_mode & S_IWOTH) && (stat_info.st_mode & S_IFMT) == S_IFREG) { fprintf(stderr, "warning: World-writeable config file %s is ignored\n", fprintf(stderr, "warning: World-writable config file %s is ignored\n", name); return 0; } Loading @@ -387,9 +395,108 @@ static int search_default_file_with_ext(DYNAMIC_ARRAY *args, MEM_ROOT *alloc, { line++; /* Ignore comment and empty lines */ for (ptr=buff ; my_isspace(&my_charset_latin1,*ptr) ; ptr++ ) ; for (ptr= buff; my_isspace(&my_charset_latin1, *ptr); ptr++) {} if (*ptr == '#' || *ptr == ';' || !*ptr) continue; /* Configuration File Directives */ if ((*ptr == '!') && (recursion_level < max_recursion_level)) { /* skip over `!' and following whitespace */ for (++ptr; my_isspace(&my_charset_latin1, ptr[0]); ptr++) {} if ((!strncmp(ptr, includedir_keyword, sizeof(includedir_keyword) - 1)) && my_isspace(&my_charset_latin1, ptr[sizeof(includedir_keyword) - 1])) { /* skip over "includedir" and following whitespace */ for (ptr+= sizeof(includedir_keyword) - 1; my_isspace(&my_charset_latin1, ptr[0]); ptr++) {} /* trim trailing whitespace from directory name */ end= ptr + strlen(ptr) - 1; /* This would work fine even if no whitespaces are met since fgets() stores the newline character in the buffer */ for (; my_isspace(&my_charset_latin1, *(end - 1)); end--) {} end[0]= 0; /* print error msg if there is nothing after !inludedir directive */ if (end == ptr) { fprintf(stderr, "error: Wrong !includedir directive in config " "file: %s at line %d\n", name,line); goto err; } if (!(search_dir= my_dir(ptr, MYF(MY_WME)))) goto err; for (i= 0; i < (uint) search_dir->number_off_files; i++) { search_file= search_dir->dir_entry + i; ext= fn_ext(search_file->name); /* check extenstion */ for (tmp_ext= (char**) f_extensions; *tmp_ext; *tmp_ext++) { if (!strcmp(ext, *tmp_ext)) break; } if (*tmp_ext) { if (!(tmp= alloc_root(alloc, 2 + strlen(search_file->name) + strlen(ptr)))) goto err; fn_format(tmp, search_file->name, ptr, "", MY_UNPACK_FILENAME | MY_SAFE_PATH); search_default_file_with_ext(args, alloc, "", "", tmp, group, recursion_level + 1); } } my_dirend(search_dir); } else if ((!strncmp(ptr, include_keyword, sizeof(include_keyword) - 1)) && my_isspace(&my_charset_latin1, ptr[sizeof(include_keyword) - 1])) { /* skip over `include' and following whitespace */ for (ptr+= sizeof(include_keyword) - 1; my_isspace(&my_charset_latin1, ptr[0]); ptr++) {} /* trim trailing whitespace from filename */ end= ptr + strlen(ptr) - 1; for (; my_isspace(&my_charset_latin1, *(end - 1)) ; end--) {} end[0]= 0; if (end == ptr) { fprintf(stderr, "error: Wrong !include directive in config " "file: %s at line %d\n", name,line); goto err; } search_default_file_with_ext(args, alloc, "", "", ptr, group, recursion_level + 1); } continue; } if (*ptr == '[') /* Group name */ { found_group=1; Loading