make mappings linked list in order rather than reverse order.
Signed-off-by: Jeremy Drake <[email protected]>
---
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