Bruce Momjian wrote:
> > So I think we're wasting our time to debate whether we need to support
> > non-integral off_t ... let's just apply Bruce's version and wait to
> > see if anyone has a problem before doing more work.
>
> I am concerned about one more thing. On BSD/OS, we have off_t of quad
> (8 byte), but we don't have fseeko, so this call looks questionable:
>
> if (fseeko(AH->FH, tctx->dataPos, SEEK_SET) != 0)
>
> In this case, dataPos is off_t (8 bytes), while fseek only accepts long
> in that parameter (4 bytes). When this code is hit, a file > 4 gigs
> will seek to the wrong offset, I am afraid. Also, I don't understand
> why the compiler doesn't produce a warning.
>
> I wonder if I should add a conditional test so this code is hit only if
> HAVE_FSEEKO is defined. There is alternative code for all the non-zero
> fseeks.
Here is a patch that I think fixes the problem I outlined above. If
there is no fseeko(), it will not call fseek with a non-zero offset
unless sizeof(off_t) <= sizeof(long).
--
Bruce Momjian | http://candle.pha.pa.us
[EMAIL PROTECTED] | (610) 359-1001
+ If your life is a hard drive, | 13 Roberts Road
+ Christ can be your backup. | Newtown Square, Pennsylvania 19073
Index: src/bin/pg_dump/pg_backup_custom.c
===================================================================
RCS file: /cvsroot/pgsql-server/src/bin/pg_dump/pg_backup_custom.c,v
retrieving revision 1.22
diff -c -c -r1.22 pg_backup_custom.c
*** src/bin/pg_dump/pg_backup_custom.c 22 Oct 2002 19:15:23 -0000 1.22
--- src/bin/pg_dump/pg_backup_custom.c 22 Oct 2002 21:36:30 -0000
***************
*** 431,437 ****
if (tctx->dataState == K_OFFSET_NO_DATA)
return;
! if (!ctx->hasSeek || tctx->dataState == K_OFFSET_POS_NOT_SET)
{
/* Skip over unnecessary blocks until we get the one we want. */
--- 431,441 ----
if (tctx->dataState == K_OFFSET_NO_DATA)
return;
! if (!ctx->hasSeek || tctx->dataState == K_OFFSET_POS_NOT_SET
! #if !defined(HAVE_FSEEKO)
! || sizeof(off_t) > sizeof(long)
! #endif
! )
{
/* Skip over unnecessary blocks until we get the one we want. */
***************
*** 809,815 ****
* be ok to just use the existing self-consistent block
* formatting.
*/
! if (ctx->hasSeek)
{
fseeko(AH->FH, tpos, SEEK_SET);
WriteToc(AH);
--- 813,823 ----
* be ok to just use the existing self-consistent block
* formatting.
*/
! if (ctx->hasSeek
! #if !defined(HAVE_FSEEKO)
! && sizeof(off_t) <= sizeof(long)
! #endif
! )
{
fseeko(AH->FH, tpos, SEEK_SET);
WriteToc(AH);
---------------------------(end of broadcast)---------------------------
TIP 4: Don't 'kill -9' the postmaster