Make ntpath compress multiple slashes between drive letter and the rest of the
path.  Also clarifies UNC handling and adds appropriate tests.

Applies patch #988607 to fix bug #980327.  Thanks Paul Moore.
diff --git a/Lib/ntpath.py b/Lib/ntpath.py
index 549c35e..1f355ec 100644
--- a/Lib/ntpath.py
+++ b/Lib/ntpath.py
@@ -440,9 +440,25 @@
     """Normalize path, eliminating double slashes, etc."""
     path = path.replace("/", "\\")
     prefix, path = splitdrive(path)
-    while path[:1] == "\\":
-        prefix = prefix + "\\"
-        path = path[1:]
+    # We need to be careful here. If the prefix is empty, and the path starts
+    # with a backslash, it could either be an absolute path on the current
+    # drive (\dir1\dir2\file) or a UNC filename (\\server\mount\dir1\file). It
+    # is therefore imperative NOT to collapse multiple backslashes blindly in
+    # that case.
+    # The code below preserves multiple backslashes when there is no drive
+    # letter. This means that the invalid filename \\\a\b is preserved
+    # unchanged, where a\\\b is normalised to a\b. It's not clear that there
+    # is any better behaviour for such edge cases.
+    if prefix == '':
+        # No drive letter - preserve initial backslashes
+        while path[:1] == "\\":
+            prefix = prefix + "\\"
+            path = path[1:]
+    else:
+        # We have a drive letter - collapse initial backslashes
+        if path.startswith("\\"):
+            prefix = prefix + "\\"
+            path = path.lstrip("\\")
     comps = path.split("\\")
     i = 0
     while i < len(comps):
diff --git a/Lib/test/test_ntpath.py b/Lib/test/test_ntpath.py
index fdb431a..139aa1f 100644
--- a/Lib/test/test_ntpath.py
+++ b/Lib/test/test_ntpath.py
@@ -99,12 +99,9 @@
 tester("ntpath.normpath('D:A/./B')", r'D:A\B')
 tester("ntpath.normpath('e:A/foo/../B')", r'e:A\B')
 
-# Next 3 seem dubious, and especially the 3rd, but normpath is possibly
-# trying to leave UNC paths alone without actually knowing anything about
-# them.
-tester("ntpath.normpath('C:///A//B')", r'C:\\\A\B')
-tester("ntpath.normpath('D:///A/./B')", r'D:\\\A\B')
-tester("ntpath.normpath('e:///A/foo/../B')", r'e:\\\A\B')
+tester("ntpath.normpath('C:///A//B')", r'C:\A\B')
+tester("ntpath.normpath('D:///A/./B')", r'D:\A\B')
+tester("ntpath.normpath('e:///A/foo/../B')", r'e:\A\B')
 
 tester("ntpath.normpath('..')", r'..')
 tester("ntpath.normpath('.')", r'.')
@@ -115,6 +112,8 @@
 tester("ntpath.normpath('c:/../../..')", 'c:\\')
 tester("ntpath.normpath('../.././..')", r'..\..\..')
 tester("ntpath.normpath('K:../.././..')", r'K:..\..\..')
+tester("ntpath.normpath('C:////a/b')", r'C:\a\b')
+tester("ntpath.normpath('//machine/share//a/b')", r'\\machine\share\a\b')
 
 # ntpath.abspath() can only be used on a system with the "nt" module
 # (reasonably), so we protect this test with "import nt".  This allows