Comment 0 for bug 700982

Revision history for this message
Kristian Nielsen (knielsen) wrote :

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.]