Non-portable code in client plugin (fails on ARM)

Reported by Kristian Nielsen on 2011-01-10
40
This bug affects 5 people
Affects Status Importance Assigned to Milestone
Maria
Fix Released
High
Sergei
MySQL Server
Unknown
Unknown
Percona Server
Status tracked in 5.6
5.5
Low
Unassigned
5.6
Low
Unassigned
mysql-5.5 (Ubuntu)
High
Clint Byrum

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

Changed in maria:
importance: Undecided → High
milestone: none → 5.2
status: New → Confirmed
description: updated
Sergei (sergii) on 2011-01-10
Changed in maria:
assignee: nobody → Sergei (sergii)
Esmil (esmil) wrote :

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

Sergei (sergii) on 2011-03-12
Changed in maria:
status: Confirmed → Fix Committed
Sergei (sergii) on 2011-10-28
Changed in maria:
status: Fix Committed → Fix Released
Changed in mysql-5.5 (Ubuntu):
status: New → In Progress
assignee: nobody → Clint Byrum (clint-fewbar)
Changed in mysql-5.5 (Ubuntu):
importance: Undecided → High
Launchpad Janitor (janitor) wrote :

This bug was fixed in the package mysql-5.5 - 5.5.17-4ubuntu2

---------------
mysql-5.5 (5.5.17-4ubuntu2) precise; urgency=low

  * d/patches/70_mysql_va_list.patch: cherry pick patch from
    upstream bug tracker to fix ARM build failure. (LP: #700982)
 -- Clint Byrum <email address hidden> Tue, 22 Nov 2011 11:00:14 -0800

Changed in mysql-5.5 (Ubuntu):
status: In Progress → Fix Released
tags: added: upstream
To post a comment you must log in.
This report contains Public information  Edit
Everyone can see this information.

Duplicates of this bug

Other bug subscribers

Remote bug watches

Bug watches keep track of this bug in other bug trackers.