* fhandler.h (fhandler_cygdrive:DRVSZ): New enum.

(pdrive_buf): New place to hold information about cygdrive.
* fhandler_disk_file.cc (fhandler_cygdrive::set_drives): Store drive info in
pdrive_buf since get_win32_name() could now be too small to hold everything.
(fhandler_cygdrive::rewinddir): Reset pdrive to pdrive_buf.
(fhandler_cygdrive::closedir): Ditto.
* pipe.cc (fhandler_pipe::init): Be more defensive when referencing
get_win32_name().  Rework logic which made a copy of the POSIX path and then
never used it.
This commit is contained in:
Christopher Faylor 2009-08-04 04:20:36 +00:00
parent ff7b364c12
commit 824d851859
8 changed files with 35 additions and 18 deletions

View File

@ -1,3 +1,16 @@
2009-08-04 Christopher Faylor <me+cygwin@cgf.cx>
* fhandler.h (fhandler_cygdrive:DRVSZ): New enum.
(pdrive_buf): New place to hold information about cygdrive.
* fhandler_disk_file.cc (fhandler_cygdrive::set_drives): Store drive
info in pdrive_buf since get_win32_name() could now be too small to
hold everything.
(fhandler_cygdrive::rewinddir): Reset pdrive to pdrive_buf.
(fhandler_cygdrive::closedir): Ditto.
* pipe.cc (fhandler_pipe::init): Be more defensive when referencing
get_win32_name(). Rework logic which made a copy of the POSIX path and
then never used it.
2009-08-02 Christopher Faylor <me+cygwin@cgf.cx> 2009-08-02 Christopher Faylor <me+cygwin@cgf.cx>
* sigproc.cc (stopped_or_terminated): Don't return a match when stopsig * sigproc.cc (stopped_or_terminated): Don't return a match when stopsig

View File

