2011-01-10 11:34:19 |
Kristian Nielsen |
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.4 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.] |
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.]
|
|