From 9e3be5c182d71d7575aa2e63d9604bfa715a432e Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Mon, 4 Oct 2021 13:28:06 -0700 Subject: [PATCH] Fix TestLib::slurp_file() with offset on windows. 3c5b0685b921 used setFilePointer() to set the position of the filehandle, but passed the wrong filehandle, always leaving the position at 0. Instead of just fixing that, remove use of setFilePointer(), we have a perl fd at this point, so we can just use perl's seek(). Additionally, the perl filehandle wasn't closed, just the windows filehandle. Reviewed-By: Andrew Dunstan Author: Andres Freund Discussion: https://postgr.es/m/20211003173038.64mmhgxctfqn7wl6@alap3.anarazel.de Backpatch: 9.6-, like 3c5b0685b921 --- src/test/perl/TestLib.pm | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/src/test/perl/TestLib.pm b/src/test/perl/TestLib.pm index 151c7a4cce..f466def1d7 100644 --- a/src/test/perl/TestLib.pm +++ b/src/test/perl/TestLib.pm @@ -82,7 +82,7 @@ BEGIN if ($windows_os) { require Win32API::File; - Win32API::File->import(qw(createFile OsFHandleOpen CloseHandle setFilePointer)); + Win32API::File->import(qw(createFile OsFHandleOpen CloseHandle)); } } @@ -234,33 +234,33 @@ sub slurp_file my ($filename, $offset) = @_; local $/; my $contents; + my $fh; + + # On windows open file using win32 APIs, to allow us to set the + # FILE_SHARE_DELETE flag ("d" below), otherwise other accesses to the file + # may fail. if ($Config{osname} ne 'MSWin32') { - open(my $in, '<', $filename) + open($fh, '<', $filename) or die "could not read \"$filename\": $!"; - if (defined($offset)) - { - seek($in, $offset, SEEK_SET) - or die "could not seek \"$filename\": $!"; - } - $contents = <$in>; - close $in; } else { my $fHandle = createFile($filename, "r", "rwd") or die "could not open \"$filename\": $^E"; - OsFHandleOpen(my $fh = IO::Handle->new(), $fHandle, 'r') + OsFHandleOpen($fh = IO::Handle->new(), $fHandle, 'r') or die "could not read \"$filename\": $^E\n"; - if (defined($offset)) - { - setFilePointer($fh, $offset, qw(FILE_BEGIN)) - or die "could not seek \"$filename\": $^E\n"; - } - $contents = <$fh>; - CloseHandle($fHandle) - or die "could not close \"$filename\": $^E\n"; } + + if (defined($offset)) + { + seek($fh, $offset, SEEK_SET) + or die "could not seek \"$filename\": $!"; + } + + $contents = <$fh>; + close $fh; + $contents =~ s/\r\n/\n/g if $Config{osname} eq 'msys'; return $contents; }