From 24ce495a518d6d2756e5b1c0cb50f9c7526d0191 Mon Sep 17 00:00:00 2001
From: unknown <msvensson@pilot.blaudden>
Date: Fri, 23 Mar 2007 19:00:34 +0100
Subject: [PATCH] Bug#26837 Return value ignored for packet->append() call
 within Log_event::read_log_event  - Improve error handling for "out of
 memory" problems when master is    sending logs to slave. If memory
 allocation fails the log should    now  report error "memory allocation
 failed reading log event"

sql/log_event.cc:
  Return LOG_READ_MEM from "Log_event::read_log_event" if memory
  allocation  fails.
---
 sql/log_event.cc | 27 +++++++++++++++++++++------
 1 file changed, 21 insertions(+), 6 deletions(-)

diff --git a/sql/log_event.cc b/sql/log_event.cc
index e272140c08..8bb63e72bd 100644
--- a/sql/log_event.cc
+++ b/sql/log_event.cc
@@ -669,19 +669,34 @@ int Log_event::read_log_event(IO_CACHE* file, String* packet,
 	     LOG_READ_TOO_LARGE);
     goto end;
   }
-  packet->append(buf, sizeof(buf));
+
+  /* Append the log event header to packet */
+  if (packet->append(buf, sizeof(buf)))
+  {
+    /* Failed to allocate packet */
+    result= LOG_READ_MEM;
+    goto end;
+  }
   data_len-= LOG_EVENT_MINIMAL_HEADER_LEN;
   if (data_len)
   {
+    /* Append rest of event, read directly from file into packet */
     if (packet->append(file, data_len))
     {
       /*
-	Here if we hit EOF it's really an error: as data_len is >=0
-        there's supposed to be more bytes available. 
-	EOF means we are reading the event partially, which should
-	never happen: either we read badly or the binlog is truncated.
+        Fatal error occured when appending rest of the event
+        to packet, possible failures:
+	1. EOF occured when reading from file, it's really an error
+           as data_len is >=0 there's supposed to be more bytes available.
+           file->error will have been set to number of bytes left to read
+        2. Read was interrupted, file->error would normally be set to -1
+        3. Failed to allocate memory for packet, my_errno
+           will be ENOMEM(file->error shuold be 0, but since the
+           memory allocation occurs before the call to read it might
+           be uninitialized)
       */
-      result= file->error >= 0 ? LOG_READ_TRUNC: LOG_READ_IO;
+      result= (my_errno == ENOMEM ? LOG_READ_MEM :
+               (file->error >= 0 ? LOG_READ_TRUNC: LOG_READ_IO));
       /* Implicit goto end; */
     }
   }
-- 
2.30.9