diff options
author | Sujatha Sivakumar <sujatha.sivakumar@oracle.com> | 2013-03-28 14:14:39 +0530 |
---|---|---|
committer | Sujatha Sivakumar <sujatha.sivakumar@oracle.com> | 2013-03-28 14:14:39 +0530 |
commit | c78c1fe52dbc1034a143c5114ddf43c1d33c9d3b (patch) | |
tree | ce642fb92d15c30186ac36f364dd7c70ea141344 /mysys | |
parent | 9d7f333a62af54153f92894f7a11249ffde54ac0 (diff) | |
download | mariadb-git-c78c1fe52dbc1034a143c5114ddf43c1d33c9d3b.tar.gz |
Bug#14324766:PARTIALLY WRITTEN INSERT STATEMENT IN BINLOG
NO ERRORS REPORTED
Problem:
=======
Errors from my_b_fill are ignored. MYSQL_BIN_LOG::write_cache
code assumes that 0 returned from my_b_fill always means
end-of-cache, but that is incorrect. It can result in error
and the error is ignored. Other callers of my_b_fill don't
check for error: my_b_copy_to_file, maybe my_b_gets.
Fix:
===
An error handler is already present to check the "cache"
error that is reported during "MYSQL_BIN_LOG::write_cache"
call. Hence error handlers are added for "my_b_copy_to_file"
and "my_b_gets".
During my_b_fill() function call, when the cache read fails
info->error= -1 is set. Hence a check for "info->error"
is added for the above to callers upon their return.
Diffstat (limited to 'mysys')
-rw-r--r-- | mysys/mf_iocache2.c | 6 | ||||
-rw-r--r-- | mysys/my_read.c | 14 |
2 files changed, 17 insertions, 3 deletions
diff --git a/mysys/mf_iocache2.c b/mysys/mf_iocache2.c index 9221467b216..eaa70782f16 100644 --- a/mysys/mf_iocache2.c +++ b/mysys/mf_iocache2.c @@ -1,5 +1,5 @@ /* - Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved. + Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -66,6 +66,8 @@ my_b_copy_to_file(IO_CACHE *cache, FILE *file) DBUG_RETURN(1); cache->read_pos= cache->read_end; } while ((bytes_in_cache= my_b_fill(cache))); + if(cache->error == -1) + DBUG_RETURN(1); DBUG_RETURN(0); } @@ -215,6 +217,8 @@ size_t my_b_fill(IO_CACHE *info) info->error= 0; return 0; /* EOF */ } + DBUG_EXECUTE_IF ("simulate_my_b_fill_error", + {DBUG_SET("+d,simulate_file_read_error");}); if ((length= my_read(info->file,info->buffer,max_length, info->myflags)) == (size_t) -1) { diff --git a/mysys/my_read.c b/mysys/my_read.c index 64f64872cb2..0f7a18220fe 100644 --- a/mysys/my_read.c +++ b/mysys/my_read.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2000-2002, 2004, 2006, 2007 MySQL AB +/* Copyright (c) 2000-2002, 2004, 2006, 2007, 2013 MySQL AB This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -44,8 +44,18 @@ size_t my_read(File Filedes, uchar *Buffer, size_t Count, myf MyFlags) for (;;) { errno= 0; /* Linux doesn't reset this */ - if ((readbytes= read(Filedes, Buffer, (uint) Count)) != Count) + if (DBUG_EVALUATE_IF("simulate_file_read_error", 1, 0) || + (readbytes= read(Filedes, Buffer, (uint) Count)) != Count) { + DBUG_EXECUTE_IF ("simulate_file_read_error", + { + errno= ENOSPC; + readbytes= (size_t) -1; + DBUG_SET("-d,simulate_file_read_error"); + DBUG_SET("-d,simulate_my_b_fill_error"); + }); + + my_errno= errno ? errno : -1; DBUG_PRINT("warning",("Read only %d bytes off %lu from %d, errno: %d", (int) readbytes, (ulong) Count, Filedes, |