Commit cd323e29 authored by unknown's avatar unknown
Browse files

BUG#12982 - LOAD DATA fails without any error for big files with big

            read buffer
Setting read buffer to values greater than SSIZE_MAX results in
unexpected behavior.

According to read(2) manual:
If count is greater than SSIZE_MAX, the result is unspecified.

Set upper limit for read_buffer_size and read_rnd_buffer_size to
SSIZE_MAX.


include/my_global.h:
  Define SSIZE_MAX if not defined.
sql/mysqld.cc:
  Set upper limit for read_buffer_size and read_rnd_buffer_size to
  SSIZE_MAX.
parent 8efe592d
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -736,6 +736,9 @@ typedef SOCKET_SIZE_TYPE size_socket;
#define DBL_MAX		1.79769313486231470e+308
#define FLT_MAX		((float)3.40282346638528860e+38)
#endif
#ifndef SSIZE_MAX
#define SSIZE_MAX (ssize_t)((~((size_t) 0)) / 2)
#endif

#if !defined(HAVE_ISINF) && !defined(isinf)
#define isinf(X)    0
+4 −3
Original line number Diff line number Diff line
@@ -5847,7 +5847,8 @@ The minimum value for this variable is 4096.",
   "Each thread that does a sequential scan allocates a buffer of this size for each table it scans. If you do many sequential scans, you may want to increase this value.",
   (gptr*) &global_system_variables.read_buff_size,
   (gptr*) &max_system_variables.read_buff_size,0, GET_ULONG, REQUIRED_ARG,
   128*1024L, IO_SIZE*2+MALLOC_OVERHEAD, ~0L, MALLOC_OVERHEAD, IO_SIZE, 0},
   128*1024L, IO_SIZE*2+MALLOC_OVERHEAD, SSIZE_MAX, MALLOC_OVERHEAD, IO_SIZE,
   0},
  {"read_only", OPT_READONLY,
   "Make all non-temporary tables read-only, with the exception for replication (slave) threads and users with the SUPER privilege",
   (gptr*) &opt_readonly,
@@ -5858,12 +5859,12 @@ The minimum value for this variable is 4096.",
   (gptr*) &global_system_variables.read_rnd_buff_size,
   (gptr*) &max_system_variables.read_rnd_buff_size, 0,
   GET_ULONG, REQUIRED_ARG, 256*1024L, IO_SIZE*2+MALLOC_OVERHEAD,
   ~0L, MALLOC_OVERHEAD, IO_SIZE, 0},
   SSIZE_MAX, MALLOC_OVERHEAD, IO_SIZE, 0},
  {"record_buffer", OPT_RECORD_BUFFER,
   "Alias for read_buffer_size",
   (gptr*) &global_system_variables.read_buff_size,
   (gptr*) &max_system_variables.read_buff_size,0, GET_ULONG, REQUIRED_ARG,
   128*1024L, IO_SIZE*2+MALLOC_OVERHEAD, ~0L, MALLOC_OVERHEAD, IO_SIZE, 0},
   128*1024L, IO_SIZE*2+MALLOC_OVERHEAD, SSIZE_MAX, MALLOC_OVERHEAD, IO_SIZE, 0},
#ifdef HAVE_REPLICATION
  {"relay_log_purge", OPT_RELAY_LOG_PURGE,
   "0 = do not purge relay logs. 1 = purge them as soon as they are no more needed.",