Open whole buffer for writing in update_buffer.
diff --git a/reader_c.go b/reader_c.go
index f222c6c..c732935 100644
--- a/reader_c.go
+++ b/reader_c.go
@@ -111,16 +111,19 @@
 	}
 
 	// Move the unread characters to the beginning of the buffer.
-	if parser.buffer_pos > 0 && parser.buffer_pos < len(parser.buffer) {
-		size := len(parser.buffer) - parser.buffer_pos
+	buffer_len := len(parser.buffer)
+	if parser.buffer_pos > 0 && parser.buffer_pos < buffer_len {
 		copy(parser.buffer, parser.buffer[parser.buffer_pos:])
+		buffer_len -= parser.buffer_pos
 		parser.buffer_pos = 0
-		parser.buffer = parser.buffer[:size]
-	} else if parser.buffer_pos == len(parser.buffer) {
+	} else if parser.buffer_pos == buffer_len {
+		buffer_len = 0
 		parser.buffer_pos = 0
-		parser.buffer = parser.buffer[:0]
 	}
 
+	// Open the whole buffer for writing, and cut it before returning.
+	parser.buffer = parser.buffer[:cap(parser.buffer)]
+
 	// Fill the buffer until it has enough characters.
 	first := true
 	for parser.unread < length {
@@ -128,6 +131,7 @@
 		// Fill the raw buffer if necessary.
 		if !first || parser.raw_buffer_pos == len(parser.raw_buffer) {
 			if !yaml_parser_update_raw_buffer(parser) {
+				parser.buffer = parser.buffer[:buffer_len]
 				return false
 			}
 		}
@@ -349,41 +353,39 @@
 			parser.raw_buffer_pos += width
 			parser.offset += width
 
-			pos := len(parser.buffer)
-			parser.buffer = parser.buffer[:pos+width]
-
 			// Finally put the character into the buffer.
 			if value <= 0x7F {
 				// 0000 0000-0000 007F . 0xxxxxxx
-				parser.buffer[pos+0] = byte(value)
+				parser.buffer[buffer_len+0] = byte(value)
 			} else if value <= 0x7FF {
 				// 0000 0080-0000 07FF . 110xxxxx 10xxxxxx
-				parser.buffer[pos+0] = byte(0xC0 + (value >> 6))
-				parser.buffer[pos+1] = byte(0x80 + (value & 0x3F))
+				parser.buffer[buffer_len+0] = byte(0xC0 + (value >> 6))
+				parser.buffer[buffer_len+1] = byte(0x80 + (value & 0x3F))
 			} else if value <= 0xFFFF {
 				// 0000 0800-0000 FFFF . 1110xxxx 10xxxxxx 10xxxxxx
-				parser.buffer[pos+0] = byte(0xE0 + (value >> 12))
-				parser.buffer[pos+1] = byte(0x80 + ((value >> 6) & 0x3F))
-				parser.buffer[pos+2] = byte(0x80 + (value & 0x3F))
+				parser.buffer[buffer_len+0] = byte(0xE0 + (value >> 12))
+				parser.buffer[buffer_len+1] = byte(0x80 + ((value >> 6) & 0x3F))
+				parser.buffer[buffer_len+2] = byte(0x80 + (value & 0x3F))
 			} else {
 				// 0001 0000-0010 FFFF . 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
-				parser.buffer[pos+0] = byte(0xF0 + (value >> 18))
-				parser.buffer[pos+1] = byte(0x80 + ((value >> 12) & 0x3F))
-				parser.buffer[pos+2] = byte(0x80 + ((value >> 6) & 0x3F))
-				parser.buffer[pos+3] = byte(0x80 + (value & 0x3F))
+				parser.buffer[buffer_len+0] = byte(0xF0 + (value >> 18))
+				parser.buffer[buffer_len+1] = byte(0x80 + ((value >> 12) & 0x3F))
+				parser.buffer[buffer_len+2] = byte(0x80 + ((value >> 6) & 0x3F))
+				parser.buffer[buffer_len+3] = byte(0x80 + (value & 0x3F))
 			}
+			buffer_len += width
 
 			parser.unread++
 		}
 
 		// On EOF, put NUL into the buffer and return.
 		if parser.eof {
-			parser.buffer = parser.buffer[:len(parser.buffer)+1]
-			parser.buffer[len(parser.buffer)-1] = 0x00
+			parser.buffer[buffer_len] = 0
+			buffer_len++
 			parser.unread++
-			return true
+			break
 		}
 	}
-
+	parser.buffer = parser.buffer[:buffer_len]
 	return true
 }