Commit 6b97c26a authored by unknown's avatar unknown

Added checking of return value from my_once_alloc() in charset

Added checking of return value from malloc() in reg_init()


client/mysqltest.c:
  Added comment
dbug/dbug.c:
  Removed not needed test
mysys/charset.c:
  Added checking of return value from my_once_alloc()
regex/reginit.c:
  Abort if out of memory in reg_init() (unlikely)
sql/item_strfunc.cc:
  Added comment
parent 4e85bf32
...@@ -2302,6 +2302,7 @@ static VAR* var_init(VAR* v, const char* name, int name_len, const char* val, ...@@ -2302,6 +2302,7 @@ static VAR* var_init(VAR* v, const char* name, int name_len, const char* val,
if (!(tmp_var->str_val = my_malloc(val_alloc_len+1, MYF(MY_WME)))) if (!(tmp_var->str_val = my_malloc(val_alloc_len+1, MYF(MY_WME))))
die("Out of memory"); die("Out of memory");
/* 'name' may be NULL here, but in this case name_len is 0 */
memcpy(tmp_var->name, name, name_len); memcpy(tmp_var->name, name, name_len);
if (val) if (val)
{ {
......
...@@ -501,7 +501,7 @@ void _db_push_ (const char *control) ...@@ -501,7 +501,7 @@ void _db_push_ (const char *control)
if (! _db_fp_) if (! _db_fp_)
_db_fp_= stderr; /* Output stream, default stderr */ _db_fp_= stderr; /* Output stream, default stderr */
if (control && *control == '-') if (*control == '-')
{ {
if (*++control == '#') if (*++control == '#')
control++; control++;
......
...@@ -300,7 +300,25 @@ static CHARSET_INFO *find_charset_by_name(CHARSET_INFO **table, ...@@ -300,7 +300,25 @@ static CHARSET_INFO *find_charset_by_name(CHARSET_INFO **table,
return NULL; return NULL;
} }
static CHARSET_INFO *add_charset(uint cs_number, const char *cs_name, myf flags) /*
Read charset from file.
NOTES
One never has to deallocate character sets. They will all be deallocated
by my_once_free() when program ends.
If my_once_alloc() fails then this function may 'leak' some memory
which my_once_free() will deallocate, but this is so unlikely to happen
that this can be ignored.
RETURN
0 Error
# Pointer to allocated charset structure
*/
static CHARSET_INFO *add_charset(uint cs_number, const char *cs_name,
myf flags)
{ {
CHARSET_INFO tmp_cs,*cs; CHARSET_INFO tmp_cs,*cs;
uchar tmp_ctype[CTYPE_TABLE_SIZE]; uchar tmp_ctype[CTYPE_TABLE_SIZE];
...@@ -317,21 +335,27 @@ static CHARSET_INFO *add_charset(uint cs_number, const char *cs_name, myf flags) ...@@ -317,21 +335,27 @@ static CHARSET_INFO *add_charset(uint cs_number, const char *cs_name, myf flags)
cs->sort_order=tmp_sort_order; cs->sort_order=tmp_sort_order;
cs->strxfrm_multiply=cs->mbmaxlen=1; cs->strxfrm_multiply=cs->mbmaxlen=1;
if (read_charset_file(cs_number, cs, flags)) if (read_charset_file(cs_number, cs, flags))
return NULL; return 0;
cs = (CHARSET_INFO*) my_once_alloc(sizeof(CHARSET_INFO), if (!(cs= (CHARSET_INFO*) my_once_alloc(sizeof(CHARSET_INFO),
MYF(MY_WME)); MYF(MY_WME))))
*cs=tmp_cs; return 0;
cs->name = (char *) my_once_alloc((uint) strlen(cs_name)+1, MYF(MY_WME));
cs->ctype = (uchar*) my_once_alloc(CTYPE_TABLE_SIZE, MYF(MY_WME)); *cs= tmp_cs;
cs->to_lower = (uchar*) my_once_alloc(TO_LOWER_TABLE_SIZE, MYF(MY_WME)); cs->name= (char *) my_once_alloc((uint) strlen(cs_name)+1, MYF(MY_WME));
cs->to_upper = (uchar*) my_once_alloc(TO_UPPER_TABLE_SIZE, MYF(MY_WME)); cs->ctype= (uchar*) my_once_alloc(CTYPE_TABLE_SIZE, MYF(MY_WME));
cs->to_lower= (uchar*) my_once_alloc(TO_LOWER_TABLE_SIZE, MYF(MY_WME));
cs->to_upper= (uchar*) my_once_alloc(TO_UPPER_TABLE_SIZE, MYF(MY_WME));
cs->sort_order=(uchar*) my_once_alloc(SORT_ORDER_TABLE_SIZE, MYF(MY_WME)); cs->sort_order=(uchar*) my_once_alloc(SORT_ORDER_TABLE_SIZE, MYF(MY_WME));
cs->number = cs_number; if (!cs->name || !cs->ctype || !cs->to_lower || !cs->to_upper ||
memcpy((char*) cs->name, (char*) cs_name, strlen(cs_name) + 1); !cs->sort_order)
memcpy((char*) cs->ctype, (char*) tmp_ctype, sizeof(tmp_ctype)); return 0;
memcpy((char*) cs->to_lower, (char*) tmp_to_lower, sizeof(tmp_to_lower));
memcpy((char*) cs->to_upper, (char*) tmp_to_upper, sizeof(tmp_to_upper)); cs->number= cs_number;
memcpy((char*) cs->name, (char*) cs_name, strlen(cs_name) + 1);
memcpy((char*) cs->ctype, (char*) tmp_ctype, sizeof(tmp_ctype));
memcpy((char*) cs->to_lower, (char*) tmp_to_lower, sizeof(tmp_to_lower));
memcpy((char*) cs->to_upper, (char*) tmp_to_upper, sizeof(tmp_to_upper));
memcpy((char*) cs->sort_order, (char*) tmp_sort_order, memcpy((char*) cs->sort_order, (char*) tmp_sort_order,
sizeof(tmp_sort_order)); sizeof(tmp_sort_order));
insert_dynamic(&cs_info_table, (gptr) &cs); insert_dynamic(&cs_info_table, (gptr) &cs);
......
...@@ -49,6 +49,16 @@ void regex_init() ...@@ -49,6 +49,16 @@ void regex_init()
for (i=0; i < CCLASS_LAST ; i++) for (i=0; i < CCLASS_LAST ; i++)
{ {
char *tmp=(char*) malloc(count[i]+1); char *tmp=(char*) malloc(count[i]+1);
if (!tmp)
{
/*
This is very unlikely to happen as this function is called once
at program startup
*/
fprintf(stderr,
"Fatal error: Can't allocate memory in regex_init\n");
exit(1);
}
memcpy(tmp,buff[i],count[i]*sizeof(char)); memcpy(tmp,buff[i],count[i]*sizeof(char));
tmp[count[i]]=0; tmp[count[i]]=0;
cclasses[i].chars=tmp; cclasses[i].chars=tmp;
......
...@@ -2043,6 +2043,10 @@ String* Item_func_export_set::val_str(String* str) ...@@ -2043,6 +2043,10 @@ String* Item_func_export_set::val_str(String* str)
null_value=1; null_value=1;
return 0; return 0;
} }
/*
Arg count can only be 3, 4 or 5 here. This is guaranteed from the
grammar for EXPORT_SET()
*/
switch(arg_count) { switch(arg_count) {
case 5: case 5:
num_set_values = (uint) args[4]->val_int(); num_set_values = (uint) args[4]->val_int();
......
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