* dtable.cc (dtable::init_std_file_from_handle): Use tmp_pathbuf to

allocate path buffer.
	(handle_to_fn): Ditto.  Allocate fnbuf big enough to get long path
	names.
This commit is contained in:
Corinna Vinschen 2008-03-11 13:17:52 +00:00
parent 6c968f611b
commit ab5d348d30
2 changed files with 23 additions and 12 deletions

View File

@ -1,3 +1,10 @@
2008-03-11 Corinna Vinschen <corinna@vinschen.de>
* dtable.cc (dtable::init_std_file_from_handle): Use tmp_pathbuf to
allocate path buffer.
(handle_to_fn): Ditto. Allocate fnbuf big enough to get long path
names.
2008-03-11 Corinna Vinschen <corinna@vinschen.de>
* path.cc (cwdstuff::set): Make sure drive_length is 0 for virtual

View File

@ -31,6 +31,7 @@ details. */
#include "fhandler.h"
#include "dtable.h"
#include "cygheap.h"
#include "tls_pbuf.h"
#include "ntdll.h"
#include "shared_info.h"
@ -268,6 +269,7 @@ dtable::init_std_file_from_handle (int fd, HANDLE handle)
DCB dcb;
unsigned bin = O_BINARY;
device dev;
tmp_pathbuf tp;
dev.devn = 0; /* FIXME: device */
first_fd_for_open = 0;
@ -300,7 +302,7 @@ dtable::init_std_file_from_handle (int fd, HANDLE handle)
dev.parse (DEV_TTYS_MAJOR, 0);
else
{
name = handle_to_fn (handle, (char *) alloca (CYG_MAX_PATH + 100));
name = handle_to_fn (handle, tp.c_get ());
if (!strncasematch (name, POSIX_NAMED_PIPE, POSIX_NAMED_PIPE_LEN))
/* nothing */;
else if (fd == 0)
@ -844,16 +846,18 @@ dtable::vfork_child_fixup ()
static const char *
handle_to_fn (HANDLE h, char *posix_fn)
{
tmp_pathbuf tp;
OBJECT_NAME_INFORMATION *ntfn;
char fnbuf[32768];
const size_t len = sizeof (OBJECT_NAME_INFORMATION)
+ NT_MAX_PATH * sizeof (WCHAR);
char *fnbuf = (char *) alloca (len);
memset (fnbuf, 0, sizeof (fnbuf));
memset (fnbuf, 0, len);
ntfn = (OBJECT_NAME_INFORMATION *) fnbuf;
ntfn->Name.MaximumLength = sizeof (fnbuf) - sizeof (*ntfn);
ntfn->Name.MaximumLength = NT_MAX_PATH * sizeof (WCHAR);
ntfn->Name.Buffer = (WCHAR *) (ntfn + 1);
NTSTATUS res = NtQueryObject (h, ObjectNameInformation, ntfn, sizeof (fnbuf),
NULL);
NTSTATUS res = NtQueryObject (h, ObjectNameInformation, ntfn, len, NULL);
if (!NT_SUCCESS (res))
{
@ -871,11 +875,11 @@ handle_to_fn (HANDLE h, char *posix_fn)
ntfn->Name.Buffer[ntfn->Name.Length / sizeof (WCHAR)] = 0;
char win32_fn[CYG_MAX_PATH + 100];
sys_wcstombs (win32_fn, CYG_MAX_PATH + 100, ntfn->Name.Buffer);
char *win32_fn = tp.c_get ();
sys_wcstombs (win32_fn, NT_MAX_PATH, ntfn->Name.Buffer);
debug_printf ("nt name '%s'", win32_fn);
if (!strncasematch (win32_fn, DEVICE_PREFIX, DEVICE_PREFIX_LEN)
|| !QueryDosDevice (NULL, fnbuf, sizeof (fnbuf)))
|| !QueryDosDevice (NULL, fnbuf, len))
return strcpy (posix_fn, win32_fn);
char *p = strechr (win32_fn + DEVICE_PREFIX_LEN, '\\');
@ -883,13 +887,13 @@ handle_to_fn (HANDLE h, char *posix_fn)
int n = p - win32_fn;
int maxmatchlen = 0;
char *maxmatchdos = NULL;
char *device = tp.c_get ();
for (char *s = fnbuf; *s; s = strchr (s, '\0') + 1)
{
char device[CYG_MAX_PATH + 10];
device[CYG_MAX_PATH + 9] = '\0';
device[NT_MAX_PATH - 1] = '\0';
if (strchr (s, ':') == NULL)
continue;
if (!QueryDosDevice (s, device, sizeof (device) - 1))
if (!QueryDosDevice (s, device, NT_MAX_PATH - 1))
continue;
char *q = strrchr (device, ';');
if (q)