Commit 71b3e46b authored by Sergei Golubchik's avatar Sergei Golubchik

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)
parent edfd875f
...@@ -333,7 +333,7 @@ static inline void free_plugin_mem(struct st_plugin_dl *p) ...@@ -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) ...@@ -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); cur= (struct st_mysql_plugin*)
} my_malloc((i+1)*sizeof(struct st_mysql_plugin), MYF(MY_ZEROFILL|MY_WME));
/* if (!cur)
All st_plugin fields not initialized in the plugin explicitly, are {
set to 0. It matches C standard behaviour for struct initializers that free_plugin_mem(&plugin_dl);
have less values than the struct definition. if (report & REPORT_TO_USER)
*/ my_error(ER_OUTOFMEMORY, MYF(0), plugin_dl.dl.length);
for (i=0; if (report & REPORT_TO_LOG)
(old=(struct st_mysql_plugin *)(ptr+i*sizeof_st_plugin))->info; sql_print_error(ER(ER_OUTOFMEMORY), plugin_dl.dl.length);
i++) DBUG_RETURN(0);
memcpy(cur+i, old, min(sizeof(cur[i]), sizeof_st_plugin)); }
/*
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; 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 ...@@ -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 */
}; };
......
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