From: Tom Lane <tgl@sss.pgh.pa.us>
Date: Fri, 1 Jun 2007 23:43:11 +0000 (+0000)
Subject: Fix aboriginal bug in BufFileDumpBuffer that would cause it to write the
X-Git-Tag: REL8_3_BETA1~604
X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=964ec46cfe95028ca166dd5579e07b22c7434a91;p=postgresql

Fix aboriginal bug in BufFileDumpBuffer that would cause it to write the
wrong data when dumping a bufferload that crosses a component-file boundary.
This probably has not been seen in the wild because (a) component files are
normally 1GB apiece and (b) non-block-aligned buffer usage is relatively
rare.  But it's fairly easy to reproduce a problem if one reduces RELSEG_SIZE
in a test build.  Kudos to Kurt Harriman for spotting the bug.
---

diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c
index ccaed0efa0..4f3a8a311b 100644
--- a/src/backend/storage/file/buffile.c
+++ b/src/backend/storage/file/buffile.c
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/backend/storage/file/buffile.c,v 1.25 2007/01/05 22:19:37 momjian Exp $
+ *	  $PostgreSQL: pgsql/src/backend/storage/file/buffile.c,v 1.26 2007/06/01 23:43:11 tgl Exp $
  *
  * NOTES:
  *
@@ -289,7 +289,7 @@ BufFileDumpBuffer(BufFile *file)
 				return;			/* seek failed, give up */
 			file->offsets[file->curFile] = file->curOffset;
 		}
-		bytestowrite = FileWrite(thisfile, file->buffer, bytestowrite);
+		bytestowrite = FileWrite(thisfile, file->buffer + wpos, bytestowrite);
 		if (bytestowrite <= 0)
 			return;				/* failed to write */
 		file->offsets[file->curFile] += bytestowrite;