Cygwin: pipes: call nt_create with handle references
...to avoid potential pointer mishandling. Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
This commit is contained in:
		
							parent
							
								
									8653eb1df3
								
							
						
					
					
						commit
						ea9c0bbedc
					
				| 
						 | 
				
			
			@ -660,7 +660,7 @@ fhandler_pipe::create (LPSECURITY_ATTRIBUTES sa_ptr, PHANDLE r, PHANDLE w,
 | 
			
		|||
   simplicity, nt_create will omit the 'open_mode' and 'name'
 | 
			
		||||
   parameters, which aren't needed for our purposes.  */
 | 
			
		||||
 | 
			
		||||
static int nt_create (LPSECURITY_ATTRIBUTES, PHANDLE, PHANDLE, DWORD,
 | 
			
		||||
static int nt_create (LPSECURITY_ATTRIBUTES, HANDLE &, HANDLE &, DWORD,
 | 
			
		||||
		      int64_t *);
 | 
			
		||||
 | 
			
		||||
int
 | 
			
		||||
| 
						 | 
				
			
			@ -671,7 +671,7 @@ fhandler_pipe::create (fhandler_pipe *fhs[2], unsigned psize, int mode)
 | 
			
		|||
  int res = -1;
 | 
			
		||||
  int64_t unique_id;
 | 
			
		||||
 | 
			
		||||
  int ret = nt_create (sa, &r, &w, psize, &unique_id);
 | 
			
		||||
  int ret = nt_create (sa, r, w, psize, &unique_id);
 | 
			
		||||
  if (ret)
 | 
			
		||||
    __seterrno_from_win_error (ret);
 | 
			
		||||
  else if ((fhs[0] = (fhandler_pipe *) build_fh_dev (*piper_dev)) == NULL)
 | 
			
		||||
| 
						 | 
				
			
			@ -718,7 +718,7 @@ fhandler_pipe::create (fhandler_pipe *fhs[2], unsigned psize, int mode)
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
static int
 | 
			
		||||
nt_create (LPSECURITY_ATTRIBUTES sa_ptr, PHANDLE r, PHANDLE w,
 | 
			
		||||
nt_create (LPSECURITY_ATTRIBUTES sa_ptr, HANDLE &r, HANDLE &w,
 | 
			
		||||
		DWORD psize, int64_t *unique_id)
 | 
			
		||||
{
 | 
			
		||||
  NTSTATUS status;
 | 
			
		||||
| 
						 | 
				
			
			@ -729,10 +729,8 @@ nt_create (LPSECURITY_ATTRIBUTES sa_ptr, PHANDLE r, PHANDLE w,
 | 
			
		|||
  LARGE_INTEGER timeout;
 | 
			
		||||
 | 
			
		||||
  /* Default to error. */
 | 
			
		||||
  if (r)
 | 
			
		||||
    *r = NULL;
 | 
			
		||||
  if (w)
 | 
			
		||||
    *w = NULL;
 | 
			
		||||
  r = NULL;
 | 
			
		||||
  w = NULL;
 | 
			
		||||
 | 
			
		||||
  status = fhandler_base::npfs_handle (npfsh);
 | 
			
		||||
  if (!NT_SUCCESS (status))
 | 
			
		||||
| 
						 | 
				
			
			@ -760,7 +758,7 @@ nt_create (LPSECURITY_ATTRIBUTES sa_ptr, PHANDLE r, PHANDLE w,
 | 
			
		|||
     Retrying will probably never be necessary, but we want
 | 
			
		||||
     to be as robust as possible.  */
 | 
			
		||||
  DWORD err = 0;
 | 
			
		||||
  while (r && !*r)
 | 
			
		||||
  while (!r)
 | 
			
		||||
    {
 | 
			
		||||
      static volatile ULONG pipe_unique_id;
 | 
			
		||||
      LONG id = InterlockedIncrement ((LONG *) &pipe_unique_id);
 | 
			
		||||
| 
						 | 
				
			
			@ -779,7 +777,7 @@ nt_create (LPSECURITY_ATTRIBUTES sa_ptr, PHANDLE r, PHANDLE w,
 | 
			
		|||
				  npfsh, sa_ptr->lpSecurityDescriptor);
 | 
			
		||||
 | 
			
		||||
      timeout.QuadPart = -500000;
 | 
			
		||||
      status = NtCreateNamedPipeFile (r, access, &attr, &io,
 | 
			
		||||
      status = NtCreateNamedPipeFile (&r, access, &attr, &io,
 | 
			
		||||
				      FILE_SHARE_READ | FILE_SHARE_WRITE,
 | 
			
		||||
				      FILE_CREATE, 0, pipe_type,
 | 
			
		||||
				      FILE_PIPE_BYTE_STREAM_MODE,
 | 
			
		||||
| 
						 | 
				
			
			@ -787,7 +785,7 @@ nt_create (LPSECURITY_ATTRIBUTES sa_ptr, PHANDLE r, PHANDLE w,
 | 
			
		|||
 | 
			
		||||
      if (NT_SUCCESS (status))
 | 
			
		||||
	{
 | 
			
		||||
	  debug_printf ("pipe read handle %p", *r);
 | 
			
		||||
	  debug_printf ("pipe read handle %p", r);
 | 
			
		||||
	  err = 0;
 | 
			
		||||
	  break;
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -800,49 +798,42 @@ nt_create (LPSECURITY_ATTRIBUTES sa_ptr, PHANDLE r, PHANDLE w,
 | 
			
		|||
	  /* The pipe is already open with compatible parameters.
 | 
			
		||||
	     Pick a new name and retry.  */
 | 
			
		||||
	  debug_printf ("pipe busy, retrying");
 | 
			
		||||
	  *r = NULL;
 | 
			
		||||
	  r = NULL;
 | 
			
		||||
	  break;
 | 
			
		||||
	case STATUS_ACCESS_DENIED:
 | 
			
		||||
	  /* The pipe is already open with incompatible parameters.
 | 
			
		||||
	     Pick a new name and retry.  */
 | 
			
		||||
	  debug_printf ("pipe access denied, retrying");
 | 
			
		||||
	  *r = NULL;
 | 
			
		||||
	  r = NULL;
 | 
			
		||||
	  break;
 | 
			
		||||
	default:
 | 
			
		||||
	  {
 | 
			
		||||
	    __seterrno_from_nt_status (status);
 | 
			
		||||
	    err = GetLastError ();
 | 
			
		||||
	    debug_printf ("failed, %E");
 | 
			
		||||
	    *r = INVALID_HANDLE_VALUE;
 | 
			
		||||
	    r = INVALID_HANDLE_VALUE;
 | 
			
		||||
	  }
 | 
			
		||||
	}
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  if (err)
 | 
			
		||||
    {
 | 
			
		||||
      *r = NULL;
 | 
			
		||||
      r = NULL;
 | 
			
		||||
      return err;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  if (!w)
 | 
			
		||||
    debug_printf ("pipe write handle NULL");
 | 
			
		||||
  else
 | 
			
		||||
  debug_printf ("NtOpenFile: name %S", &pipename);
 | 
			
		||||
 | 
			
		||||
  access = GENERIC_WRITE | FILE_READ_ATTRIBUTES | SYNCHRONIZE;
 | 
			
		||||
  status = NtOpenFile (&w, access, &attr, &io, 0, 0);
 | 
			
		||||
  if (!NT_SUCCESS (status))
 | 
			
		||||
    {
 | 
			
		||||
      debug_printf ("NtOpenFile: name %S", &pipename);
 | 
			
		||||
 | 
			
		||||
      access = GENERIC_WRITE | FILE_READ_ATTRIBUTES | SYNCHRONIZE;
 | 
			
		||||
      status = NtOpenFile (w, access, &attr, &io, 0, 0);
 | 
			
		||||
      if (!NT_SUCCESS (status))
 | 
			
		||||
	{
 | 
			
		||||
	  DWORD err = GetLastError ();
 | 
			
		||||
	  debug_printf ("NtOpenFile failed, r %p, %E", r);
 | 
			
		||||
	  if (r)
 | 
			
		||||
	    NtClose (*r);
 | 
			
		||||
	  *w = NULL;
 | 
			
		||||
	  return err;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
      debug_printf ("pipe write handle %p", *w);
 | 
			
		||||
      DWORD err = GetLastError ();
 | 
			
		||||
      debug_printf ("NtOpenFile failed, r %p, %E", r);
 | 
			
		||||
      if (r)
 | 
			
		||||
	NtClose (r);
 | 
			
		||||
      w = NULL;
 | 
			
		||||
      return err;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  /* Success. */
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue