make mappings linked list in order rather than reverse order. Signed-off-by: Jeremy Drake <cyg...@jdrake.com> --- winsup/cygwin/local_includes/mount.h | 11 +++++--- winsup/cygwin/mount.cc | 39 ++++++++++++++++++++-------- 2 files changed, 35 insertions(+), 15 deletions(-)
diff --git a/winsup/cygwin/local_includes/mount.h b/winsup/cygwin/local_includes/mount.h index b2acdf08b4..c96b34781e 100644 --- a/winsup/cygwin/local_includes/mount.h +++ b/winsup/cygwin/local_includes/mount.h @@ -223,12 +223,15 @@ class dos_drive_mappings struct mapping { mapping *next; - size_t doslen; size_t ntlen; - wchar_t *dospath; wchar_t *ntdevpath; - }; - mapping *mappings; + struct dosmount + { + dosmount *next; + wchar_t *path; + size_t len; + } dos; + } *mappings; public: dos_drive_mappings (); diff --git a/winsup/cygwin/mount.cc b/winsup/cygwin/mount.cc index bf26c4af3e..82ed4259f7 100644 --- a/winsup/cygwin/mount.cc +++ b/winsup/cygwin/mount.cc @@ -2009,6 +2009,7 @@ dos_drive_mappings::dos_drive_mappings () if (sh == INVALID_HANDLE_VALUE) debug_printf ("FindFirstVolumeW, %E"); else { + mapping **nextm = &mappings; do { /* Skip drives which are not mounted. */ @@ -2047,20 +2048,30 @@ dos_drive_mappings::dos_drive_mappings () mapping *m = new mapping (); if (m) { - m->dospath = wcsdup (mounts); + if ((m->dos.path = (wchar_t *) malloc (len * sizeof (WCHAR)))) + memcpy (m->dos.path, mounts, len * sizeof (WCHAR)); m->ntdevpath = wcsdup (devpath); - if (!m->dospath || !m->ntdevpath) + if (!m->dos.path || !m->ntdevpath) { - free (m->dospath); + free (m->dos.path); free (m->ntdevpath); delete m; continue; } - m->doslen = wcslen (m->dospath); - m->dospath[--m->doslen] = L'\0'; /* Drop trailing backslash */ + mapping::dosmount *dos = &m->dos; + for (wchar_t *mount = m->dos.path; + dos; + mount += dos->len + 2, + dos->next = mount[0] ? new mapping::dosmount () : NULL, + dos = dos->next) + { + dos->path = mount; + dos->len = wcslen (dos->path); + dos->path[--dos->len] = L'\0'; /* Drop trailing backslash */ + } m->ntlen = wcslen (m->ntdevpath); - m->next = mappings; - mappings = m; + *nextm = m; + nextm = &m->next; } } else @@ -2088,11 +2099,11 @@ dos_drive_mappings::fixup_if_match (wchar_t *path) { wchar_t *tmppath; - if (m->ntlen > m->doslen) - wcsncpy (path += m->ntlen - m->doslen, m->dospath, m->doslen); + if (m->ntlen > m->dos.len) + wcsncpy (path += m->ntlen - m->dos.len, m->dos.path, m->dos.len); else if ((tmppath = wcsdup (path + m->ntlen)) != NULL) { - wcpcpy (wcpcpy (path, m->dospath), tmppath); + wcpcpy (wcpcpy (path, m->dos.path), tmppath); free (tmppath); } break; @@ -2106,8 +2117,14 @@ dos_drive_mappings::~dos_drive_mappings () for (mapping *m = mappings; m; m = n) { n = m->next; - free (m->dospath); + free (m->dos.path); free (m->ntdevpath); + mapping::dosmount *dn; + for (mapping::dosmount *dm = m->dos.next; dm; dm = dn) + { + dn = dm->next; + delete dm; + } delete m; } } -- 2.47.1.windows.2