1. don't crash on failing to load a plugin with newer MYSQL_PLUGIN_INTERFACE_VERSION
2. don't copy st_mysql_plugin structure unnecessary (sizeof hasn't changed)
This commit is contained in:
parent
edfd875fc1
commit
71b3e46b01
@ -333,7 +333,7 @@ static inline void free_plugin_mem(struct st_plugin_dl *p)
|
|||||||
dlclose(p->handle);
|
dlclose(p->handle);
|
||||||
#endif
|
#endif
|
||||||
my_free(p->dl.str, MYF(MY_ALLOW_ZERO_PTR));
|
my_free(p->dl.str, MYF(MY_ALLOW_ZERO_PTR));
|
||||||
if (p->version != MYSQL_PLUGIN_INTERFACE_VERSION)
|
if (p->allocated)
|
||||||
my_free((uchar*)p->plugins, MYF(MY_ALLOW_ZERO_PTR));
|
my_free((uchar*)p->plugins, MYF(MY_ALLOW_ZERO_PTR));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -454,33 +454,37 @@ static st_plugin_dl *plugin_dl_add(const LEX_STRING *dl, int report)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i= 0;
|
if (sizeof_st_plugin != sizeof(st_mysql_plugin))
|
||||||
((struct st_mysql_plugin *)(ptr+i*sizeof_st_plugin))->info;
|
|
||||||
i++)
|
|
||||||
/* no op */;
|
|
||||||
|
|
||||||
cur= (struct st_mysql_plugin*)
|
|
||||||
my_malloc(i*sizeof(struct st_mysql_plugin), MYF(MY_ZEROFILL|MY_WME));
|
|
||||||
if (!cur)
|
|
||||||
{
|
{
|
||||||
free_plugin_mem(&plugin_dl);
|
for (i= 0;
|
||||||
if (report & REPORT_TO_USER)
|
((struct st_mysql_plugin *)(ptr+i*sizeof_st_plugin))->info;
|
||||||
my_error(ER_OUTOFMEMORY, MYF(0), plugin_dl.dl.length);
|
i++)
|
||||||
if (report & REPORT_TO_LOG)
|
/* no op */;
|
||||||
sql_print_error(ER(ER_OUTOFMEMORY), plugin_dl.dl.length);
|
|
||||||
DBUG_RETURN(0);
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
All st_plugin fields not initialized in the plugin explicitly, are
|
|
||||||
set to 0. It matches C standard behaviour for struct initializers that
|
|
||||||
have less values than the struct definition.
|
|
||||||
*/
|
|
||||||
for (i=0;
|
|
||||||
(old=(struct st_mysql_plugin *)(ptr+i*sizeof_st_plugin))->info;
|
|
||||||
i++)
|
|
||||||
memcpy(cur+i, old, min(sizeof(cur[i]), sizeof_st_plugin));
|
|
||||||
|
|
||||||
sym= cur;
|
cur= (struct st_mysql_plugin*)
|
||||||
|
my_malloc((i+1)*sizeof(struct st_mysql_plugin), MYF(MY_ZEROFILL|MY_WME));
|
||||||
|
if (!cur)
|
||||||
|
{
|
||||||
|
free_plugin_mem(&plugin_dl);
|
||||||
|
if (report & REPORT_TO_USER)
|
||||||
|
my_error(ER_OUTOFMEMORY, MYF(0), plugin_dl.dl.length);
|
||||||
|
if (report & REPORT_TO_LOG)
|
||||||
|
sql_print_error(ER(ER_OUTOFMEMORY), plugin_dl.dl.length);
|
||||||
|
DBUG_RETURN(0);
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
All st_plugin fields not initialized in the plugin explicitly, are
|
||||||
|
set to 0. It matches C standard behaviour for struct initializers that
|
||||||
|
have less values than the struct definition.
|
||||||
|
*/
|
||||||
|
for (i=0;
|
||||||
|
(old=(struct st_mysql_plugin *)(ptr+i*sizeof_st_plugin))->info;
|
||||||
|
i++)
|
||||||
|
memcpy(cur+i, old, min(sizeof(cur[i]), sizeof_st_plugin));
|
||||||
|
|
||||||
|
sym= cur;
|
||||||
|
plugin_dl.allocated= true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
plugin_dl.plugins= (struct st_mysql_plugin *)sym;
|
plugin_dl.plugins= (struct st_mysql_plugin *)sym;
|
||||||
|
|
||||||
|
@ -63,7 +63,8 @@ struct st_plugin_dl
|
|||||||
LEX_STRING dl;
|
LEX_STRING dl;
|
||||||
void *handle;
|
void *handle;
|
||||||
struct st_mysql_plugin *plugins;
|
struct st_mysql_plugin *plugins;
|
||||||
int version;
|
int version;
|
||||||
|
bool allocated;
|
||||||
uint ref_count; /* number of plugins loaded from the library */
|
uint ref_count; /* number of plugins loaded from the library */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user