summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarko Mäkelä <marko.makela@mariadb.com>2019-04-08 09:00:25 +0300
committerMarko Mäkelä <marko.makela@mariadb.com>2019-04-08 09:20:48 +0300
commit1e7ad5bb1c69dba8c7d721a2cfbbe98c7e900015 (patch)
tree56603cb31dae4c4092a1acb6c18097c73297f090
parentd8303c3ee7750f4003e3561c3e60ee6e636bf9ad (diff)
downloadmariadb-git-1e7ad5bb1c69dba8c7d721a2cfbbe98c7e900015.tar.gz
MDEV-15584: Do not invoke open(dir=NULL)
On Linux, <fcntl.h> declares open(2) as having a nonnull first argument. In GCC 8, if a function with nonnull argument is called, that argument will be silently assumed to nonnull along the same code path. Hence, later nullness checks for this argument can be optimized away. Similar to MDEV-15587, the fix is to ensure that functions with nonnull arguments are not being called with NULL. This bug caused a crash in mysqlbinlog, which was invoking create_temp_file() with the argument dir=NULL. The affected test was binlog.binlog_mysqlbinlog_base64. It would display the following message before crashing: mysqlbinlog: O_TMPFILE is not supported on (null) (disabling future attempts) Segmentation fault
-rw-r--r--mysys/mf_tempfile.c6
1 files changed, 3 insertions, 3 deletions
diff --git a/mysys/mf_tempfile.c b/mysys/mf_tempfile.c
index 54b0d85b552..4df856c8b14 100644
--- a/mysys/mf_tempfile.c
+++ b/mysys/mf_tempfile.c
@@ -65,7 +65,7 @@ File create_temp_file(char *to, const char *dir, const char *prefix,
File file= -1;
DBUG_ENTER("create_temp_file");
- DBUG_PRINT("enter", ("dir: %s, prefix: %s", dir, prefix));
+ DBUG_PRINT("enter", ("dir: %s, prefix: %s", dir ? dir : "(null)", prefix));
DBUG_ASSERT((mode & (O_EXCL | O_TRUNC | O_CREAT | O_RDWR)) == 0);
mode|= O_TRUNC | O_CREAT | O_RDWR; /* not O_EXCL, see Windows code below */
@@ -110,6 +110,8 @@ File create_temp_file(char *to, const char *dir, const char *prefix,
}
}
#elif defined(HAVE_MKSTEMP)
+ if (!dir && ! (dir =getenv("TMPDIR")))
+ dir= DEFAULT_TMPDIR;
#ifdef O_TMPFILE
{
static int O_TMPFILE_works= 1;
@@ -146,8 +148,6 @@ File create_temp_file(char *to, const char *dir, const char *prefix,
prefix ? prefix : "tmp.",
sizeof(prefix_buff)-7),"XXXXXX") -
prefix_buff);
- if (!dir && ! (dir =getenv("TMPDIR")))
- dir= DEFAULT_TMPDIR;
if (strlen(dir)+ pfx_len > FN_REFLEN-2)
{
errno=my_errno= ENAMETOOLONG;