Commit 03a20c23 authored by unknown's avatar unknown

ha_innodb.cc:

  innobase_mysql_tmpfile(): call dup() and my_close() on the file
  returned by create_temp_file()
  in order to avoid memory leak caused by my_open() being paired with close()


sql/ha_innodb.cc:
  innobase_mysql_tmpfile(): call dup() and my_close() on the file
  returned by create_temp_file()
  in order to avoid memory leak caused by my_open() being paired with close()
parent 8c1af755
...@@ -31,6 +31,7 @@ have disables the InnoDB inlining in this file. */ ...@@ -31,6 +31,7 @@ have disables the InnoDB inlining in this file. */
#include <assert.h> #include <assert.h>
#include <hash.h> #include <hash.h>
#include <myisampack.h> #include <myisampack.h>
#include <mysys_err.h>
#define MAX_ULONG_BIT ((ulong) 1 << (sizeof(ulong)*8-1)) #define MAX_ULONG_BIT ((ulong) 1 << (sizeof(ulong)*8-1))
...@@ -419,6 +420,7 @@ innobase_mysql_tmpfile(void) ...@@ -419,6 +420,7 @@ innobase_mysql_tmpfile(void)
/* out: temporary file descriptor, or < 0 on error */ /* out: temporary file descriptor, or < 0 on error */
{ {
char filename[FN_REFLEN]; char filename[FN_REFLEN];
int fd2 = -1;
File fd = create_temp_file(filename, NullS, "ib", File fd = create_temp_file(filename, NullS, "ib",
#ifdef __WIN__ #ifdef __WIN__
O_BINARY | O_TRUNC | O_SEQUENTIAL | O_BINARY | O_TRUNC | O_SEQUENTIAL |
...@@ -426,12 +428,31 @@ innobase_mysql_tmpfile(void) ...@@ -426,12 +428,31 @@ innobase_mysql_tmpfile(void)
#endif /* __WIN__ */ #endif /* __WIN__ */
O_CREAT | O_EXCL | O_RDWR, O_CREAT | O_EXCL | O_RDWR,
MYF(MY_WME)); MYF(MY_WME));
#ifndef __WIN__
if (fd >= 0) { if (fd >= 0) {
#ifndef __WIN__
/* On Windows, open files cannot be removed, but files can be
created with the O_TEMPORARY flag to the same effect
("delete on close"). */
unlink(filename); unlink(filename);
}
#endif /* !__WIN__ */ #endif /* !__WIN__ */
return(fd); /* Copy the file descriptor, so that the additional resources
allocated by create_temp_file() can be freed by invoking
my_close().
Because the file descriptor returned by this function
will be passed to fdopen(), it will be closed by invoking
fclose(), which in turn will invoke close() instead of
my_close(). */
fd2 = dup(fd);
if (fd2 < 0) {
DBUG_PRINT("error",("Got error %d on dup",fd2));
my_errno=errno;
my_error(EE_OUT_OF_FILERESOURCES,
MYF(ME_BELL+ME_WAITTANG), filename, my_errno);
}
my_close(fd, MYF(MY_WME));
}
return(fd2);
} }
/************************************************************************* /*************************************************************************
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment