Details
-
Type:
Bug
-
Status: Closed
-
Priority:
Major
-
Resolution: Fixed
-
Affects Version/s: None
-
Fix Version/s: None
-
Component/s: None
-
Labels:
Description
The sql-common/client_plugin.c has this code:
static struct st_mysql_client_plugin *
add_plugin(MYSQL *mysql, struct st_mysql_client_plugin *plugin, void *dlhandle,
int argc, va_list args)
int mysql_client_plugin_init()
{
...
add_plugin(&mysql, *builtin, 0, 0, 0);
struct st_mysql_client_plugin *
mysql_client_register_plugin(MYSQL *mysql,
struct st_mysql_client_plugin *plugin)
{
...
plugin= add_plugin(mysql, plugin, 0, 0, 0);
This passes 0 for the va_list argument. This is not correct C, there is no
guarantee that va_list is a pointer (or other type compatible with integer).
I got a report that GCC 4.5 fails on this on ARM.
An easy solution is to just declare and pass a dummy va_list instead; as argc
is zero it won't be used anyway.
[There is no code example in the source tree that actually uses the va_list arg
in the init function. The only client plugin I could find is, in
plugin/auth/dialog.c, and doesn't use the va_list argument:
static int init_dialog()
{
...
}
mysql_declare_client_plugin(AUTHENTICATION)
"dialog",
...
init_dialog,
This BTW seems to be putting an int
() for init_dialog, where it should be
int
(char *, size_t, int, va_list). This also isn't correct C, and while
perhaps unlikely to fail in practice, there is no reason not to use the
correct type for the function.]
Gliffy Diagrams
Attachments
Activity
- All
- Comments
- Work Log
- History
- Activity
- Transitions
Re: Non-portable code in client plugin (fails on ARM)
Here is the full error message:
/home/esmil/mysql-5.5.8/sql-common/client_plugin.c: In function ‘mysql_client_plugin_init’:
/home/esmil/mysql-5.5.8/sql-common/client_plugin.c:252:5: error: incompatible type for argument 5 of ‘add_plugin’
/home/esmil/mysql-5.5.8/sql-common/client_plugin.c:126:1: note: expected ‘va_list’ but argument is of type ‘int’
/home/esmil/mysql-5.5.8/sql-common/client_plugin.c: In function ‘mysql_client_register_plugin’:
/home/esmil/mysql-5.5.8/sql-common/client_plugin.c:310:5: error: incompatible type for argument 5 of ‘add_plugin’
/home/esmil/mysql-5.5.8/sql-common/client_plugin.c:126:1: note: expected ‘va_list’ but argument is of type ‘int’
make[2]: *** [libmysqld/CMakeFiles/sql_embedded.dir/__/sql-common/client_plugin.c.o] Error 1