Commit fa82ebd2 authored by unknown's avatar unknown

BUG#24566 - Incorrect key file for table ( the size of table is more than 2G)

Accessing a file that is bigger than 2G may report that read/write operation
failed. This may affect anything that uses my_pread/my_pwrite functions, e.g.
MyISAM, ARCHIVE, binary log.

For MyISAM INSERT may report that table is crashed when writing to a table
that is bigger than 2G.

This is fixed by using proper offset type in my_pread/my_pwrite functions on
systems that do not have native pread/pwrite calls.

Affects systems that do not have native pread/pwrite calls, e.g. Windows.

No test case for this fix, since it requires huge table.


mysys/my_pread.c:
  Use proper offset type for restoring position on systems that do not have native
  pread/pwrite calls.
parent 99c5c28c
...@@ -37,7 +37,7 @@ uint my_pread(File Filedes, byte *Buffer, uint Count, my_off_t offset, ...@@ -37,7 +37,7 @@ uint my_pread(File Filedes, byte *Buffer, uint Count, my_off_t offset,
errno=0; /* Linux doesn't reset this */ errno=0; /* Linux doesn't reset this */
#endif #endif
#ifndef HAVE_PREAD #ifndef HAVE_PREAD
off_t old_offset; os_off_t old_offset;
pthread_mutex_lock(&my_file_info[Filedes].mutex); pthread_mutex_lock(&my_file_info[Filedes].mutex);
/* /*
...@@ -45,7 +45,7 @@ uint my_pread(File Filedes, byte *Buffer, uint Count, my_off_t offset, ...@@ -45,7 +45,7 @@ uint my_pread(File Filedes, byte *Buffer, uint Count, my_off_t offset,
before seeking to the given offset before seeking to the given offset
*/ */
error= (old_offset= (off_t)lseek(Filedes, 0L, MY_SEEK_CUR)) == -1L || error= (old_offset= lseek(Filedes, 0L, MY_SEEK_CUR)) == -1L ||
lseek(Filedes, offset, MY_SEEK_SET) == -1L; lseek(Filedes, offset, MY_SEEK_SET) == -1L;
if (!error) /* Seek was successful */ if (!error) /* Seek was successful */
...@@ -116,7 +116,7 @@ uint my_pwrite(int Filedes, const byte *Buffer, uint Count, my_off_t offset, ...@@ -116,7 +116,7 @@ uint my_pwrite(int Filedes, const byte *Buffer, uint Count, my_off_t offset,
{ {
#ifndef HAVE_PREAD #ifndef HAVE_PREAD
int error= 0; int error= 0;
off_t old_offset; os_off_t old_offset;
writenbytes= (uint) -1; writenbytes= (uint) -1;
pthread_mutex_lock(&my_file_info[Filedes].mutex); pthread_mutex_lock(&my_file_info[Filedes].mutex);
...@@ -124,7 +124,7 @@ uint my_pwrite(int Filedes, const byte *Buffer, uint Count, my_off_t offset, ...@@ -124,7 +124,7 @@ uint my_pwrite(int Filedes, const byte *Buffer, uint Count, my_off_t offset,
As we cannot change the file pointer, we save the old position, As we cannot change the file pointer, we save the old position,
before seeking to the given offset before seeking to the given offset
*/ */
error= ((old_offset= (off_t)lseek(Filedes, 0L, MY_SEEK_CUR)) == -1L || error= ((old_offset= lseek(Filedes, 0L, MY_SEEK_CUR)) == -1L ||
lseek(Filedes, offset, MY_SEEK_SET) == -1L); lseek(Filedes, offset, MY_SEEK_SET) == -1L);
if (!error) /* Seek was successful */ if (!error) /* Seek was successful */
......
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