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

Bug #700982 reported by Kristian Nielsen
40
This bug affects 5 people
Affects Status Importance Assigned to Milestone
MariaDB
Fix Released
High
Sergei Golubchik
MySQL Server
Unknown
Unknown
Percona Server moved to https://jira.percona.com/projects/PS
Fix Released
Low
Unassigned
5.5
Triaged
Low
Unassigned
5.6
Fix Released
Low
Unassigned
mysql-5.5 (Ubuntu)
Fix Released
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.]

Tags: upstream
Changed in maria:
importance: Undecided → High
milestone: none → 5.2
status: New → Confirmed
description: updated
Changed in maria:
assignee: nobody → Sergei (sergii)
Revision history for this message
Emil Renner Berthing (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

Changed in maria:
status: Confirmed → Fix Committed
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
Revision history for this message
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
Revision history for this message
Shahriyar Rzayev (rzayev-sehriyar) wrote :

Percona now uses JIRA for bug reports so this bug report is migrated to: https://jira.percona.com/browse/PS-1839

To post a comment you must log in.
This report contains Public information  
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.