diff options
author | Marko Mäkelä <marko.makela@mariadb.com> | 2019-04-08 09:00:25 +0300 |
---|---|---|
committer | Marko Mäkelä <marko.makela@mariadb.com> | 2019-04-08 09:20:48 +0300 |
commit | 1e7ad5bb1c69dba8c7d721a2cfbbe98c7e900015 (patch) | |
tree | 56603cb31dae4c4092a1acb6c18097c73297f090 | |
parent | d8303c3ee7750f4003e3561c3e60ee6e636bf9ad (diff) | |
download | mariadb-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.c | 6 |
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; |