| Bug #69752 | mysql_plugin removes non-directory type files specified with the basedir option | ||
|---|---|---|---|
| Submitted: | 15 Jul 2013 19:51 | Modified: | 2 Dec 2013 17:51 |
| Reporter: | Davi Arnaut (OCA) | Email Updates: | |
| Status: | Closed | Impact on me: | |
| Category: | MySQL Server: Command-line Clients | Severity: | S2 (Serious) |
| Version: | 5.5 | OS: | Any |
| Assigned to: | CPU Architecture: | Any | |
| Tags: | basedir, delete, mysql_plugin | ||
[16 Jul 2013 8:42]
MySQL Verification Team
Hello Davi, Thank you for the report and contribution. Thanks, Umesh
[2 Dec 2013 17:51]
Paul DuBois
Noted in 5.5.36, 5.6.16, 5.7.4 changelogs. For the path specified with the --basedir option, mysql_plugin attempted to unlink the path rather than free the memory in which the path was stored.
[4 Dec 2013 9:03]
Laurynas Biveinis
5.5$ bzr log -r 4464
------------------------------------------------------------
revno: 4464
committer: Arun Kuruvila <arun.kuruvila@oracle.com>
branch nick: fixed-5-5
timestamp: Mon 2013-09-02 14:53:45 +0530
message:
Bug #17168602 MYSQL_PLUGIN REMOVES NON-DIRECTORY TYPE FILES
SPECIFIED WITH THE BASEDIR OPTION
Description: The mysql_plugin client attempts to remove any
filename specified to the --basedir option. The problem is
that if the filename does not end with a slash, it will
attempt to unlink it, which succeeds for files, but not for
directories.
Analysis: When we are starting mysql_plugin with basedir
option and if we are giving path of a file as basedir, it
deletes that file. It was because it uses a function
my_delete which unlinks the file path given.
Fix: As a fix we replace that line using another function
my_free, which will only free the pointer which is having
that file path.
[4 Dec 2013 9:09]
Laurynas Biveinis
5.5$ bzr log -r 4467
------------------------------------------------------------
revno: 4467
committer: Venkata Sidagam <venkata.sidagam@oracle.com>
branch nick: 5.5
timestamp: Thu 2013-09-05 14:18:43 +0530
message:
Bug #17168602 MYSQL_PLUGIN REMOVES NON-DIRECTORY TYPE
FILES SPECIFIED WITH THE BASEDIR OPTION
Reverting the patch. Because asked for second review.
[4 Dec 2013 9:42]
Laurynas Biveinis
It appears that this bug was not fixed after all since the fix was reverted. client/mysql_plugin.c line 859 still reads my_delete() at bzr revno 4535 (5.5.35)
[16 Dec 2013 15:43]
Paul DuBois
The 5.5 fix is in 5.5.36, not 5.5.35.
[17 Dec 2013 5:10]
Laurynas Biveinis
Ah, I didn't notice the exact fix version. Sorry for the confusion.
[2 Feb 2014 17:33]
Laurynas Biveinis
5.5$ bzr log -r 4551
------------------------------------------------------------
revno: 4551
committer: Arun Kuruvila <arun.kuruvila@oracle.com>
branch nick: mysql-5.5
timestamp: Mon 2013-11-25 12:31:09 +0530
message:
Bug #17168602 MYSQL_PLUGIN REMOVES NON-DIRECTORY TYPE FILES
SPECIFIED WITH THE BASEDIR OPTION
Description: The mysql_plugin client attempts to remove any
filename specified to the --basedir option. The problem is
that if the filename does not end with a slash, it will
attempt to unlink it, which succeeds for files, but not for
directories.
Analysis: When we are starting mysql_plugin with basedir
option and if we are giving path of a file as basedir, it
deletes that file. It was because it uses a function
my_delete which unlinks the file path given.
Fix: As a fix we replace that line using another function
my_free, which will only free the pointer which is having
that file path.

Description: The mysql_plugin client inadvertently attempts to remove any filename specified to the --basedir option. The problem is that if the filename does not end with a slash, it will attempt to unlink it, which succeeds for files, but not for directories. How to repeat: $ touch /tmp/foobar $ mysql_plugin --basedir=/tmp/foobar $ ls -la /tmp/foobar ls: cannot access /tmp/foobar: No such file or directory Suggested fix: I guess the author meant "delete" as in C++'s deallocate memory. --- a/client/mysql_plugin.c +++ b/client/mysql_plugin.c @@ -856,7 +856,7 @@ static int process_options(int argc, char *argv[], char *operation) strncat(buff, FN_DIRSEP, sizeof(buff) - strlen(buff) - 1); #endif buff[sizeof(buff) - 1]= 0; - my_delete(opt_basedir, MYF(0)); + my_free(opt_basedir); opt_basedir= my_strdup(buff, MYF(MY_FAE)); } }