Commit 1ac58893 authored by petr@mysql.com's avatar petr@mysql.com

Merge pchardin@bk-internal.mysql.com:/home/bk/mysql-5.0

into mysql.com:/home/cps/mysql/trees/mysql-5.0
parents f2e358d9 5e72092e
...@@ -20,6 +20,8 @@ ...@@ -20,6 +20,8 @@
#include <my_dir.h> #include <my_dir.h>
#define BUFF_SIZE 1024 #define BUFF_SIZE 1024
/* should be big enough to handle at least one line */
#define RESERVE 1024
#ifdef __WIN__ #ifdef __WIN__
#define NEWLINE "\r\n" #define NEWLINE "\r\n"
...@@ -66,8 +68,11 @@ int modify_defaults_file(const char *file_location, const char *option, ...@@ -66,8 +68,11 @@ int modify_defaults_file(const char *file_location, const char *option,
FILE *cnf_file; FILE *cnf_file;
MY_STAT file_stat; MY_STAT file_stat;
char linebuff[BUFF_SIZE], *src_ptr, *dst_ptr, *file_buffer; char linebuff[BUFF_SIZE], *src_ptr, *dst_ptr, *file_buffer;
uint opt_len, optval_len, sect_len, nr_newlines= 0; uint opt_len, optval_len, sect_len, nr_newlines= 0, buffer_size;
my_bool in_section= FALSE, opt_applied= 0; my_bool in_section= FALSE, opt_applied= 0;
uint reserve_extended= 1, old_opt_len= 0;
uint new_opt_len;
int reserve_occupied= 0;
DBUG_ENTER("modify_defaults_file"); DBUG_ENTER("modify_defaults_file");
if (!(cnf_file= my_fopen(file_location, O_RDWR | O_BINARY, MYF(0)))) if (!(cnf_file= my_fopen(file_location, O_RDWR | O_BINARY, MYF(0))))
...@@ -75,28 +80,33 @@ int modify_defaults_file(const char *file_location, const char *option, ...@@ -75,28 +80,33 @@ int modify_defaults_file(const char *file_location, const char *option,
/* my_fstat doesn't use the flag parameter */ /* my_fstat doesn't use the flag parameter */
if (my_fstat(fileno(cnf_file), &file_stat, MYF(0))) if (my_fstat(fileno(cnf_file), &file_stat, MYF(0)))
goto err; goto malloc_err;
opt_len= (uint) strlen(option); opt_len= (uint) strlen(option);
optval_len= (uint) strlen(option_value); optval_len= (uint) strlen(option_value);
/* new_opt_len= opt_len + 1 + optval_len + NEWLINE_LEN;
Reserve space to read the contents of the file and some more
for the option we want to add. /* calculate the size of the buffer we need */
*/ buffer_size= sizeof(char) * (file_stat.st_size +
if (!(file_buffer= (char*) my_malloc(sizeof(char) *
(file_stat.st_size +
/* option name len */ /* option name len */
opt_len + opt_len +
/* reserve space for newline */
NEWLINE_LEN +
/* reserve for '=' char */ /* reserve for '=' char */
1 + 1 +
/* option value len */ /* option value len */
optval_len + optval_len +
/* reserve space for newline */
NEWLINE_LEN +
/* The ending zero */ /* The ending zero */
1), MYF(MY_WME)))) 1 +
/* reserve some additional space */
RESERVE);
/*
Reserve space to read the contents of the file and some more
for the option we want to add.
*/
if (!(file_buffer= (char*) my_malloc(buffer_size, MYF(MY_WME))))
goto malloc_err; goto malloc_err;
sect_len= (uint) strlen(section_name); sect_len= (uint) strlen(section_name);
...@@ -115,13 +125,37 @@ int modify_defaults_file(const char *file_location, const char *option, ...@@ -115,13 +125,37 @@ int modify_defaults_file(const char *file_location, const char *option,
} }
/* correct the option */ /* correct the option */
if (!opt_applied && in_section && !strncmp(src_ptr, option, opt_len) && if (in_section && !strncmp(src_ptr, option, opt_len) &&
(*(src_ptr + opt_len) == '=' || (*(src_ptr + opt_len) == '=' ||
my_isspace(&my_charset_latin1, *(src_ptr + opt_len)) || my_isspace(&my_charset_latin1, *(src_ptr + opt_len)) ||
*(src_ptr + opt_len) == '\0')) *(src_ptr + opt_len) == '\0'))
{ {
dst_ptr= add_option(dst_ptr, option_value, option, remove_option); /*
we should change all options. If opt_applied is set, we are running
into reserved memory area. Hence we should check for overruns.
*/
if (opt_applied)
{
src_ptr+= opt_len; /* If we correct an option, we know it's name */
old_opt_len= opt_len;
while (*src_ptr++) /* Find the end of the line */
old_opt_len++;
/* could be negative */
reserve_occupied+= (int) new_opt_len - (int) old_opt_len;
if ((int) reserve_occupied > (int) (RESERVE*reserve_extended))
{
if (!(file_buffer= (char*) my_realloc(file_buffer, buffer_size +
RESERVE*reserve_extended,
MYF(MY_WME|MY_FREE_ON_ERROR))))
goto malloc_err;
reserve_extended++;
}
}
else
opt_applied= 1; opt_applied= 1;
dst_ptr= add_option(dst_ptr, option_value, option, remove_option);
} }
else else
{ {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment