* fhandler.cc (fhandler_base::open): Drop local wpath and upath

variables.  Call pc.get_object_attr to create object attributes.
	* fhandler_disk_file.cc (fhandler_disk_file::opendir): Ditto.
	* syscalls.cc (unlink_nt): Ditto.
	* path.cc (path_conv::set_normalized_path): Set wide_path to NULL.
	(path_conv::get_nt_native_path): Drop parameter.  Create path in
	wide_path/uni_path members.
	(path_conv::get_object_attr): New method to create object attributes.
	(path_conv::get_wide_win32_path): New method to create Win32 wide path.
	(path_conv::check): Initialize wide_path to NULL.
	(path_conv::~path_conv): cfree wide_path.
	* path.h (class path_conv): New members wide_path and uni_path.
	Add declarations of get_object_attr and get_wide_win32_path.
	(path_conv::path_conv): Initialize wide_path to NULL.
	(path_conv::get_nt_native_path): Drop parameter.
This commit is contained in:
Corinna Vinschen 2007-07-19 11:41:17 +00:00
parent b0ff8192ad
commit 91d2f6eebf
6 changed files with 74 additions and 24 deletions

View File

@ -1,3 +1,21 @@
2007-07-19 Corinna Vinschen <corinna@vinschen.de>
* fhandler.cc (fhandler_base::open): Drop local wpath and upath
variables. Call pc.get_object_attr to create object attributes.
* fhandler_disk_file.cc (fhandler_disk_file::opendir): Ditto.
* syscalls.cc (unlink_nt): Ditto.
* path.cc (path_conv::set_normalized_path): Set wide_path to NULL.
(path_conv::get_nt_native_path): Drop parameter. Create path in
wide_path/uni_path members.
(path_conv::get_object_attr): New method to create object attributes.
(path_conv::get_wide_win32_path): New method to create Win32 wide path.
(path_conv::check): Initialize wide_path to NULL.
(path_conv::~path_conv): cfree wide_path.
* path.h (class path_conv): New members wide_path and uni_path.
Add declarations of get_object_attr and get_wide_win32_path.
(path_conv::path_conv): Initialize wide_path to NULL.
(path_conv::get_nt_native_path): Drop parameter.
2007-07-19 Corinna Vinschen <corinna@vinschen.de>
* sec_helper.cc: Remove unused code.

View File

@ -457,10 +457,6 @@ done:
int
fhandler_base::open (int flags, mode_t mode)
{
WCHAR wpath[CYG_MAX_PATH + 10];
UNICODE_STRING upath = {0, sizeof (wpath), wpath};
pc.get_nt_native_path (upath);
int res = 0;
HANDLE x;
ULONG file_attributes = 0;
@ -475,8 +471,7 @@ fhandler_base::open (int flags, mode_t mode)
syscall_printf ("(%s, %p)", get_win32_name (), flags);
InitializeObjectAttributes (&attr, &upath, OBJ_CASE_INSENSITIVE | OBJ_INHERIT,
NULL, sa.lpSecurityDescriptor);
pc.get_object_attr (attr, sa);
switch (query_open ())
{

View File

@ -1575,16 +1575,11 @@ fhandler_disk_file::opendir (int fd)
OBJECT_ATTRIBUTES attr;
NTSTATUS status;
IO_STATUS_BLOCK io;
WCHAR wpath[CYG_MAX_PATH + 10] = { 0 };
UNICODE_STRING upath = {0, sizeof (wpath), wpath};
SECURITY_ATTRIBUTES sa = sec_none;
pc.get_nt_native_path (upath);
InitializeObjectAttributes (&attr, &upath, OBJ_CASE_INSENSITIVE,
NULL, sa.lpSecurityDescriptor);
status = NtOpenFile (&get_handle (),
SYNCHRONIZE | FILE_LIST_DIRECTORY,
&attr, &io, FILE_SHARE_VALID_FLAGS,
pc.get_object_attr (attr, sec_none_nih),
&io, FILE_SHARE_VALID_FLAGS,
FILE_SYNCHRONOUS_IO_NONALERT
| FILE_OPEN_FOR_BACKUP_INTENT
| FILE_DIRECTORY_FILE);

View File

@ -79,6 +79,7 @@ details. */
#include "environ.h"
#include <assert.h>
#include <ntdll.h>
#include <wchar.h>
bool dos_file_warning = true;
static int normalize_win32_path (const char *, char *, char *&);
@ -539,6 +540,7 @@ path_conv::set_normalized_path (const char *path_copy, bool strip_tail)
}
memcpy (normalized_path, path_copy, n);
wide_path = NULL;
}
PUNICODE_STRING
@ -566,9 +568,40 @@ get_nt_native_path (const char *path, UNICODE_STRING &upath)
}
PUNICODE_STRING
path_conv::get_nt_native_path (UNICODE_STRING &upath)
path_conv::get_nt_native_path ()
{
return ::get_nt_native_path (path, upath);
if (!wide_path)
{
uni_path.Length = 0;
uni_path.MaximumLength = (strlen (path) + 10) * sizeof (WCHAR);
wide_path = (PWCHAR) cmalloc (HEAP_STR, uni_path.MaximumLength);
uni_path.Buffer = wide_path;
::get_nt_native_path (path, uni_path);
}
return &uni_path;
}
POBJECT_ATTRIBUTES
path_conv::get_object_attr (OBJECT_ATTRIBUTES &attr, SECURITY_ATTRIBUTES &sa)
{
if (!get_nt_native_path ())
return NULL;
InitializeObjectAttributes (&attr, &uni_path,
OBJ_CASE_INSENSITIVE
| (sa.bInheritHandle ? OBJ_INHERIT : 0),
NULL, sa.lpSecurityDescriptor);
return &attr;
}
PWCHAR
path_conv::get_wide_win32_path (PWCHAR wc)
{
get_nt_native_path ();
if (!wide_path || wide_path[1] != L'?') /* Native NT device path */
return NULL;
wcscpy (wc, wide_path);
wc[1] = L'\\';
return wc;
}
void
@ -640,6 +673,7 @@ path_conv::check (const char *src, unsigned opt,
path_flags = 0;
known_suffix = NULL;
fileattr = INVALID_FILE_ATTRIBUTES;
wide_path = NULL;
case_clash = false;
memset (&dev, 0, sizeof (dev));
fs.clear ();
@ -1147,6 +1181,11 @@ path_conv::~path_conv ()
cfree (normalized_path);
normalized_path = NULL;
}
if (wide_path)
{
cfree (wide_path);
wide_path = NULL;
}
}
/* Return true if src_path is a valid, internally supported device name.

View File

@ -156,6 +156,8 @@ class path_conv
{
DWORD fileattr;
fs_info fs;
PWCHAR wide_path;
UNICODE_STRING uni_path;
void add_ext_from_sym (symlink_info&);
public:
@ -236,7 +238,8 @@ class path_conv
const suffix_info *suffixes = NULL) __attribute__ ((regparm(3)));
path_conv (const device& in_dev): fileattr (INVALID_FILE_ATTRIBUTES),
path_flags (0), known_suffix (NULL), error (0), dev (in_dev)
wide_path (NULL), path_flags (0), known_suffix (NULL), error (0),
dev (in_dev)
{
strcpy (path, in_dev.native);
}
@ -253,14 +256,18 @@ class path_conv
check (src, opt | PC_NULLEMPTY, suffixes);
}
path_conv (): fileattr (INVALID_FILE_ATTRIBUTES), path_flags (0),
known_suffix (NULL), error (0), normalized_path (NULL)
path_conv (): fileattr (INVALID_FILE_ATTRIBUTES), wide_path (NULL),
path_flags (0), known_suffix (NULL), error (0),
normalized_path (NULL)
{path[0] = '\0';}
~path_conv ();
void set_name (const char *win32, const char *posix);
inline char *get_win32 () { return path; }
PUNICODE_STRING get_nt_native_path (UNICODE_STRING &upath);
PUNICODE_STRING get_nt_native_path ();
POBJECT_ATTRIBUTES get_object_attr (OBJECT_ATTRIBUTES &attr,
SECURITY_ATTRIBUTES &sa);
PWCHAR get_wide_win32_path (PWCHAR wc);
operator char *() {return path;}
operator const char *() {return path;}
operator DWORD &() {return fileattr;}

View File

@ -234,8 +234,6 @@ try_to_bin (path_conv &win32_path, HANDLE h)
DWORD
unlink_nt (path_conv &win32_name, bool setattrs)
{
WCHAR wpath[CYG_MAX_PATH + 10];
UNICODE_STRING upath = {0, sizeof (wpath), wpath};
OBJECT_ATTRIBUTES attr;
IO_STATUS_BLOCK io;
NTSTATUS status;
@ -269,9 +267,7 @@ unlink_nt (path_conv &win32_name, bool setattrs)
if (win32_name.is_rep_symlink ())
flags |= FILE_OPEN_REPARSE_POINT;
win32_name.get_nt_native_path (upath);
InitializeObjectAttributes (&attr, &upath, OBJ_CASE_INSENSITIVE | OBJ_INHERIT,
NULL, sec_none_nih.lpSecurityDescriptor);
win32_name.get_object_attr (attr, sec_none_nih);
/* First try to open the file with sharing not allowed. If the file
has an open handle on it, this will fail. That indicates that the
file has to be moved to the recycle bin so that it actually disappears