@ -89,7 +89,7 @@ __cxa_guard_release ()
/* These routines are made available as last-resort fallbacks /* These routines are made available as last-resort fallbacks
for the application. Should not be used in practice. */ for the application. Should not be used in practice. */
struct per_process_cxx_malloc default_cygwin_cxx_malloc = struct per_process_cxx_malloc default_cygwin_cxx_malloc =
{ {
&(operator new), &(operator new),
&(operator new[]), &(operator new[]),

View File

@ -994,7 +994,7 @@ extern "C" void
__main (void) __main (void)
{ {
/* Ordering is critical here. DLL ctors have already been /* Ordering is critical here. DLL ctors have already been
run as they were being loaded, so we should stack the run as they were being loaded, so we should stack the
queued call to DLL dtors now. */ queued call to DLL dtors now. */
atexit (dll_global_dtors); atexit (dll_global_dtors);
do_global_ctors (user_data->ctors, false); do_global_ctors (user_data->ctors, false);

View File

@ -753,8 +753,13 @@ class fhandler_disk_file: public fhandler_base
class fhandler_cygdrive: public fhandler_disk_file class fhandler_cygdrive: public fhandler_disk_file
{ {
enum
{
DRVSZ = sizeof ("x:\\")
};
int ndrives; int ndrives;
const char *pdrive; const char *pdrive;
char pdrive_buf[2 * 26 * DRVSZ];
void set_drives (); void set_drives ();
public: public:
fhandler_cygdrive (); fhandler_cygdrive ();

View File

@ -2123,14 +2123,11 @@ fhandler_cygdrive::close ()
return 0; return 0;
} }
#define DRVSZ sizeof ("x:\\")
void void
fhandler_cygdrive::set_drives () fhandler_cygdrive::set_drives ()
{ {
const int len = 2 + 26 * DRVSZ; pdrive = pdrive_buf;
char *p = const_cast<char *> (get_win32_name ()); ndrives = GetLogicalDriveStrings (sizeof pdrive_buf, pdrive_buf) / DRVSZ;
pdrive = p;
ndrives = GetLogicalDriveStrings (len, p) / DRVSZ;
} }
int int
@ -2146,7 +2143,7 @@ fhandler_cygdrive::fstat (struct __stat64 *buf)
for (const char *p = pdrive; p && *p; p = strchr (p, '\0') + 1) for (const char *p = pdrive; p && *p; p = strchr (p, '\0') + 1)
if (is_floppy ((flptst[0] = *p, flptst)) if (is_floppy ((flptst[0] = *p, flptst))
|| GetFileAttributes (p) == INVALID_FILE_ATTRIBUTES) || GetFileAttributes (p) == INVALID_FILE_ATTRIBUTES)
--n; n--;
buf->st_nlink = n + 2; buf->st_nlink = n + 2;
return 0; return 0;
} }
@ -2198,13 +2195,13 @@ fhandler_cygdrive::readdir (DIR *dir, dirent *de)
void void
fhandler_cygdrive::rewinddir (DIR *dir) fhandler_cygdrive::rewinddir (DIR *dir)
{ {
pdrive = get_win32_name (); pdrive = pdrive_buf;
dir->__d_position = 0; dir->__d_position = 0;
} }
int int
fhandler_cygdrive::closedir (DIR *dir) fhandler_cygdrive::closedir (DIR *dir)
{ {
pdrive = get_win32_name (); pdrive = pdrive_buf;
return 0; return 0;
} }

View File

@ -76,13 +76,13 @@ operator new[](std::size_t sz, const std::nothrow_t &nt) throw()
return (*user_data->cxx_malloc->oper_new___nt) (sz, nt); return (*user_data->cxx_malloc->oper_new___nt) (sz, nt);
} }
extern void extern void
operator delete(void *p, const std::nothrow_t &nt) throw() operator delete(void *p, const std::nothrow_t &nt) throw()
{ {
(*user_data->cxx_malloc->oper_delete_nt) (p, nt); (*user_data->cxx_malloc->oper_delete_nt) (p, nt);
} }
extern void extern void
operator delete[](void *p, const std::nothrow_t &nt) throw() operator delete[](void *p, const std::nothrow_t &nt) throw()
{ {
(*user_data->cxx_malloc->oper_delete___nt) (p, nt); (*user_data->cxx_malloc->oper_delete___nt) (p, nt);

View File

@ -211,7 +211,7 @@ class path_conv
PWCHAR get_wide_win32_path (PWCHAR wc); PWCHAR get_wide_win32_path (PWCHAR wc);
operator DWORD &() {return fileattr;} operator DWORD &() {return fileattr;}
operator int () {return fileattr; } operator int () {return fileattr; }
path_conv &operator =(path_conv &pc) path_conv &operator =(path_conv& pc)
{ {
memcpy (this, &pc, sizeof pc); memcpy (this, &pc, sizeof pc);
path = cstrdup (pc.path); path = cstrdup (pc.path);

View File

@ -32,13 +32,15 @@ fhandler_pipe::fhandler_pipe ()
int int
fhandler_pipe::init (HANDLE f, DWORD a, mode_t mode) fhandler_pipe::init (HANDLE f, DWORD a, mode_t mode)
{ {
// FIXME: Have to clean this up someday /* FIXME: Have to clean this up someday
if (!*get_win32_name () && get_name ()) FIXME: Do we have to check for both !get_win32_name() and
!*get_win32_name()? */
if ((!get_win32_name () || !*get_win32_name ()) && get_name ())
{ {
char *d;
const char *s;
char *hold_normalized_name = (char *) alloca (strlen (get_name ()) + 1); char *hold_normalized_name = (char *) alloca (strlen (get_name ()) + 1);
strcpy (hold_normalized_name, get_name ()); for (s = get_name (), d = hold_normalized_name; *s; s++, d++)
char *s, *d;
for (s = hold_normalized_name, d = (char *) get_win32_name (); *s; s++, d++)
if (*s == '/') if (*s == '/')
*d = '\\'; *d = '\\';
else else