pgwin32_open.patch

application/octet-stream

Filename: pgwin32_open.patch
Type: application/octet-stream
Part: 0
Message: Re: Bug with PATHs having non-ASCII characters

Patch

Same data as JSON: GET /api/v1/attachments/:id/patch the parsed metadata as JSON — format, series position, per-file stats; never the diff bytes. API reference →
Format: context
File+
src/port/open.c 51 13
diff -cprN head/src/port/open.c eventlog/src/port/open.c
*** head/src/port/open.c	2009-06-11 23:49:15.000000000 +0900
--- eventlog/src/port/open.c	2009-09-15 12:31:24.556451161 +0900
***************
*** 23,28 ****
--- 23,31 ----
  #include <fcntl.h>
  #include <assert.h>
  
+ #ifndef FRONTEND
+ #include "mb/pg_wchar.h"
+ #endif
  
  static int
  openFlagsToCreateFileFlags(int openFlags)
*************** pgwin32_open(const char *fileName, int f
*** 65,70 ****
--- 68,78 ----
  	HANDLE		h = INVALID_HANDLE_VALUE;
  	SECURITY_ATTRIBUTES sa;
  	int			loops = 0;
+ 	DWORD		dwDesiredAccess;
+ 	DWORD		dwShareMode;
+ 	DWORD		dwCreationDisposition;
+ 	DWORD		dwFlagsAndAttributes;
+ 	WCHAR	   *wFileName = NULL;
  
  	/* Check that we can handle the request */
  	assert((fileFlags & ((O_RDONLY | O_WRONLY | O_RDWR) | O_APPEND |
*************** pgwin32_open(const char *fileName, int f
*** 72,97 ****
  						 _O_SHORT_LIVED | O_DSYNC | O_DIRECT |
  		  (O_CREAT | O_TRUNC | O_EXCL) | (O_TEXT | O_BINARY))) == fileFlags);
  
- 	sa.nLength = sizeof(sa);
- 	sa.bInheritHandle = TRUE;
- 	sa.lpSecurityDescriptor = NULL;
- 
- 	while ((h = CreateFile(fileName,
  	/* cannot use O_RDONLY, as it == 0 */
! 					  (fileFlags & O_RDWR) ? (GENERIC_WRITE | GENERIC_READ) :
! 					 ((fileFlags & O_WRONLY) ? GENERIC_WRITE : GENERIC_READ),
  	/* These flags allow concurrent rename/unlink */
! 					(FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE),
! 						   &sa,
! 						   openFlagsToCreateFileFlags(fileFlags),
! 						   FILE_ATTRIBUTE_NORMAL |
  					 ((fileFlags & O_RANDOM) ? FILE_FLAG_RANDOM_ACCESS : 0) |
  			   ((fileFlags & O_SEQUENTIAL) ? FILE_FLAG_SEQUENTIAL_SCAN : 0) |
  			  ((fileFlags & _O_SHORT_LIVED) ? FILE_ATTRIBUTE_TEMPORARY : 0) |
  				((fileFlags & O_TEMPORARY) ? FILE_FLAG_DELETE_ON_CLOSE : 0) |
  					  ((fileFlags & O_DIRECT) ? FILE_FLAG_NO_BUFFERING : 0) |
! 					   ((fileFlags & O_DSYNC) ? FILE_FLAG_WRITE_THROUGH : 0),
! 						   NULL)) == INVALID_HANDLE_VALUE)
  	{
  		/*
  		 * Sharing violation or locking error can indicate antivirus, backup
--- 80,126 ----
  						 _O_SHORT_LIVED | O_DSYNC | O_DIRECT |
  		  (O_CREAT | O_TRUNC | O_EXCL) | (O_TEXT | O_BINARY))) == fileFlags);
  
  	/* cannot use O_RDONLY, as it == 0 */
! 	dwDesiredAccess = (fileFlags & O_RDWR) ? (GENERIC_WRITE | GENERIC_READ) :
! 						((fileFlags & O_WRONLY) ? GENERIC_WRITE : GENERIC_READ);
  	/* These flags allow concurrent rename/unlink */
! 	dwShareMode = (FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE);
!     dwCreationDisposition = openFlagsToCreateFileFlags(fileFlags);
!     dwFlagsAndAttributes = FILE_ATTRIBUTE_NORMAL |
  					 ((fileFlags & O_RANDOM) ? FILE_FLAG_RANDOM_ACCESS : 0) |
  			   ((fileFlags & O_SEQUENTIAL) ? FILE_FLAG_SEQUENTIAL_SCAN : 0) |
  			  ((fileFlags & _O_SHORT_LIVED) ? FILE_ATTRIBUTE_TEMPORARY : 0) |
  				((fileFlags & O_TEMPORARY) ? FILE_FLAG_DELETE_ON_CLOSE : 0) |
  					  ((fileFlags & O_DIRECT) ? FILE_FLAG_NO_BUFFERING : 0) |
! 					   ((fileFlags & O_DSYNC) ? FILE_FLAG_WRITE_THROUGH : 0);
! 
! 	sa.nLength = sizeof(sa);
! 	sa.bInheritHandle = TRUE;
! 	sa.lpSecurityDescriptor = NULL;
! 
! #ifndef FRONTEND
! 	/*
! 	 * Use wide-character file name only if the database encoding doesn't match
! 	 * to the platform encoding and the path contains any multi-byte characters.
! 	 */
! 	if (GetDatabaseEncoding() != GetPlatformEncoding())
! 	{
! 		int		len;
! 		bool	hasMBChar = false;
! 
! 		for (len = 0; fileName[len]; len++)
! 			hasMBChar |= IS_HIGHBIT_SET(fileName[len]);
! 		if (hasMBChar)
! 			wFileName = pgwin32_toUTF16(fileName, len, NULL);
! 	}
! #endif
! 
! 	while ((h = (wFileName != NULL
! 				? CreateFileW(wFileName, dwDesiredAccess, dwShareMode, &sa,
! 						dwCreationDisposition, dwFlagsAndAttributes, NULL)
! 				: CreateFileA(fileName, dwDesiredAccess, dwShareMode, &sa,
! 						dwCreationDisposition, dwFlagsAndAttributes, NULL))
! 		   ) == INVALID_HANDLE_VALUE)
  	{
  		/*
  		 * Sharing violation or locking error can indicate antivirus, backup
*************** pgwin32_open(const char *fileName, int f
*** 119,128 ****
--- 148,166 ----
  				continue;
  		}
  
+ #ifndef FRONTEND
+ 		if (wFileName)
+ 			pfree(wFileName);
+ #endif
  		_dosmaperr(err);
  		return -1;
  	}
  
+ #ifndef FRONTEND
+ 	if (wFileName)
+ 		pfree(wFileName);
+ #endif
+ 
  	/* _open_osfhandle will, on error, set errno accordingly */
  	if ((fd = _open_osfhandle((long) h, fileFlags & O_APPEND)) < 0)
  		CloseHandle(h);			/* will not affect errno */